正本清源:TCP協議之三次握手和四次揮手

派森马發表於2024-08-06

一、三次握手的原理

通俗解釋:

1> 客戶端傳送一條請求到服務端(透過TCP報文,其中標記位是SYN),問:我可以跟你建立連線嗎? --第一次握手
2> 服務端收到了客戶端發來的請求連線的報文,回覆給客戶端一個確認資訊同意建立連線(標記為ACK),同時傳送連線請求到客戶端,問:我服務端可以和你客戶端建立連線嗎?注意:連線是雙向的。 -- 第二次握手
3> 客戶端收到了服務端的請求連線報文,然後回覆給服務端一個確認資訊同意建立連線。 -- 第三次握手

上面的三次握手其實就是為了建立如下圖所示的從客戶端到服務端,再從服務端到客戶端的雙向通路。

二、四次揮手的原理
啥玩意就三次握手,四次揮手的?啥意思呀?
其實很簡單,所謂的三次握手就是建立客戶端與服務端的連線,四次揮手就是斷開客戶端與服務端的連線。
來吧,直接上圖:

通俗解釋:

1> 客戶端傳送一條斷開請求到服務端(透過TCP報文,其中標記位是FIN),說:我已經把資料傳輸完畢了,請求斷開連線 -- 第一次揮手
2> 服務端收到了客戶端發來的請求斷開連線的報文,回覆給客戶端一個確認資訊同意斷開連線(標記為ACK) -- 第二次揮手
3> 服務端向客戶端傳送請求斷開連線的報文,說:我也已經資料傳輸完畢了,請求斷開連線 -- 第三次揮手
4> 客戶端收到服務端發來的請求斷開連線的報文,回覆給服務端一個確認資訊同意斷開連線 -- 第四次揮手

哈哈,到這裡我猜你一定會很困惑,為什麼建立連線只需要三次,而斷開連線需要四次呢?
其實很簡單,答案如下:

建立連線的時候,不涉及資料傳輸問題,所以在第二次握手的時候,服務端在回覆確認資訊的同時就可以傳送想跟客戶端建立連線的請求。
斷開連線的時候,因為可能會涉及到資料傳輸,客戶端到服務端的傳輸結束了,難道就意味著服務端到客戶端的傳輸結束了嗎?想一想FTP上傳下載功能,上傳完能代表下載完了嗎???

上面就是關於三次握手和四次揮手最正確的解釋,你去問很多幹了多年的老開發,老多人告訴你的答案都是錯誤的,甚至他們根本就不知道這個原理。當然了,不知道原理不耽誤寫程式碼,畢竟大部分人都是程式碼的搬運工,像我這種天賦異稟的萬古奇才還是極少的,哈哈,開個玩笑。

相關文章