简介
本篇读完需要10分钟,读完能了解:
-
TCP4次挥手
-
为什么要4次挥手
-
TIME_WAIT等待2MSL的原因
-
TCP故障检测
相关阅读
断开连接过程(4次挥手)
TIPS
三次挥手会有什么问题
B向A发送链接释放报文(FIN=1,ACK=1)后直接断开连接,如果A没有收到这个FIN数据包,A就会一直处于FINT-WAIT-2状态
等待2MSL(最大报文段生存时间)原因
网络不可靠的情况,会出现最后一个ACK丢失。B如果没有收到ACK,将不断重复发送FIN片段。A会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么A会重发ACK并再次等待2MSL。2MSL就是一个发送和一个回复所需的最大时间。如果直到2MSL,Client都没有再次收到FIN,那么Client推断ACK已经被成功接收,则结束TCP连接。
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个keepalive计时器,服务器每收到一次客户端的请求后都会重新Reset这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75秒钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。
TIME_WAIT扩展
场景: 在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。
查询现象: netstat -ant|awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}’LAST_ACK 14
SYN_RECV 348
ESTABLISHED 70
FIN_WAIT1 229
FIN_WAIT2 30
CLOSING 33
TIME_WAIT 18122
处理: 编辑内核文件/etc/sysctl.conf,加入以下内容: 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 时间 然后执行 /sbin/sysctl -p 让参数生效.