1. 程式人生 > 其它 >TCP 的三次握手

TCP 的三次握手

原因

HTTP 是建立在 TCP 基礎之上的應用層協議,因此要想傳送一條HTTP請求,TCP 必須先要建立連線。

TCP 為什麼要經過三次握手(通訊)才能建立連線?原因很簡單,因為最少要三次通訊,客戶端和伺服器才能都知道連線是否建立成功。試想如果 TCP 連線只進行兩次握手,比如客戶端發起請求,伺服器響應請求後就結束,這回導致伺服器無法知道響應是否傳送成功,因為可能由於網路問題,伺服器已經發送請求,但是客戶端沒有接收到。通常情況下客戶端會有個超時限制,即如果遲遲沒有響應就會關閉連線,然後發起新的連線,但是伺服器還在那傻傻的等待。而三次握手可以確保雙方知道TCP連線是否建立成功

過程

上圖已經基本說明了連線的建立過程,首先客戶端會發送一個SYN(標誌位)和 Seq(x是一個的數字),然後服務端會返回一個SYN、ACK(等於客戶端Sep + 1)和Sep(y是一個的數字),最後客戶端再發送ACK(等於服務端Sep + 1)和Seq。完成上面三步後表示TCP連線建立成功,然後就可以傳送HTTP請求了

HTTP

對於從事web開發的人員,肯定都知道HTTP協議,現在廣泛使用的是HTTP1.1版本。HTTP是一種無狀態協議,因為TCP的建立的連線不是永久的,當HTTP請求結束後,客戶端和服務端就會商量是否斷開連線。如果報文頭部的Connectionkeep-alive,就會根據伺服器(如Nginx)設定的timeout來確定連線的保持時間;如果是close,會立即關閉連線。

對於現代瀏覽器,如Chrome,出於效能考慮,它一次性最多隻能建立6個TCP連線(),因此一次最多並行傳送6個HTTP請求,後面的請求要等到6個請求結束才能傳送。通常情況下報文頭部的Connection值是keep-alive

,這樣可以讓後面的請求複用前面的TCP連線,省去了三次握手的時間消耗,下面是開啟我的部落格首頁的截圖:

圖中Connection id(最後一行的數字)表示的就是TCP連線id,首次開啟頁面時瀏覽器會一次性建立6個TCP連線,id相同的表示複用的同一個TCP。需要注意的是當不同域名時,一定會建立新的連線

HTTP2

HTTP1.1中,一個TCP連線只能傳送一個請求,如果請求很多必然會消耗更多的時間。在HTTP2中,可以只建立一個TCP連線,併發多個HTTP請求,這將會對載入速度有質的提升,而且資料的傳輸採用的二進位制形式,這麼做可以減少資料傳輸過程中頻寬的佔用,相比於1.1中字串的形式,http2資料到達時間要快很多

部落格: https://blog.86886.wang
GitHub: https://github.com/wmui