TCP连接过程中出现的问题

在TCP的三次握手和四次挥手过程中,Client和Server会出现多种状态,此间会出现常见的问题


TCP连接过程中出现的问题_第1张图片
image.png

问题一:TIME_WAIT过多
产生原因:主动关闭方在发送四次挥手的最后一个ACK会变为TIME_WAIT状态,保留此状态的时间为两个MSL(linux里一个MSL为30s,是不可配置的)

TIME_WAIT两个MSL的作用:可靠安全的关闭TCP连接。比如网络拥塞,主动方最后一个ACK被动方没收到,这时被动方会对FIN开启TCP重传,发送多个FIN包,在这时尚未关闭的TIME_WAIT就会把这些尾巴问题处理掉,不至于对新连接及其它服务产生影响。
TCP: time wait bucket table overflow产生原因及影响:原因是超过了linux系统tw数量的阀值。危害是超过阀值后﹐系统会把多余的time-wait socket 删除掉,并且显示警告信息,如果是NAT网络环境又存在大量访问,会产生各种连接不稳定断开的情况。

解决办法:对于tw的reuse、recycle其实是违反TCP协议规定的,服务器资源允许、负载不大的条件下,尽量不要打开,当出现TCP: time wait bucket table overflow,尽量调大参数

net.ipv4.tcp_max_tw_buckets=10000

调节至/var/log/message不在报错为止

问题二:FIN_WAIT2 状态的 TCP 链接过多

原因:HTTP 服务中,Server 由于某种原因会主动关闭连接,例如 KEEPALIVE 超时的情况下。作为主动关闭连接的 Server 就会进入 FIN_WAIT2 状态。
TCP/IP 协议栈中,存在半连接的概念,FIN_WAIT2 状态不算做超时,如果 Client 不关闭,FIN_WAIT_2 状态将保持到系统重启,越来越多的 FIN_WAIT_2 状态会致使内核 Crash。
解决办法:建议调小 net.ipv4.tcp_fin_timeout 参数,减少这个数值以便加快系统关闭处于 FIN_WAIT2 状态的 TCP 连接
修改内核参数:

 net.ipv4.tcp_syncookies = 1
 net.ipv4.tcp_fin_timeout = 30
 net.ipv4.tcp_max_syn_backlog = 8192
 net.ipv4.tcp_max_tw_buckets = 10000

你可能感兴趣的:(TCP连接过程中出现的问题)