面試題:
在 TCP 建立連接的三次握手連接階段,如果客戶端發送的第三個ACK包丟了,那么客戶端和服務端分別進行什么處理呢?
相信了解 tcp 協議的人,三次握手的過程肯定很了解了。第三次的 ack 包丟失就是說在 client 端接收到 syn + ack 之后,向 server 發送的 ack 包 由于各種原因 server 沒有收到。這時 client, server 分別會進行怎樣的處理呢?
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的錯誤。