Server 端
第三次的ACK在網絡中丟失,那么Server 端該TCP連接的狀態為SYN_RECV,並且會根據 TCP的超時重傳機制,會等待3秒、6秒、12秒后重新發送SYN+ACK包,以便Client重新發送ACK包。
而Server重發SYN+ACK包的次數,可以通過設置/proc/sys/net/ipv4/tcp_synack_retries修改,默認值為5.
如果重發指定次數之后,仍然未收到 client 的ACK應答,那么一段時間后,Server自動關閉這個連接。
Client 端
在linux c 中,client 一般是通過 connect() 函數來連接服務器的,而connect()是在 TCP的三次握手的第二次握手完成后就成功返回值。也就是說 client 在接收到 SYN+ACK包,它的TCP連接狀態就為 established (已連接),表示該連接已經建立。那么如果 第三次握手中的ACK包丟失的情況下,Client 向 server端發送數據,Server端將以 RST包響應,方能感知到Server的錯誤。