這篇文章不講三次握手、四次揮手的細節,因爲滿大街都有相關的文章了。
爲什麼是三次握手?
握手的目的是相互建立連接,確保對方有通信能力(嚴謹點,還有其他功能的,比如發送各自的接收窗口大小)。
如何確保對方有通信能力? 確定對方不要"答非所問"。
- 客戶端要確認服務端是個“正常端”:客戶端說"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狀態。
這一段希望各位大佬發表自己的看法,僅僅是我個人的觀點。