為什麼LAST_ACK沒有進入CLOSE_WAIT?

為什麼LAST_ACK沒有進入CLOSE_WAIT?

當 TCP 連線在連線的一端關閉時 - 另一端收到FIN並以 回應ACK。連線的這一端隨後進入該CLOSE_WAIT狀態。一旦close()在這一端被調用,TCP 就會發送一個FIN資料包並進入該LAST_ACK狀態。但是,它永遠不會進入該TIME_WAIT狀態。

TCP狀態轉換圖

現在,假設主機 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 的資料包。分段FINACK

因此主機 A 不會到達該狀態,因為在收到先前遺失的資料之前,它不會認為真正收到了CLOSING亂序資料。FINACK

相關內容