FIN 資料包是否保證到達?

FIN 資料包是否保證到達?

在四次握手中,我們有以下內容:

FIN ------->
<------- ACK
<---x--- FIN (what if this packet is lost?)
ACK ------->

如果第三個資料包遺失會發生什麼情況,會重傳嗎?請注意,當發送第三個資料包時,程式可能會破壞套接字,因此它無法再發送任何內容!

答案1

簡而言之,沒有資料包能保證到達。許多情況都可能導致資料包在傳輸過程中遺失或遺失。 TCP 包含重試規則以確保資料到達。

您的場景是半封閉連線。一側關閉連接,並且只能讀取數據,直到另一側關閉連接。

FIN ------>
<------ ACK

當連線關閉時,發送 FIN 封包的一方將在 FIN_WAIT1、FIN_WAIT2 和 TIME_WAIT 狀態之間循環。收到FIN資料包的一方將進入CLOSE_WAIT狀態。當它關閉連線時,它會根據它的重試規則重試FIN資料包,直到收到ACK或逾時。在發送第二個FIN之前,連線處於半關閉狀態。

<------ FIN
ACK ------>

連線可以透過 3 個資料包關閉。這些在我看到的協定轉儲中很常見。在某些情況下,對第一個 FIN 的回應將是 RST(重設),並且最終的 ACK 將被替換為 RST。

FIN ------>
<------ FIN,ACK
ACK ------>

在某些情況下,會傳送 RST(重置)來取代 ACK,並且最終的 ACK 會替換為 RST。

FIN ------>
<------ RST
RST ------>

由於網路延遲,兩端都可能關閉活動連線。在這種情況下,ACK、封包可以任一順序傳送。

<------ FIN
FIN ------>
<------ ACK
ACK ------>

答案2

RFC 793:

半開連接和其他異常

如果其中一個 TCP 在另一端不知情的情況下關閉或中止了其一端的連接,或者連接的兩端由於崩潰而變得不同步,則稱已建立的連接是「半開」的。的情況下。如果嘗試在任一方向傳送數據,則此類連線將自動重設。然而,半開連接預計是不常見的,並且恢復過程會稍微複雜一些。

相關內容