為什麼tcp 連接斷開只有3個包?

使用tcp/ip 詳解的例子
server 端是個 discard 程序
client 端用telnet 連接server ,然後client 端主動斷開。
用tcpdump 抓包 握手三個包很正常,為什麼斷開也只有3個包 缺少從server端向client端發ack 那個包,是因為捎帶ack包所以只有三個嗎?


四次揮手的時候,兩個方向的斷開是獨立的,每個方向發送一個FIN,對方回復一個ACK,但同時,TCP規定ACK可以捎帶在其他數據包當中,所以你看到的主動斷開連接一方本應收到的ACK,是被對方的FIN包捎帶過來的,就變成了三個包。並不是所有的情況下都是這樣,典型的一種情況是,主動斷開的一方發送FIN之後,被動一方仍然有數據要繼續發送,就會先ACK這個FIN,然後繼續發送數據(在此過程中主動斷開一方仍然會繼續ACK這些數據),直到數據發送完畢之後再發送FIN並接收對方的ACK


因為四次握手的第2,3個包合併到一起了。
這在雙方同時釋放時用。
如果只有一方停止發數據,另一方過一會再停止,就必須是四次握手了。


推薦閱讀:

TCP 協議有擁塞控制策略, 網路為什麼還會發生擁塞崩潰?
TCP/IP: 在廣域網(外網)上傳輸數據時會用到ARP協議嗎?
tcp 的可靠性到底指的是什麼?
ospf處在哪個tcp/ip的層次,是不是傳輸層,網上說tcp/ip不夠嚴謹,那麼對於osi呢?
IP報文的目的IP地址是私有IP地址,網路層如何處理的?

TAG:互聯網 | 計算機網路 | TCPIP | 網路工程 |