业界知名公司认为应该针对高并发服务器建议调小TCP协议的time_wait超时时间。操作系统默认240秒后才会关闭处于time_wait状态的连接,在高并发访问下,服务器端会因为处于time_wait的连接数太多,可能无法建立新的连接,所以需要在服务器上调小此等待值。我们来看看例子,在Linux服务器上清通过变更/etc/sysctl.conf文件去修改该缺省值(秒):net.ipv4.tcp_fin_timeout=30
那么为什么需要这样配置呢?
服务器在处理完客户端的连接后,主动关闭,就会有time_wait状态。TCP连接是双向的,所以在关闭连接的时候,两个方向各自都需要关闭。先发FIN包的一方执行的是主动关闭,后发FIN包的一方执行的是被动关闭。主动关闭的一方会进入time_wait状态,并且在此状态停留两倍的MSL时长。
主动关闭的一方收到被动关闭的一方发出的FIN包后,回应ACK包,同时进入time_wait状态,但是因为网络原因,主动关闭的一方发送的这个ACK包很可能延迟,从而触发被动连接一方重传FIN包。极端情况下,这一去一回就是两倍的MSL时长。如果主动关闭的一方跳过time_wait直接进入closed,或者在time_wait停留的时长不足两倍的MSL,那么当被动关闭的一方早于先发出的延迟包达到后,就可能出现类似下面的问题:
1. 旧的TCP连接已经不存在了,系统此时只能返回RST包
2. 新的TCP连接被建立起来了,延迟包可能干扰新的连接
不管是哪种情况都会让TCP不再可靠,所以time_wait状态有存在的必要性。
发个小广告!!!走过路过,不要错过!新书来啦!!!
注:本公众号与当当店铺并无从属关系,仅为大家提供一个便捷购物地址。若有所冲突,纯属巧合,立删。
麦克叔叔每晚十点说
领取专属 10元无门槛券
私享最新 技术干货