1. 程式人生 > 實用技巧 >面試常見的http問題

面試常見的http問題

1.請說一下OSI 網路分層模型是怎樣分層的?

應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層

application layer、presentation layer、session layer、transport layer、network layer、data link layer、physical layer

2.TCP/IP 網路分層模型是怎樣分層的?

應用層、傳輸層、網際層、連結層

application layer、transport layer、internet layer、link layer

3.TCP 和 UDP 區別?

TCP 和 UDP 都是傳輸層的協議,但二者有著截然不同的基因。

TCP:

  • 面向連線
  • 面向位元組流
  • 有狀態
  • 保證可靠交付
  • 具備擁塞控制
  • 點對點傳播
  • 有序

UDP:

  • 無連線
  • 面向資料報
  • 無狀態
  • 不保證可靠交付
  • 不具備擁塞控制
  • 廣播、多播
  • 無序

4.TCP 的三次握手和四次揮手簡單說一下

三次握手

  • 1.客戶端主動發起 SYN

  • 2.服務端收到並返回 SYN 以及 ACK 客戶端的 SYN

  • 3.客戶端收到服務端的 SYN 和 ACK 後,傳送 ACK 的 ACK 給服務端,服務端收到後連線建立

  • Client -> SYN -> Server

  • Server -> SYN/ACK -> Client

  • Client -> ACK -> Server

四次揮手

  • 1.客戶端傳送 FIN 給服務端

  • 2.服務端收到後傳送 ACK 給客戶端

  • 3.服務端傳送 FIN 給客戶端

  • 4.客戶端收到後,傳送 ACK 的 ACK 給服務端,服務端關閉,客戶端等待 2MSL 後關閉

  • Client -> FIN -> Server

  • Server -> ACK -> Client

  • Server -> FIN -> Client

  • Client -> ACK -> Server -> CLOSED

  • Client -> 2MSL 的時間 -> CLOSED

5.什麼是HTTP協議?

HTTP 就是超文字傳輸協議呀,它的英文是HyperText Transfer Protocol。HTTP 是一個在計算機世界裡專門在兩點之間傳輸文字、圖片、音訊、視訊等超文字資料的約定和規範。

6.你知道哪些 HTTP 的請求方法?

  • GET 獲取資源(冪等)
  • POST 新增資源
  • HEAD 獲取HEAD元資料(冪等)
  • PUT 更新資源(帶條件時冪等)
  • DELETE 刪除資源(冪等)
  • CONNECT 建立 Tunnel 隧道
  • OPTIONS 獲取伺服器支援訪問資源的方法(冪等)
  • TRACE 回顯伺服器收到的請求,可以定位問題。(有安全風險)

7.說一下你對HTTPS的瞭解

HTTPS 就是在 HTTP 和 TCP 協議中間加入了 SSL/TLS 安全套接層。

結合非對稱加密和對稱加密的各自優點,配合證書。既保證了安全性,也保證了傳輸效率。

目前應用最廣泛的是TLS1.2,實現原理如下:

  • 1.Client 傳送random1+對稱加密套件列表+非對稱加密套件列表
  • 2.Server 收到資訊, 選擇對稱加密套件+非對稱加密套件 並和 random2+證書(公鑰在證書中)一起返回
  • 3.Client 驗證證書有效性,並用random1+random2 生成 pre-master 通過伺服器公鑰加密+瀏覽器確認傳送給 Server
  • 4.Server 收到pre-master,根據約定的加密演算法對random1+random2+pre-master(解密)生成 master-secret,然後傳送伺服器確認
  • 5.Client 收到生成同樣的master-secert,對稱加密祕鑰傳輸完畢

TLS1.3則簡化了握手過程,完全握手只需要一個訊息往返,提升了效能。不僅如此,還對部分不安全的加密演算法進行了刪減。

8.你所謂的約定的加密演算法應該是 ECDHE 橢圓演算法吧?HTTP 傳輸訊息都是明文的,黑客完全可以作為中間人劫持訊息,再利用 ECDHE 演算法,這樣不就能破解金鑰了嗎?

ECDHE 演算法利用了橢圓曲線和離散對數等思想,按照當下的計算機算力,很難在短時間進行破解。且每次握手時生成的都是一對臨時的公鑰和私鑰,這樣就保證每次的金鑰對也不同。

即使大費力氣破解了一次的金鑰,之前的歷史訊息也不會受到影響,保證了前向安全。

