TCP握手丢包分析与快速建立连接
- 一、TCP握手丢包分析
- TCP第一次握手SYN丢包
- TCP第二次握手SYN + ACK丢包
- TCP第三次握手ACK丢包
- 二、TCP快速建立连接
一、TCP握手丢包分析
TCP第一次握手SYN丢包
当客户端发起的TCP第⼀次握手SYN 包,在超时时间内没收到服务端的ACK,就会在超时重传SYN数据包,每次超时重传的RTO是翻倍上涨的,直到 SYN 包的重传次数到达 tcp_syn_retries值后,客户端不再发送 SYN 包。
TCP第二次握手SYN + ACK丢包
当TCP第⼆次握⼿ SYN、ACK 包丢了后,客户端 SYN 包会发生超时重传,服务端SYN、ACK 也会发生超时重传。 客户端SYN包超时重传的最大次数,是由 tcp_syn_retries 决定的,默认值是5次;服务端 SYN、ACK 包时重传的最大次数,是由 tcp_synack_retries 决定的,默认值是5次。
TCP第三次握手ACK丢包
在建立TCP连接时,如果第三次握手的ACK,服务端无法收到,则服务端就会短暂处于SYN_RECV 状态,而客户端会处于ESTABLISHED状态。 由于服务端⼀直收不到TCP第三次握⼿的ACK,则会⼀直重传SYN、ACK包,直到重传次数超过tcp_synack_retries 值(默认值5次)后,服务端就会断开 TCP连接。
而客户端则会有两种情况
- 如果客户端没发送数据包,⼀直处于 ESTABLISHED 状态,然后经过2个小时11分15秒(TCP保活机制)才可以发现⼀个死亡连接,于是客户端连接就会断开连接。
- 如果客户端发送了数据包,⼀直没有收到服务端对该数据包的确认报文,则会⼀直重传该数据包,直到重传次数超过 tcp_retries2值(默认值 15 次)后,客户端就会断开TCP连接。
二、TCP快速建立连接
fastOpen
- 在第⼀次建立连接的时候,服务端在第⼆次握手产生了一个Cookie(已加密)并通过 SYN、ACK包一起发 =给客户端,于是客户端就会缓存这个 Cookie ,所以第一次发起HTTP Get请求的时候,还是需要2个RTT的时延
- 在下次请求的时候,客户端在SYN包带上 Cookie 发给服务端,就提前可以跳过三次握⼿的过程,因为Cookie 中维护了⼀些信息,服务端可以从 Cookie获取TCP相关的信息,这时发起的 HTTP GET 请求就只需要1个RTT 的时延
可以通过设置 net.ipv4.tcp_fastopn 内核参数,来打开 Fast Open 功能。
net.ipv4.tcp_fastopn 各个值的意义
- 0 关闭
- 1 作为客户端使用Fast Open功能
- 2 作为服务端使用Fast Open功能
- 3 无论作为客户端还是服务器,都可以使用Fast Open功能