TCP三次握手和四次揮手
為了準確無誤地把資料送達目標處,TCP 協議採用了三次握手策略。
1.三次握手
1.1 TCP三次握手圖解
簡單示意圖
- 客戶端–傳送帶有 SYN 標誌的資料包–一次握手–服務端
- 服務端–傳送帶有 SYN/ACK 標誌的資料包–二次握手–客戶端
- 客戶端–傳送帶有帶有 ACK 標誌的資料包–三次握手–服務端
1.2 為什麼要三次握手
三次握手的目的是建立可靠的通訊通道,說到通訊,簡單來說就是資料的傳送與接收,而三次握手最主要的目的就是雙方確認自己與對方的傳送與接收是正常的。
-
第一次握手:Client 什麼都不能確認;Server 確認了對方傳送正常,自己接收正常
-
第二次握手:Client 確認了:自己傳送、接收正常,對方傳送、接收正常;Server 確認了:對方傳送正常,自己接收正常
-
第三次握手:Client 確認了:自己傳送、接收正常,對方傳送、接收正常;Server 確認了:自己傳送、接收正常,對方傳送、接收正常
所以三次握手就能確認雙發收發功能都正常,缺一不可。
1.3 第2次握手傳回了ACK,為什麼還要傳回SYN?
接收端傳回傳送端所傳送的 ACK 是為了告訴客戶端,我接收到的資訊確實就是你所傳送的訊號了,這表明從客戶端到服務端的通訊是正常的。而回傳 SYN 則是為了建立並確認從服務端到客戶端的通訊。”
注:
SYN 同步序列編號(Synchronize Sequence Numbers) 是 TCP/IP 建立連線時使用的握手訊號。在客戶機和伺服器之間建立正常的 TCP 網路連線時,客戶機首先發出一個 SYN 訊息,伺服器使用 SYN-ACK 應答表示接收到了這個訊息,最後客戶機再以 ACK(Acknowledgement)訊息響應。這樣在客戶機和伺服器之間才能建立起可靠的 TCP 連線,資料才可以在客戶機和伺服器之間傳遞。
2.四次揮手
2.1 為什麼要四次揮手
斷開一個 TCP 連線則需要“四次揮手”:
- 客戶端-傳送一個 FIN,用來關閉客戶端到伺服器的資料傳送
- 伺服器-收到這個 FIN,它發回一 個 ACK,確認序號為收到的序號加 1 。和 SYN 一樣,一個 FIN 將佔用一個序號
- 伺服器-關閉與客戶端的連線,傳送一個 FIN 給客戶端
- 客戶端-發回 ACK 報文確認,並將確認序號設定為收到序號加 1
任何一方都可以在資料傳送結束後發出連線釋放的通知,待對方確認後進入半關閉狀態。當另一方也沒有資料再發送的時候,則發出連線釋放通知,對方確認後就完全關閉了 TCP 連線。
舉個例子:
A 和 B 打電話,通話即將結束後,
A 說“我沒啥要說的了”,
B 回答“我知道了”,
但是 B 可能還會有要說的話,A 不能要求 B 跟著自己的節奏結束通話,
於是 B 可能又巴拉巴拉說了一通,
最後 B 說“我說完了”,
A 回答“知道了”,
這樣通話才算結束。
上面講的比較概括,推薦一篇講的比較細緻的文章:https://blog.csdn.net/qzcsu/article/details/72861891