1.基础概念
三次握手的丢包重传机制的次数限制和RTO的增长
-
第一次握手(syn包):
tcp_syn_retires
的参数来限制第一次握手(syn包)的重传次数,
默认为5次
。 -
第二次握手(ack+ack包):
tcp_synack_retires
的参数来限制第二次握手(ack+syn包)的重传次数,
默认为5次
。 -
第三次握手(ack包):
tcp_retires2
的参数来限制第三次握手(ack包)的重传次数,
默认为15次
。 -
每次重传都会导致
RTO超时重传的时间成倍增长
。
2.第一次握手(syn包)丢失
-
当客户端发起的 TCP 第一次握手 SYN 包,在
超时时间内没收到服务端的 ACK
,就会在
超时重传 SYN 数据包
,每次超时
重传的 RTO 是翻倍上涨
的,直到
SYN 包的重传次数到达 tcp_syn_retries
值后,客户端
不再发送 SYN 包
。
3.第二次握手(ack+syn包)丢失
-
当 TCP 第二次握手 SYN、ACK 包丢了后,客户端
第一次握手的SYN 包会发生超时重传
,服务端
第二次握手的SYN、ACK 也会发生超时重传
。 -
客户端 SYN 包超时重传的最大次数,是由
tcp_syn_retries 决定的
,默认值是 5 次;服务端 SYN、ACK 包时重传的最大次数,是由
tcp_synack_retries 决定的
,默认值是 5 次。
4.第三次握手(ack包)丢失
对于
服务器
:
-
在建立 TCP 连接时,如果第三次握手的 ACK,服务端无法收到,则服务端就会
短暂处于 SYN_RECV 状态
,而客户端会
处于 ESTABLISHED 状态
。 -
由于服务端一直收不到 TCP 第三次握手的 ACK,则
第二次握手会一直重传 SYN、ACK 包
,直到重传次数
超过 tcp_synack_retries 值
(默认值 5 次)后,服务端就会
断开 TCP 连接
。 (这里的断开是
服务器单方面主动断开
,客户端的状态还是established的)
而
客户端
则会有两种情况:
-
如果
客户端没发送数据包
,一直处于 ESTABLISHED 状态,当
达到我们保活机制的时间限制时会触发保活机制
来看看这个tcp连接是否还存活,如果不存活,则为死亡连接,客户端断开连接。 (
触发保活机制
) -
如果
客户端发送了数据包
,一直没有收到服务端对该数据包的确认报文,则会一直重传该数据包,直到
重传次数超过 tcp_retries2 值(默认值 15 次)
后,客户端就会
断开 TCP 连接。