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