#原创分享#解决TIME_WAIT过多造成的优化
  

Hacking 14232人觉得有帮助

{{ttag.title}}
本帖最后由 Hacking 于 2022-5-11 11:54 编辑

       我这两天看回复评论,小伙伴有些问题反馈,我也汇总一下,挑了下重点,本篇主要是给关注我的小伙伴们答疑及提供TIME_WAIT过多造成的优化方案,关于服务器为啥产生大量的TIME_WAIT,可以查阅下我原来的帖子!https://bbs.sangfor.com.cn/forum.php?mod=viewthread&tid=206155



  • TIME_WAIT形成的原因



      当一台主机操作系统主动关闭TCP Endpoint(socket)时,该TCP Endpoint进入TW状态。以Windows为例,Windows内核会对 TCP Endpoint 数据结构进行相应清理,然后放入额外的 TIME_WAIT queue 中,设置2MSL 的定时器,等待定时器超时后调用对应的释放代码。Linux上的实现也是类似。目前较多的说法是"TCP连接"进入TW ,但我们可能需要理解 "连接" 其实是抽象的概念。实际上"连接"在逻辑上存在,因为客户端和服务器端以及中间可能涉及的4层设备同时为一次传输创建了关联的TCP资源(Endpoint,或者 Session)。准确理解TW状态,即TCP EndpointTIME_WAIT进入TIME_WAIT状态。


  • TIME_WAIT状态存在的理由:



1)可靠地实现TCP全双工连接的终止
      在进行关闭连接四次挥手协议时,最后的ACK是由主动关闭端发出的,如果这个最终的ACK丢失,服务器将重发最终的FIN,因此客户端必须维护状态信息允许它重发最终的ACK。如果不维持这个状态信息,那么客户端将响应RST分节,服务器将此分节解释成一个错误(在java中会抛出connection reset的SocketException)。
因而,要实现TCP全双工连接的正常终止,必须处理终止序列四个分节中任何一个分节的丢失情况,主动关闭的客户端必须维持状态信息进入TIME_WAIT状态。

2)允许老的重复分节在网络中消逝
       TCP分节可能由于路由器异常而“迷途”,在迷途期间,TCP发送端可能因确认超时而重发这个分节,迷途的分节在路由器修复后也会被送到最终目的地,这个原来的迷途分节就称为lost duplicate。
在关闭一个TCP连接后,马上又重新建立起一个相同的IP地址和端口之间的TCP连接,后一个连接被称为前一个连接的化身(incarnation),那么有可能出现这种情况,前一个连接的迷途重复分组在前一个连接终止后出现,从而被误解成从属于新的化身。为了避免这个情况,TCP不允许处于TIME_WAIT状态的连接启动一个新的化身,因为TIME_WAIT状态持续2MSL,就可以保证当成功建立一个TCP连接的时候,来自连接先前化身的重复分组已经在网络中消逝。

  • 大量TIME_WAIT造成的影响:



      存在即是合理的,在高并发短连接的TCP服务器上,当服务器处理完请求后立刻主动正常关闭连接。这个场景下会出现大量socket处于TIME_WAIT状态。如果客户端的并发量持续很高,此时部分客户端就会显示连接不上。我来解释下这个场景。主动正常关闭TCP连接,都会出现TIMEWAIT。

  • 分析:



        查询TCP连接数,统计TIME_WAIT 连接的本地地址

  1. netstat -ant|awk '/^tcp/ {++S[$NF]} END {for(a in S) print (a,S[a])}'
  2. LAST_ACK 14
  3. SYN_RECV 348
  4. ESTABLISHED 70
  5. FIN_WAIT1 229
  6. FIN_WAIT2 30
  7. CLOSING 33
  8. TIME_WAIT 18122
复制代码
  1. CLOSED:无连接是活动的或正在进行
  2. LISTEN:服务器在等待进入呼叫
  3. SYN_RECV:一个连接请求已经到达,等待确认
  4. SYN_SENT:应用已经开始,打开一个连接
  5. ESTABLISHED:正常数据传输状态
  6. FIN_WAIT1:应用说它已经完成
  7. FIN_WAIT2:另一边已同意释放
  8. ITMED_WAIT:等待所有分组死掉
  9. CLOSING:两边同时尝试关闭
  10. TIME_WAIT:另一边已初始化一个释放
  11. LAST_ACK:等待所有分组死掉
复制代码

  • 解决优化TIMEWAIT过多


  1. <div><ul><li>编辑内核文件/etc/sysctl.conf,加入以下内容:</li></ul></div><div>
  2. </div><div>net.ipv4.tcp_syncookies = 1  表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
  3. net.ipv4.tcp_tw_reuse = 1  表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
  4. net.ipv4.tcp_tw_recycle = 1  表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  5. net.ipv4.tcp_fin_timeout  修改系默认的 TIMEOUT 时间</div><div>
  6. </div><div>然后执行 /sbin/sysctl -p 让参数生效.</div><div>

  7. </div><div><ul><li>清理TIME_WAIT脚本</li></ul>

  8. cat >> /etc/sysctl.conf << EOF
  9. net.ipv4.tcp_tw_reuse=1
  10. net.ipv4.tcp_tw_recycle=1
  11. net.ipv4.tcp_fin_timeout=30
  12. EOF
  13. sysctl -p

  14. </div><div>
  15. </div><div>
  16. </div>
复制代码


打赏鼓励作者,期待更多好文!

打赏
2人已打赏

cyq 发表于 2022-5-10 09:37
  
楼主分析的很详细,不错的实战经验,小白用户一看就懂,非常好的技术干货帖,顶一个!
平凡的小网工 发表于 2022-7-15 14:37
  
我在社区摸爬滚打这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。一看到楼主的气势,我就觉得楼主同在社区里灌水的那帮小混子有着本质的差别,你一定就是传说中的最强技术牛。
cyq 发表于 2022-10-13 08:31
  
很有参考价值,还想看更多精彩分享,期待楼主下一篇好帖!
cyq 发表于 2022-10-14 09:24
  
很有参考价值,还想看更多精彩分享,期待楼主下一篇好帖!
发表新帖
热门标签
全部标签>
每日一问
技术盲盒
技术笔记
干货满满
技术咨询
产品连连看
新版本体验
功能体验
标准化排查
自助服务平台操作指引
GIF动图学习
2023技术争霸赛专题
通用技术
运维工具
信服课堂视频
秒懂零信任
技术晨报
用户认证
社区帮助指南
答题自测
深信服技术支持平台
安装部署配置
上网策略
SDP百科
设备维护
每日一记
项目案例
玩转零信任
畅聊IT
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
测试报告
日志审计
问题分析处理
流量管理
云计算知识
原创分享
解决方案
sangfor周刊
VPN 对接
SANGFOR资讯
专家分享
技术顾问
信服故事
功能咨询
终端接入
授权
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
每周精选

本版版主

12
185
6

发帖

粉丝

关注

本版达人

LoveTec...

本周分享达人

新手24116...

本周提问达人