1. 程式人生 > >三次握手的第三個ACK包丟了——客戶端認為連線建立,寫資料時,會觸發RST

三次握手的第三個ACK包丟了——客戶端認為連線建立,寫資料時,會觸發RST


上次面試被問到一個問題,在TCP建立連線的三次握手階段,如果客戶端傳送的第三個ACK包丟了,那麼客戶端和伺服器端分別進行什麼處理? 聽到問題,一下愣掉,有點傻了,根據讀書時模模糊糊的印象,答了答,無疑打錯了T...T

分析



當Client端收到Server的SYN+ACK應答後,其狀態變為ESTABLISHED,併發送ACK包給Server;
 
如果此時ACK在網路中丟失,那麼Server端該TCP連線的狀態為SYN_RECV,並且依次等待3秒、6秒、12秒後重新發送SYN+ACK包,以便Client重新發送ACK包,以便Client重新發送ACK包。

           
Server重發SYN+ACK包的次數,可以通過設定/proc/sys/net/ipv4/tcp_synack_retries修改,預設值為5。
             
如果重發指定次數後,仍然未收到ACK應答,那麼一段時間後,Server自動關閉這個連線。
但是Client認為這個連線已經建立,如果Client端向Server寫資料,Server端將以RST包響應,方能感知到Server的錯誤。


這才是正解~~~