面試常見的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-Since
和If-None-Match
,收到304
狀態碼就可以複用快取裡的資源。
(If-None-Match 比 If-Modified-Since 優先順序更高)
驗證資源是否被修改的條件有兩個Last-modified
和ETag
(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
命令客戶端重定向的 URIETag
能夠表示資源唯一資源的字串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 協議版本不支援