當然,TLS 協議的安全性受限於當下最快的計算機執行速度,理論上絕對安全的是量子通訊傳遞金鑰

9.說一說你對DNS的理解?

DNS (Domain Name System)是網際網路中的重要基礎設施,負責對域名的解析工作,為了保證高可用、高併發和分散式,它設計成了樹狀的層次結構。

由根DNS伺服器、頂級域 DNS 伺服器和權威 DNS 伺服器組成。

解析順序是首先從瀏覽器快取作業系統快取以及本地 DNS 快取 (/etc/hosts)逐級查詢,然後從本地 DNS 伺服器根 DNS頂級 DNS以及權威 DNS層層遞迴查詢。

還可以基於域名在內網、外網進行負載均衡。

不過傳統的 DNS 有很多問題(解析慢、更新不及時),HTTPDNS通過客戶端 SDK 和服務端配合,直接通過 HTTP 呼叫解析 DNS 的方式,可以繞過傳統 DNS 這些缺點,實現智慧排程。

10.說一說你對 CDN 的理解?

CDN(Content Delivery Network)就是內容分發網路。

為了突破現實生活中的光速、傳輸距離等物理限制,CDN 投入了大量資金,在全球範圍內各大樞紐城市建立機房,部署大量高儲存高頻寬的節點,構建跨運營商、跨地域的專用高速傳輸網路。

其中分為中心節點、區域節點、邊緣節點等,在使用者接入網路後,首先通過全域性負載均衡(Global Sever Load Balance),簡稱 GSLB 演算法負責排程,找到離使用者最合適的節點。然後通過 HTTP 快取代理技術進行快取,快取命中就返回給使用者,否則就回源站去取。CDN 擅長快取靜態資源(圖片、音訊等),當然也支援動態內容的快取。

11.說一說你對 WebSocket 的理解?

WebSocket是一種基於 TCP 的輕量級網路通訊協議。和 HTTP/2 一樣,都是為了解決 HTTP 某些方面的缺陷而誕生的。不過解決方式略有不同,HTTP/2 針對的是“隊頭阻塞 ”,WebSocket 針對的是“請求-應答”的通訊模式。

我們知道“請求-應答”是半雙工的通訊模式,不具備伺服器推送能力。這就限制了 HTTP 在實時通訊領域的發展。雖然可以使用輪詢來不停的向伺服器傳送 HTTP 請求,但是缺點也很大,反覆的無效請求佔用了大量的頻寬和 CPU 資源。所以,WebSocket 應運而生。

WebSocket 是一個全雙工通訊協議,具備服務端主動推送的能力。本質上是對 TCP 做了一層包裝,讓它可以執行在瀏覽器環境裡。

12.HTTP 的快取策略知道嗎?

強快取

伺服器使用Cache-Control來設定快取策略,常用max-age來表示資源的有效期。

(這裡的 max-age 的時間計算起點是響應報文的建立時刻,而不是客戶端收到報文的時刻。)

(瀏覽器也可以傳送 Cache-Control 欄位,使用 max-age=0 或 no-cache 來重新整理資料)

如果想更精確的控制快取策略,還可以使用 Cache-Control 的其他屬性:

  • no-store:不允許快取 (用於秒殺頁面等變化頻率非常高的場景)
  • no-cache:可以快取,使用前必須要去服務端驗證是否過期,是否是最新版本
  • must-revalidate:如果快取不過期就可以繼續使用,過期了就必須去服務端驗證

協商快取

驗證資源是否失效就需要使用條件請求。常用的是If-Modified-SinceIf-None-Match,收到304狀態碼就可以複用快取裡的資源。

(If-None-Match 比 If-Modified-Since 優先順序更高)

驗證資源是否被修改的條件有兩個Last-modifiedETag(ETag 比 Last-modified 的精確度更高),需要預先在服務端的響應報文裡設定,配合條件請求使用。

13.HTTP 如何進行內容協商?

內容協商就是每個 URI 指向的資源可以是任何事物,可以有很多不同的表述。對於文件來說,可以有不同的語言、不同的媒體格式,並針對不同的瀏覽器提供不同的壓縮編碼。

  • 主動式內容協商
    • 客戶端在請求頭部中提出需要的表述形式,伺服器根據其來進行特定表述
  • 響應式內容協商
    • 服務端返回 300 或者 406,由客戶端選擇一種表述

