當 TCP 連線在連線的一端關閉時 - 另一端收到FIN
並以 回應ACK
。連線的這一端隨後進入該CLOSE_WAIT
狀態。一旦close()
在這一端被調用,TCP 就會發送一個FIN
資料包並進入該LAST_ACK
狀態。但是,它永遠不會進入該TIME_WAIT
狀態。
現在,假設主機 A 呼叫close()
套接字並向FIN
主機 B 傳送封包FIN_WAIT_1
。主機B收到FIN
封包,發送an ACK
,然後進入該CLOSE_WAIT
狀態。然而,ACK 在上游路由器的某處被丟棄。
同時,主機 B 通話close()
(回想一下,主機 B 處於該狀態CLOSE_WAIT
)並向FIN
主機 A 傳送封包。LAST_ACK
主機 A 收到FIN
資料包回覆ACK
.然後就進入CLOSING
狀態了。
另一端,主機B仍處於該LAST_ACK
狀態。然後它接收ACK
來自主機A的訊息並進入該CLOSED
狀態。回想一下,ACK
從主機 B 到主機 A 的封包已被丟棄,且主機 A 尚未重新傳送其FIN
封包。主機 A 在逾時時重新傳送其FIN
封包 - 但主機 B 已關閉連線。
主機A現在處於卡住狀態CLOSING
嗎?連線斷開可以繼續嗎?接下來發生什麼事?
答案1
我的 TCP 有點生鏽,但我相信它的工作原理是這樣的:
當主機 B 呼叫close()
並發送其 時FIN
,其上的序號將向主機 A 表明它FIN
錯過了來自主機 B 的資料包。分段FIN
。ACK
因此主機 A 不會到達該狀態,因為在收到先前遺失的資料之前,它不會認為真正收到了CLOSING
亂序資料。FIN
ACK