講解 TCP 三次握手和四次握手之前,我們先了解一下 TCP 和 UDP 這兩個重量級的傳輸層協(xié)議玫锋。
用戶數(shù)據(jù)報協(xié)議 UDP(User Datagram Protocol):
- UDP 在傳送數(shù)據(jù)之前不需要先建立連接蛾茉,遠(yuǎn)程主機(jī)在收到 UDP 報文后,不需要給出任何確認(rèn)撩鹿。
- UPD是面向報文的谦炬,沒有擁塞控制,所以速度快节沦,適合即時通信键思,比如: QQ 語音、 QQ 視頻 甫贯、直播(一對一吼鳞、一對多、多對一叫搁、多對多)等等
傳輸控制協(xié)議 TCP(Transmission Control Protocol):
- TCP 提供面向連接的一對一的可靠性傳播的服務(wù)赔桌。在傳送數(shù)據(jù)之前必須先建立連接,數(shù)據(jù)傳送結(jié)束后要釋放連接渴逻。
- TCP 一般用于文件傳輸疾党、發(fā)送和接收郵件、遠(yuǎn)程登錄等場景惨奕。
- TCP通過以下方式提供可靠性:(1. 超時重發(fā)雪位,發(fā)出的報文段如果沒有收到及時的確認(rèn),會重發(fā)梨撞;2. 數(shù)據(jù)包的校驗雹洗,校驗首部數(shù)據(jù)和;3. 對失序的數(shù)據(jù)進(jìn)行重新排序卧波;4. 進(jìn)行流量控制时肿,防止緩存區(qū)的溢出;5. 快重傳和快恢復(fù)港粱;6. TCP會將數(shù)據(jù)截取為合理長度)
三次握手嗜侮,四次揮手
三次握手
進(jìn)行三次握手的主要作用就是為了確認(rèn)雙方的接收能力和發(fā)送能力是否正常,并指定自己的初始化序列號(Init Sequense Number, ISN
)為后面的可靠性傳輸做準(zhǔn)備。
圖中字符串的含義:
-
SYN
:連接請求/接收 報文段 -
seq
:發(fā)送的第一個字節(jié)的序號 -
ACK
:確認(rèn)報文段 -
ack
:確認(rèn)號锈颗。希望收到的下一個數(shù)據(jù)的第一個字節(jié)的序號
三次握手過程:
1)第一次握手:客戶端向服務(wù)端發(fā)送一個 SYN 報文(SYN = 1),并指明客戶端的初始化序列號 ISN(x)咪惠,即圖中的 seq = x击吱,表示本報文段所發(fā)送的數(shù)據(jù)的第一個字節(jié)的序號。此時客戶端處于 SYN_Send
狀態(tài)遥昧。
SYN-SENT
:在發(fā)送連接請求后等待匹配的連接請求
2)第二次握手:服務(wù)器收到客戶端的 SYN 報文之后覆醇,會發(fā)送 SYN 報文作為應(yīng)答(SYN = 1),并且指定自己的初始化序列號 ISN(y)炭臭,即圖中的 seq = y永脓。同時會把客戶端的 ISN + 1 作為確認(rèn)號 ack 的值,表示已經(jīng)收到了客戶端發(fā)來的的 SYN 報文鞋仍,希望收到的下一個數(shù)據(jù)的第一個字節(jié)的序號是 x + 1常摧,此時服務(wù)器處于 SYN_REVD
的狀態(tài)。
SYN-RECEIVED
:在收到和發(fā)送一個連接請求后等待對連接請求的確認(rèn)
3)第三次握手:客戶端收到服務(wù)器端響應(yīng)的 SYN 報文之后威创,會發(fā)送一個 ACK 報文落午,也是一樣把服務(wù)器的 ISN + 1 作為 ack 的值,表示已經(jīng)收到了服務(wù)端發(fā)來的的 SYN 報文肚豺,希望收到的下一個數(shù)據(jù)的第一個字節(jié)的序號是 y + 1溃斋,并指明此時客戶端的序列號 seq = x + 1(初始為 seq = x,所以第二個報文段要 +1)吸申,此時客戶端處于 Establised
狀態(tài)梗劫。
服務(wù)器收到 ACK 報文之后,也處于 Establised
狀態(tài)截碴,至此梳侨,雙方建立起了 TCP 連接。
ESTABLISHED
:代表一個打開的連接隐岛,數(shù)據(jù)可以傳送給用戶
通俗點講猫妙,只有經(jīng)過三次握手才能確認(rèn)雙發(fā)的收發(fā)功能都正常,缺一不可:
- 第一次握手:客戶端發(fā)送網(wǎng)絡(luò)包聚凹,服務(wù)端收到了割坠。這樣服務(wù)端就能得出結(jié)論:客戶端的發(fā)送能力、服務(wù)端的接收能力是正常的妒牙。
- 第二次握手:服務(wù)端發(fā)包彼哼,客戶端收到了。這樣客戶端就能得出結(jié)論:服務(wù)端的接收湘今、發(fā)送能力敢朱,客戶端的接收、發(fā)送能力是正常的。
- 第三次握手:客戶端發(fā)包拴签,服務(wù)端收到了孝常。這樣服務(wù)端就能得出結(jié)論:客戶端的接收、發(fā)送能力蚓哩,服務(wù)端的發(fā)送构灸、接收能力是正常的。
四次揮手
圖中字符串的含義:
-
FIN
:連接終止位
剛開始雙方都處于 ESTABLISHED
狀態(tài)岸梨,假設(shè)是客戶端先發(fā)起關(guān)閉請求喜颁。四次揮手的過程如下:
1)第一次揮手:客戶端發(fā)送一個 FIN 報文(請求連接終止:FIN = 1),報文中會指定一個序列號 seq = u曹阔。并停止再發(fā)送數(shù)據(jù)半开,主動關(guān)閉 TCP 連接。
2)第二次揮手:服務(wù)端收到 FIN 之后赃份,會發(fā)送 ACK 報文寂拆,且把客戶端的序號值 +1 作為 ACK 報文的序列號值,表明已經(jīng)收到客戶端的報文了芥炭。
此時的 TCP 處于半關(guān)閉狀態(tài)漓库,客戶端到服務(wù)端的連接釋放≡膀穑客戶端收到服務(wù)端的確認(rèn)渺蒿,等待服務(wù)端發(fā)出的連接釋放報文段。
3)第三次揮手:如果服務(wù)端也想斷開連接了(沒有要向客戶端發(fā)出的數(shù)據(jù))彪薛,和客戶端的第一次揮手一樣茂装,發(fā)送 FIN 報文,且指定一個序列號善延。
4)第四次揮手:客戶端收到 FIN 之后少态,一樣發(fā)送一個 ACK 報文作為應(yīng)答(ack = w+1),且把服務(wù)端的序列值 +1 作為自己 ACK 報文的序號值(seq=u+1)易遣。
參考文檔:
https://zhuanlan.zhihu.com/p/53374516
https://segmentfault.com/a/1190000039165592