協商要素

  • 質量因子q:內容的質量、可接受型別的優先順序
  • 媒體資源的 MIME 型別
  • 字元編碼 (UTF-8)
  • 內容編碼 (Accept-Encoding:gzip,deflate,br)
  • 表述語言 (Accept-Language:zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7)
  • 國際化與本地化 (i18n,l10n)

14.說一說 HTTP 的重定向

重定向是伺服器發起的跳轉,要求客戶端使用新的 URI 重新發送請求。在響應頭欄位Location中指示了要跳轉的 URI。使用Refresh欄位,還可以實現延時重定向。

301 / 302是常用的重定向狀態碼。分別代表永久性重定向臨時性重定向

除此之外還有:

  • 303:類似於 302,重定向後的請求方法改為GET方法
  • 307:類似於 302,含義比 302 更明確,重定向後請求的方法和實體不允許變動
  • 308:類似於 301,代表永久重定向,重定向後請求的方法和實體不允許變動
  • 300:是一個特殊的重定向狀態碼,會返回一個有多個連結選項的頁面,由使用者自行選擇
  • 304:是一個特殊的重定向狀態碼,服務端驗證過期快取有效後,要求客戶端使用該快取

15.你知道哪些 HTTP 的常用的首部欄位?

(上文中提到過一些,這裡只列舉一些常用的)

(開始報菜名)

通用首部欄位

  • Cache-Control控制快取
  • Connection連線管理
  • Transfor-Encoding報文主體的傳輸編碼格式
  • Date建立報文的時間
  • Upgrade升級為其他協議

請求首部欄位

  • Host請求資源所在的伺服器 (唯一一個HTTP/1.1規範裡要求必須出現的欄位)
  • Accept客戶端或者代理能夠處理的媒體型別
  • If-Match比較實體標記 (ETag)
  • If-None-Match比較實體標記 (ETag),與 If-Match 相反
  • If-Modified-Since比較資源更新時間 (Last-Modified)
  • If-Unmodified-Since比較資源更新時間 (Last-Modified), 與 If-Modified-Since 相反
  • Range實體的位元組範圍請求
  • User-Agent客戶端資訊

響應首部欄位

  • Accept-Ranges能接受的位元組範圍
  • Location命令客戶端重定向的 URI
  • ETag能夠表示資源唯一資源的字串
  • Server伺服器的資訊

實體首部欄位

  • Allow資源可支援 HTTP 請求方法
  • Last-Modified資源最後修改時間
  • Expires實體主體過期時間
  • Content-Language實體資源語言
  • Content-Encoding實體編碼格式
  • Content-Length實體大小
  • Content-Type實體媒體型別

16.你知道哪些 HTTP 狀態碼?

(上文中提到過一些,這裡只列舉一些常用的)

(開始報菜名)

1xx

  • 1xx:請求已經接收到,需要進一步處理才能完成,HTTP/1.0 不支援
  • 100 Continue:上傳大檔案前使用
  • 101 Switch Protocols:協議升級使用
  • 102 Processing:伺服器已經收到並正在處理請求,但無響應可用

2xx

  • 2xx:成功處理請求
  • 200 OK:成功返回響應
  • 201 Created:有新資源在伺服器端被成功建立
  • 202 Accepted:伺服器接受並開始處理請求,但請求未處理完成
  • 206 Partial Content:使用range協議時返回部分響應內容時的響應碼

3xx

請查閱上文重定向部分,這裡不再贅述。

4xx

  • 4xx:客戶端出現錯誤
  • 400 Bad Request:伺服器認為客戶端出現了錯誤,但不明確,一般是 HTTP 請求格式錯誤
  • 401 Unauthorized:使用者認證資訊確實或者不正確
  • 403 Forbidden:伺服器理解請求的含義,但沒有許可權執行
  • 407 Proxy Authentication Required:對需要經由代理的請求,認證資訊未通過代理伺服器的驗證
  • 404 Not Found:伺服器沒有找到對應的資源
  • 408 Request Timeout:伺服器接收請求超時

5xx

  • 5xx:伺服器端出現錯誤
  • 500 Internal Server Error:伺服器內部錯誤,且不屬於以下錯誤型別
  • 502 Bad Gateway:代理伺服器無法獲取到合法響應
  • 503 Service Unavailable:伺服器資源尚未準備好處理當前請求
  • 505 HTTP Version Not Supported:請求使用的 HTTP 協議版本不支援