Time_Wait
四次挥手的过程中,最先主动发起FIN报文的一端最后会进入TIME_WAIT状态。
Time_Wait存在的目的
- 允许老的重复分节在网络中消逝,使其不影响后来的连接。假设原本FIN报文发出后在网络中滞留了,重发后顺利断开了连接。过了一段时间后,又建立起了新的连接,用的是相同的端口号,这个时候FIN报文到达就会对当前的连接造成影响
- 可靠的关闭连接,如果最后发送的ACK丢失了,发送方不知道且关闭了连接,那么另一端重复之后将收到RET报文,造成一个错误。所以需要TIME_WAIT一定的时间来保证连接正常关闭
大量Time_Wait产生的原因和后果
Linux系统下的默认一个MSL为30s,所以TIME_WAIT默认时间为60s。如果一个TCP服务处理了大量的高并发短链接,那么短时间内就会有很多的连接处于TIME_WAIT状态,而过多的TIME_WAIT连接可能会导致无法建立新的连接。限制的原因诸如文件描述符(socket)不够用,服务器的cpu资源被占用,处理能力下降。
Time_Wait问题的解决方法
- 设置长连接
###### vim /etc/sysctl.conf 修改 - tcp_tw_recycle:1为开启,表示TIME_WAIT状态的socket快速回收。
- tcp_tw_reuse:1为开启,表示运行将TIME_WAIT状态的socket用于新的连接。
- tcp_max_tw_buckets:控制TIME_WATI总数,这个选项可以阻止一些简单的Dos攻击。