time_wait & close_wait

304 阅读2分钟

tcp三次握手&四次挥手

v2-c253503f44b76143c7bd34a275f15300_1440w.jpg

三次握手

客户端发送SYN报文,服务端收到之后对客户端的报文确认,并发送SYN表示建立连接,客户端收到服务端的报文对服务端回复ack,连接建立

四次挥手

1 客户端发送FIN报文表示要断开连接
2 服务端回复ACK表示我收到你的请求了,但是我还没准备好,请你继续等待我的消息
3 客户端进入FIN_WAIT状态,继续等待服务端的FIN报文
4 服务端的数据发送完成了,告诉客户端我要断开连接了,发送FIN
5 客户端收到FIN,先给服务端回复ACK确认,然后进入time_wait状态,客户端不相信网络所以等待2MSL(一个MSL的时间一般是60秒),如果在没有收到回复说明服务端已经正常关闭了
6 此时客户端关闭连接

time_wait&close_wait状态原因以及解决方案

可以用如下命令查看处于各个状态的连接数

netstat -an | awk '/^tcp/ {++State[$NF]}END{for(key in State)print key "\t" State[key]}'

time_wait状态作用,过多原因,解决

1 作用

可靠地实现TCP全双工连接的终止

time_wait过多的原因&危害

time_wait是出现在客户端的一个状态,如果在短时间内客户端发起大量请求占用了所有的端口,而又得不到释放,这时候新的连接将无法建立

过多的解决方案

开启SYN cookies
开启socket重用
开启socket的快速回收

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout 修改系默认的 TIMEOUT 时间

close_wait过多原因

close_wait是出现在服务端的一个状态,用来关闭服务端连接的,当close_wait过多时,服务端的线程可能被阻塞,没法及时发起关闭动作

close_wait过多解决方案

1 业务上使用完socket主动关闭
2 监控tcp连接,如果长时间没有活动,则主动关闭
3 程序上当socket读数据时,长度为0,则主动关闭