在tcp協議中處於last ack狀態的連線,如果一直收不到對方的ack,會一直處於這個狀態嗎?

時間 2021-05-11 14:56:06

1樓:

tcp_orphan_retries

連線就進入 LAST_ACK 狀態,在未等到 ACK 時,會在tcp_orphan_retries引數的控制下重發 FIN 報文。

2樓:

TCP 鏈結出錯

連續重傳同乙個 TCP 段意味著遠端主機或網路鏈路可能存在故障。 ... (

c)當重傳同乙個段的次數超過了乙個比閾值 R1 大的閾值 R2 時,關閉連線。

3樓:寫bug為生

fin包跟其他資料報一樣,是有重傳定時器的,超時後會重傳,重傳後仍然沒收到,會再次超時。超時是有最大次數的,多次後,會進入closed狀態,連線釋放。linux kernel下估計幾分鐘後釋放。

4樓:JCRunner

如果一直等待不到,它是否不會進入close狀態。

如果一直等待不到,他會進入close狀態,但是並不是直接進入close狀態。

參考鏈結 Why is the last ACK needed in TCP four way termination

上一張網上搜尋的圖,更好理解(侵刪)

這個鏈結中講述了三種情況:(2017/10/26 Update:補充了第四種情況感謝 @似水流年 )

下面假設:主動關閉的一端為A,被動關閉的一端為B, 根據B是否收到最後的ACK包分為兩種情況

B傳送FIN,進入LAST_ACK狀態,A收到這個FIN包後傳送ACK包,B收到這個ACK包,然後進入CLOSED狀態

B傳送FIN,進入LAST_ACK狀態,A收到這個FIN包後傳送ACK包,由於某種原因,這個ACK包丟失了,B沒有收到ACK包,然後B等待ACK包超時,又向A傳送了乙個FIN包

a)假如這個時候,A還是處於TIME_WAIT狀態(也就是TIME_WAIT持續的時間在2MSL內)

A收到這個FIN包後向B傳送了乙個ACK包,B收到這個ACK包進入CLOSED狀態

b)假如這個時候,A已經從TIME_WAIT狀態變成了CLOSED狀態

A收到這個FIN包後,認為這是乙個錯誤的連線,向B傳送乙個RST包,當B收到這個RST包,進入CLOSED狀態

c)假如這個時候,A掛了(假如這台機器炸掉了)【第四種情況,不在參考鏈結裡】

B沒有收到A的回應,那麼會繼續傳送FIN包,也就是觸發了TCP的重傳機制,如果A還是沒有回應,B還會繼續傳送FIN包,直到重傳超時(至於這個時間是多長需要仔細研究),B重置這個連線,進入CLOSED狀態,參考鏈結看這裡

總之最後是會進入CLOSED狀態

附帶乙個FIN和RST的區別

5樓:流沙

被動關閉端處於LAST-ACK 狀態下,如果遲遲收不到 ACK,就認為前面傳送的 FIN 報文丟失了,重傳一次 FIN 啊。如果順利的話,對方收到 FIN 後會發生 ACK 過來。如果對方已經不在了,後面的狀態轉換我就不知道了

6樓:李妮可

如果被動關閉的一方處於LAST_ACK狀態而在一定時間內沒有收到ACK,那麼會觸發被動關閉重新傳送Fin(這也是Time_wait狀態設定的原因之一)

TCP協議中payload設定方式?payload是否與Window size有關?

歐文韜 簡單地稅這就是乙個資料報資料部分的緩衝區。和MTU有關。然後還會留一部分開放協議頭。你如果用ipv6的話這個payload應該還會更低點。 許楊 tcp 在三次握手時會協商乙個mss 最大報文長度 協商每乙個報文段最大傳輸的資料長度。如果你去看你分析的資料報的話,應該就是1460 王賽 給J...

tcp 協議中 為什麼syn會消耗乙個序號?

肖巨集輝 因為TCP的RFC規定了,SYN和FIN要占用segment的長度,所以在SYN和FIN包裡面,有你看不見,但是卻邏輯存在的乙個byte。既然有這麼乙個byte,那麼ACK 1也很正常。SEG.LEN the number of octets occupied by the data in...

TCP協議中的埠具體指的是什麼,為什麼要有埠,你是怎麼理解的?

李少俠愛闖江湖 埠的概念,我是這樣理解的。和你的差不多。埠號是計算機上的某乙個程序 應用程式 的標識號,通過埠實現了計算機之間程序的通訊。計算機之間資料的傳送是資料報封裝和解封裝的過程。在這個封裝過程中除了封裝ip位址還有封裝埠號。有了埠號當對端計算機收到資料,當資料被解封裝到傳輸層的時候,接下來就...