大白話講解TCP三次握手


為什么需要三次握手?
三次握手的目的是為了確保客戶端和服務端建立穩定可靠的連接。

在講解之前,需要先明白[SYN]和[ACK]是什么意思?
[SYN]和[ACK]是命令標記。
在客戶端和服務端建立連接之前,雙方需要互發消息,確認是否可以建立連接。而發送消息的命令就是用[SYN]和[ACK]來標記的。
如果命令是[SYN],表示發送的是數據包的編號;如果命令是[ACK],表示的是確認信息。
SYN:Synchronize Sequence Numbers,同步序列編號,即每個數據包的編號,使用Seq表示,第一次時隨機產生。
客戶端每發送一條消息,編號自動+1。比如第一次發送時編號為1001,那么第二次為1002,第三次為1003,以此類推。服務端同樣如此。
ACK:Acknowledge,確認信息(對方的Seq+1)。

大白話描述TCP三次握手:
1.客戶端發消息給服務端,請求建立連接。->[SYN]
2.服務端收到客戶端消息后,通過某種機制,確認客戶端沒問題。但是,此時此刻,客戶端還不知道自己想要建立請求的服務端有無問題。需要服務端發送消息給客戶端,等待客戶端確認。所以服務端就把自己已經確認的信息 + 需要客戶端確認的消息發送給客戶端。->[ACK,SYN]
3.客戶端收到服務端消息后,通過某種機制,確認服務端沒問題。然后客戶端把自己已經確認的消息發給服務端,告訴服務端我這邊確認過了,你沒問題,可以連接了。服務端收到后,對確認信息進行核實,如果沒問題,連接正式建立。->[ACK]

下面通過分析[SYN]和[ACK]命令來詳細了解三次握手

第一次
192.168.3.222 TCP 192.168.3.230 52360 → 9501 [SYN] Seq=0
客戶端向服務端發送[SYN]命令,客戶端包的編號Seq為0,請求建立連接。
第二次
192.168.3.230 TCP 192.168.3.222 9501 → 52360 [SYN, ACK] Seq=0 Ack=1
服務端收到客戶端的請求信息,做確認處理,生成確認信息Ack=客戶端的Seq+1。並將服務端包的編號Seq=0一起發送給客戶端。這樣服務端就發送了2個命令:[SYN]和[ACK]。
第三次
192.168.3.222 TCP 192.168.3.230 52360 → 9501 [ACK] Seq=1 Ack=1 Win=131328 Len=0
客戶端收到服務端的信息,將客戶端的Seq+1后和服務端返回的確認信息Ack做比較,如果一致,說明服務端沒問題。然后再根據服務端發來的Seq+1生成客戶端的確認信息Ack,發送給服務端。服務端根據自己的Seq+1跟客戶端發送過來的確認信息Ack做比較,如果一致,雙方可以建立連接。

最后再看下握手數據,主要是前三條,如圖:

提供下比較經典的三次握手圖:

參考:
https://www.cnblogs.com/cenglinjinran/p/8482412.html
https://www.cnblogs.com/zcbing/p/6397496.html
https://baijiahao.baidu.com/s?id=1614404084382122793&wfr=spider&for=pc
https://blog.csdn.net/qq_38950316/article/details/81087809
https://baijiahao.baidu.com/s?id=1614404084382122793&wfr=spider&for=pc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM