linux内核协议栈TCP time_wait原理、配置、副作用

本文深入探讨了Linux内核协议栈中TCP的time_wait状态,包括其产生的条件、相关参数说明、快速回收功能及其副作用。同时,分析了客户端和服务器端大量time_wait状态的影响,并提供了相应的解决方法和使用建议,如端口重用和调整tcp_max_tw_buckets参数。

0. 手把手教你做中间件、高性能服务器、分布式存储技术交流群

手把手教你做中间件、高性能服务器、分布式存储等(redis、memcache、nginx、大容量redis pika、rocksdb、mongodb、wiredtiger存储引擎、高性能代理中间件),git地址如下:

git地址:https://github.com/y123456yz/middleware_development_learning

1. time_wait状态产生条件

只有在正常四次挥手关闭连接的情况下,在主动关闭连接的一方会出现一段时间的time_wait。如果启用了快速回收功能,回收时间和网络延迟状况有关,正常情况下小于1s,如果没有开启time_wait快速回收功能,则time_wait回收时间默认60s。

三次挥手过程(FIN+ACK, FIN+ACK,ACK)的情况,例如杀掉一段进程,第一个发送FIN+ACK的一端也会产生time_wait。

2. Time_wait状态相关参数说明

TCP中有和time_wait状态相关的参数有以下四个:
参数说明
3. Time_wait快速回收
3.1 快速回收功能失效前提
Time_wait快速回收功能生效前提:启用tcp_tw_recycle,并启动本端和对端tcp_timestamps配置。启用timestamps功能时,报文中会携带时间戳选项信息,抓包如下:
在这里插入图片描述
3.2 启用time_wait快速回收功能副作用
如果启用了tcp_tw_recycle和tcp_timestamps,如果接收报文四层选项字段带有时间戳信息,则会对时间戳进行检查,对不满足条件的包会直接丢弃,可能会造成客户端连接建立不成功。例如网络路由信息反复变化,移动cmwap网络发来的包的时间戳乱跳,同一局域网通过路由器做NAT访问服务器(因为做NAT后,源IP就变为路由器的IP了,如果局域网内各个电脑系统时间不一致,则会出现)等情况有可能会出现部分连接异常。原因是tcp_tw_recycle/tcp_timestamps以及对端tcp_timestamps都开启的条件下,60s内同一源ip主机的socket connect请求中的timestamp必须是递增的。不同主机经过路由器做NAT后,报文的源IP地址就变为路由器的IP地址了。
3.3内核协议栈相关主要源码
Time_wait状态生成及快速回收相关代码:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
开启timestamps引起的丢包相关源码如下:
在这里插入图片描述
4. 客户端端口重用
4.1 客户端大量time_wait,端口重用前提
启用tcp_tw_reuse,并启动本端和对端tcp_timestamps配置。
4.2 内核协议栈相关主要源码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
5. 大量timewait对客户端、服务端影响
5.1 客户端大量time_wait影响

  1. 大量time_wait会造成连接资源不释放,内存无法回收。
  2. 由于客户端端口一般采用协议栈随机分配的方式,协议栈会给每个客户端连接分配一个未使用的端口,因此如果客户端同一IP对应的time_wait数量超过ip_local_port_range设置的最大值(也就是65000),端口将被用完,连接会无法建立。
    5.2 服务端大量time_wait影响
    由于服务端只占用监听端口,因此不存在端口用完的现象。服务端大量time_wait唯一影响是:资源不释放,内存无法回收。

6. cobar测试验证
本次测试结果采用sysbench.short来压测cobar来验证,客户端物理设备和服务端物理设备的ip_local_port_range(1024~65000)和tcp_max_tw_buckets(81920)参数都是默认值,测试结果如下:

  1. 当cobar服务端time_wait数达到81920的时候,任然可以继续接收客户端连接,能够正常提供连接服务。
  2. 当客户端测试工具sysbench.short服务器上的time_wait数达到60000多的时候,客户端连接失败,无法连接,因为端口用完。打印:Cannot assign requested address; Cobar服务器time_wait超限时打印:
    在这里插入图片描述
    Cobar服务器time_wait超限的情况下,客户端sysbench压测结果基本不受影响,如下:
    在这里插入图片描述
    从上面测试可以看出,服务端time_wait不会影响客户端建链,只是占用内存。如果是客户端出现大量time_wait状态,此时端口用完,则无法建立连接。以上测试结论符合理论、代码分析。

7. 三种解决time_wait方法总结
在这里插入图片描述
8. 使用建议

  1. 开启tcp_tw_reuse功能,这是端口重用的总开关,打开。
  2. tcp_timestamps需要根据实际情况进行设置,如果客户端和服务端都不会暴露给用户,则可以设置为1,如果是需要暴露给用户,只是内部使用,则建议开启端口重用功能。
  3. 服务端Tcp_max_tw_buckets参数根据内存情况进行调整,如果内存充足,采用默认值,内存不足可以适当调小该值。
  4. tcp_tw_recycle,快速回收功能,不建议开启,比较暴力。可以选择开启端口重用功能。
  5. 官方说明:https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值