TCP,三次握手丢失,到底谁慌了?

邦邦最近在学习 TCP 的时候,发现 TCP 的三次握手,如果丢失了,那会发生什么?

一张图来了解一下 TCP 三次握手情况。

第一次握手,当客户端与服务器建立 TCP 连接的时候,会有一个发 SYN 报文的动作,之后就会进入到 SYN_SENT 状态。

第一次握手丢失,当客户端未接收到 SYN-ACK 报文,此时将会触发超时重传机制,一般不同版本的操作系统设置的超时时间不同,且一般超时时间都会写死在内核中,修改也比较麻烦,一般超时时间设置有 1 秒、3 秒等。

当客户端在 1 秒后未收到 SYN-ACK 报文,客户端将会重新发起 SYN 报文的动作,在 Linux 里,一般客户端重传此时设置在 5 次,并且超时时间第一次是 1 秒,第二次会变成 2 秒,第三次会变成 4 秒,一直到第五次 16 秒,且每次超时时间是上次超时时间的 2 倍。

第五次超时重传后,系统会继续等待 32 秒,若还是没有回应,客户端将不会再重复发送 SYN 报文的动作,随之将断开 TCP 连接,结束。

可以从上文看出,从丢失到断开,用时也就 1 分钟左右,看来 TCP 也是很聪明,不会无限循环操作!

第二次握手,当第一次握手顺利完成后,将会向客户端回传 SYN-ACK 报文,此时服务端进入 SYN_RCVD 状态。

第二次握手丢失,首先是 ACK,是对第一次握手的确认报文,如果客户端没有收到第二次握手,客户端以为第一次握手的 SYN 丢失,此时会启动重传机制。

其次 SYN,是服务端发起建立 TCP 连接报文。当服务端没有收到第二次握手,服务端将会启动超时重传机制,重新传送 SYN-ACK 报文(重传次数默认为 5)。

第三次握手,ACK 是对第二次握手的 SYN 确认报文,客户端将会进入 ESTABLISHED 状态。

第三次握手丢失,服务端将不会收到确认报文,此时将会触发超时重传机制,重新传送 SYN-ACK 报文,直到第三次握手成功或者达到最大重传次数为止。

TCP 三次握手的情况向大家汇报完毕,所有 TCP 都没慌,我们有什么理由慌!