谈谈TIME_WAIT

当主机1要关闭TCP连接时,会先发送FIN报文给主机2。

主机2进入CLOSE_WAIT状态,并发送一个ACK应答。同时,主机2通过read调用获得EOF,并将此结果通知应用程序进行主动关闭操作,发送FIN报文。

主机1在接收到FIN报文后发送ACK应答,此时进入TIME_WAIT状态。

主动发起关闭行为的客户端会进入到TIME_WAIT状态。

主机1在TIME_WAIT停留时间是固定的,是MSL(maximum segment lifetime)的两倍,一般称为2MSL。Linux系统硬编码了这个字段,名称为TCP_TIMEWAIT_LEN,值为60s。

TIME_WAIT的作用

第一个作用是保证被动关闭方能够正确地关闭

TCP设计之初就考虑到了报文出错重传的问题,最后的ACK需要确保能够让被动关闭方接收,从协助其正常的关闭。

如果主机1的ACK报文没有传输成功,主机2就会重新发送FIN报文。如果没有TIME_WAIT状态的话,只会返回RST操作,从而导致被动关闭方出现错误。

第二个作用是处理报文迷走的情况

在网络中,报文需要经过很长一段时间才能到达目的地,造成这种问题原因多种多样,可能是路由器重启,也可能是网络链路出现了故障。

如果这个报文达到目的地时,发现TCP连结四元组所代表的连结不存在,那么这个报文自然丢弃。

如果这个报文到达目的地时,发现TCP连结四元组所代表的连结存在,但不是原来的那个连结了,这样就会对通信造成影响。

TCP设置了一个机制,经过2MSL这个时间,足以让两个方向上的分组都被丢弃,让原来的连接的分组在网络中自然消失,再出现的分组一定是新的连结。

主机1在接收到FIN后,发送ACK报文,然后开始2MSL计时。当主机1的ACK没有被主机2收集到时,主机1收到主机2的ACK时,又会重新开始计时。

如何优化TIME_WAIT

TIME_WAIT主要会造成两个问题:

  • 内存占用
  • 端口占用,端口资源有限,当存在TIME_WAIT状态过多时,会导致无法创建新的连接

在高并发的情况下,我们希望能够对TIME_WAIT所造成的问题做一些优化。

我们可以设置linux系统中的net.ipv4.tcp_tw_reuse选项,复用处于TIME_WAIT的套接字为新的连结所用。

这里两种情况下的连结会被复用:

  1. 连结发起方clinet
  2. 对应的TIME_WAIT状态的连结创建时间超过1s才可以被复用

这里还需要打开对TCP时间戳的支持,即net.ipv4.tcp_timestamps=1。

相关推荐
Android系统攻城狮15 分钟前
Linux PipeWire深度解析之pw_init调用流程与实战(八十三)
linux·运维·服务器·音频进阶·pipewire音频进阶
国科安芯42 分钟前
轨道供电韧性:ASP4644四通道降压架构在低轨卫星平台电源管理中的适用性分析
运维·网络·数据库·嵌入式硬件·架构·状态模式·低轨卫星星座
少陽君2 小时前
用于InfiniBand网络的实时终端监控器——高速互连的htop
网络
zbyyd2 小时前
Linux 进程管理详解:从概念到实战
linux·运维·服务器
云飞云共享云桌面4 小时前
智能装备工厂研发团队如何利用单台服务器承载 10 路 SolidWorks 并发?
运维·服务器·3d·自动化·制造
辻弋2014 小时前
手动关服务会自动重启、组策略家庭版用不了——Windows Update Blocker用“禁用+锁定”双保险,让Win10/11自动更新彻底闭嘴
服务器·人工智能·windows·电脑·开源软件
发量惊人的中年网工4 小时前
如何验证DDoS高防真的生效?从源站隐藏到正常访问的完整验收方法
运维·网络·数据库·ddos
躺不平的理查德4 小时前
OpenSSL 的异步 TLS 1.3 加密
linux·运维·服务器
tedcloud1234 小时前
Awesome DSH Plugin 怎么用?给 DeepSeek Harness 搭建自己的插件生态
大数据·linux·服务器·人工智能·音视频
GuoFeng.Wan5 小时前
深入理解经典蓝牙的L2CAP协议
网络