TCP四次挥手过程中主动断开连接方有一个TIME_WAIT状态,这个状态会持续2MSL之后才会转变为CLOSED状态。一般一个MSL是30秒,所以以一共一般是60秒。这60秒内客户端会一直占用着端口。如果发起断开端的TIME-WAIT状态过多,占满了端口资源,那么就无法再跟「目的 IP+ 目的 PORT」都一样的服务器建立连接了。但是对于不同的服务器任然可以建立连接。
TIME-WAIT状态的目的:
- 防止断开后的历史连接中的数据被后续相同的四元组连接接收到,否则就会导致后面的连接接收到一个无效的数据;
- 保证ACK发送到被断开连接端,保证被动关闭方能正确的关闭。
打开开 TCP 时间戳,即 net.ipv4.tcp_timestamps=1(默认即为 1))的情况下可以开启net.ipv4.tcp_tw_reuse、net.ipv4.tcp_tw_recycle这两个参数用来快速回收TIME—WAIT状态的连接。
什么是PAWS机制?
tcp_timestamps 选项开启之后, PAWS 机制会自动开启,它的作用是防止 TCP 包中的序列号发生绕回。
每个TCP包都会有自己唯一的SEQ,出现TCP数据包重传的时候会复用SEQ号,这样接收方能通过SEQ号来判断数据包的唯一性,但是SEQ号是有限的,一共32bit,seq号是递增的,满了就从0开始。seq号溢出后就无法通过seq号标识数据包的唯一性,某个数据包延迟或因重发而延迟时,可能导致连接传递的数据被破坏。
PAWS就是为了解决这个事情的,在开启 tcp_timestamps 选项,tcp包就会带上时间戳了,PAWS要求连接双方维护最近一次收到数据包的时间戳,每收到一个新数据包就跟这个时间戳作比较,如果数据包中时间戳不是递增的,则表示数据包是过期的,就会直接丢弃这个数据包。
SYN什么时候被丢弃
开启 tcp_tw_recycle 参数,并且在 NAT 环境下,造成 SYN 报文被丢弃
TCP两个队列满了,造成SYN报文丢弃