在TCP的四次分手當中,被動關閉方是如何知道數據已經接收完了?


既然被動關閉方B(passive shutdown)已經接收到主動關閉方A(active shutdown)FIN,大體有以下三種不同的場景:

1 TCP數據 ,FIN順序到達

這是正常情況,B接收到含有FIN標誌位的報文,該報文有sequence number,假定其為10000,B就會知道A的最後一個位元組數據序列號為10000,任何大於此序列號的數據即為非法,所以B可以知道數據接收完畢。

退一步說,A發送FIN之後也不會再發送數據給B。

2 TCP數據丟

B接收到A的FIN,根據其sequence number發現有數據丟失,最好的方法是B立馬發送ACK,ACK number 為成功接收數據 sequence number + 1,這樣可以觸發A的 Fast Retransmit,A立刻重傳,當B接收到,根據序列號發現數據已經完全接收,可以知道A的數據發送完畢,可以提交給應用程序。

3 FIN先到,TCP數據後到

此為亂序,B會意識到亂序,在TCP數據還沒有到達之前,會發送ACK觸發A快速重傳,也許B的ACK還沒有到達A,B已經接收到姍姍來遲的數據,B將亂序的數據重新按序排列好。這時A可能還會發送一個duplicated TCP segment ( 快速重傳),到達B,B根據序列號知道其為duplicated,將其丟棄即可,至此,B知道A發送的數據已經結束,並提交給應用程序。


我猜一下你的問題然後回答你:數據都有序號,包括用來關閉連接的數據既FIN,如果收到FIN的序號和之前的序號連不到一起當然就亂序,可能丟失數據了。


推薦閱讀:

DNS解析的過程是什麼,求詳細的?
《tcp/ip詳解》三卷本該怎麼看?
為什麼整個127.*網段都被拿來當做環回地址了?
為什麼HTTP標準中 webService 主動會關閉tcp連接?
TCP/IP哪些層加密了哪些沒有加密?

TAG:計算機網路 | TCPIP | TCP | 網路協議 |