tcp三次握手&四次挥手
三次握手
客户端发送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,则主动关闭