我所理解的三次握手與四次揮手


這篇文章不講三次握手、四次揮手的細節,因爲滿大街都有相關的文章了。

爲什麼是三次握手?

握手的目的是相互建立連接,確保對方有通信能力(嚴謹點,還有其他功能的,比如發送各自的接收窗口大小)。

如何確保對方有通信能力? 確定對方不要"答非所問"。

  • 客戶端要確認服務端是個“正常端”:客戶端說"X",服務端就得回覆"X+1".
  • 服務端要確認客戶端是個“正常端”:服務端說"Y",客戶端就得回覆"Y+1"。

這樣就夠了!再多一次就是累贅,白白增加無用的額外開銷。

爲什麼是四次揮手?

揮手的目的是相互斷開連接,各自表達各自不再發送數據了。
那什麼時候該揮手了呢?首先得有一個主動端提出"我不發送數據給你了"。因此,有了以下對話。

  • 主動端:我不發送數據給你了。
  • 被動端:OK。
  • (被動端:等我把還未說完的話說完。巴拉巴拉。。。。)
  • 被動端:我也不發送數據給你了。
  • 主動端:OK。

這兒有個疑問是:爲什麼揮手的時候,對方需要回復確認呢?目前的理解是:由於釋放連接過程中,各端都有一個狀態(主動端有FIN-WAIT-1/FIN-WAIT-2/TIME-WAIT狀態,被動端有CLOSE-WAIT/LAST-ACK狀態),需要對方回覆"OK"是爲了更新自己的狀態(此時序列號不再是爲了確保對方的通信能力了),從而最終達到CLOSE的狀態。

其實,我覺得揮手過程的這2個"OK"可以省略,並不會影響關閉連接。

  • 在發送"自己不再發送數據"後,關閉自己的發送端。
  • 在收到"對方不再發送數據"後,關閉自己的接收端。
  • 當自己發送端和接收端都關閉的時候,自然進入CLOSE狀態。
  • 當然爲了確保網絡中不再有滯留的報文段,也可以主動進行2個時間週期的延遲再進入CLOSE狀態。

這一段希望各位大佬發表自己的看法,僅僅是我個人的觀點。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章