網絡-四次揮手

之前有寫過建立連接的時候使用的方法爲三次握手,現在描述一下斷開連接的方法:四次揮手。
圖示如下:在這裏插入圖片描述

其中:FIN爲終止標誌位,斷開連接時有效;ACK:確認標誌位,收到對方的數據包,用於通知對方已收到; seq:序列號;ack:確認號;序列號和確認號之間的依次+1就保證了數據包傳輸的完整性,如果中間有丟失數據包,能夠通過序列號和確認號之間的關係找到是哪一個數據包丟失。

可以形象的記憶爲:客戶端需要斷開連接,就發送一個數據包(FIN = 1:斷開連接,ACK = 1:確認收到你之前的數據包,seq = u:我的序列號),發送完成之後客戶端的連接就斷開了;服務器收到之後回覆一個等待數據包(FIN = 0:先不斷開,我沒有準備好,ACK = 1:確認收到你的消息,seq = v:我的序列號,ack = u+1:上一個數據包中對方的序列號+1 ),之後服務器就進行斷開的準備,準備好之後再次發送斷開連接的數據包(FIN = 1:斷開連接,ACK = 1:確認收到你之前的數據包,seq = w:我最終的序列號,ack = u+1:上一個數據包中對方的序列號+1 ),發送完成之後服務器就會斷開連接,服務器在收到消息之後會發送數據包( FIN = 0:因爲已經斷開了,不能再此置1 ,ACK = 1:確認收到你的數據包,seq = u+1:我的序列號,即上一個數據包中對方的確認號,ack = w+1:上一個數據包中對方的序列號+1),但是最後一個數據包沒有已經連接,客戶端不會管服務器是否收到。反之亦然。

思考:四次揮手能不能三次揮手結束?
通過形象記憶可以知道前面的三次揮手都是不能忽略的,那麼問題就轉換爲最後一次揮手能不能省略了,答案是不能省略,雖然說最後一個數據包已經沒有了連接,但是也是很重要的,如上描述,如果客戶端沒有發送最後一個數據包,在下一次需要連接的時候,服務器會處在等待的狀態(雖然沒有連接,但是最後一個數據包可以理解爲廣播包),這就和建立連接的步驟不相符,因爲服務器在等待最後一個數據包的確認,而現在發過來的數據包沒有確認信息,這就會出錯。

那爲什麼最後一個數據包需要等待兩個數據傳輸週期呢?
因爲最後一個數據包可以理解爲廣播包,有了兩個數據傳輸週期之後就能夠確認傳輸途總已經沒有最後一個數據包信息了,就可以去重新創建新的通訊通道。這是個人觀點,不喜勿噴。還不清楚的小夥伴可以添加我的個人微信 lqy—1997 (中間是三個英文的槓)進行交流。

發佈了27 篇原創文章 · 獲贊 47 · 訪問量 7952
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章