你需要知道的 TCP 三次握手
TCP,全稱 Transmission Control Protocal。從名字可以知道這是一個用于 控制傳輸 的位于傳輸層的協(xié)議。
TCP 位于 TCP/IP 和 OSI 模型的傳輸層。我們最常使用的 HTTP 協(xié)議,底層通常使用的就是 TCP 協(xié)議。
如果要在客戶端和服務端創(chuàng)建 TCP 連接,我們需要在開始的時候發(fā)送三個請求確認雙方的通信能力正常,這三次連接就被稱為 TCP 的三次握手。
TCP 的三次握手
下圖為 TCP 頭部的結(jié)構(gòu),我們的 TCP 三次握手主要用到其中的標黃的部分。
下面開始講解這三次握手。
第一次握手
客戶端給服務端發(fā)送一個 TCP 報文。在 TCP 頭部中:
- 將 SYN 標志位設(shè)置為 1。
- 然后給 seq 賦予一個隨機數(shù)(假設(shè)這個隨機數(shù)是 x)。
所謂標志位,其實就是一個比特的數(shù)據(jù),設(shè)置為 1 ,其實就類似編程中將一個布爾值設(shè)置為 true。
SYN 代表同步(sync)的意思,seq 是序列號(Sequence number)的意思,是一個可以裝載數(shù)值的地方,我們給它設(shè)置為隨機數(shù),是用來做憑證(token)的,稍后服務端會使用它。
第二次握手
服務端收到 SYN,知悉客戶端希望建立 TCP 連接,并拿到了一個 seq 隨機數(shù)。
服務端于是向客戶端發(fā)送 TCP 報文,TCP 頭中:
- 將 ACK 標志位設(shè)置為 1,表示已知悉(acknowledge)客戶端的連接請求。
- ack 的值設(shè)置為客戶端傳過來的 seq 值 + 1(即 x+1)。
- 將 SYN 標志位設(shè)置為 1,表示服務端也要連接。
- seq 的值設(shè)置一個隨機數(shù)(假設(shè)隨機數(shù)為 y)。
服務端通過 ACK 和 ack 來告知客戶端已知悉連接請求,并發(fā)送自己的 SYN 和 seq 來請求和客戶端的連接。
第三次握手
客戶端收到 TCP 請求,首先驗證 ACK 是否為 1, ack 是否為 x+1。
如果是,說明服務端的這個發(fā)送是對應第一次握手的返回??蛻舳藭侔l(fā)送一個 TCP 請求:
- ACK 設(shè)置為 1。
- ack 設(shè)置為服務端 ack 的值 + 1(即 y + 1)。
三次握手后,TCP 連接就建立了。
總結(jié)
三次握手,簡單來說,就是這樣的:
- 客戶端 -> 服務端:SYN=1, seq=x (x為隨機數(shù))。
- 服務端 -> 客戶端:ACK=1, ack=x+1, SYN=1, seq=y (y為隨機數(shù))。
- 客戶端 -> 服務端:ACK=1, ack=y+1。