文档章节

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

y
 y123456yz
发布于 05/19 14:05
字数 1697
阅读 389
收藏 15

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状态相关的参数有以下四个:

tcp_tw_recycle

表示开启TCP连接中time_wait的快速回收功能,默认为0,表示关闭;生效前提是必须启用本端和对端tcp_timestamps配置。

tcp_timestamps

时间戳选项,只有在该选项置1的时候tcp_tw_recycle才会生效。

tcp_max_tw_buckets

表示系统同时保持time_wait的最大数量,如果超过这个量,time_wait将打印警告信息。超限的时候后面产生的time_wait直接不处理,释放资源。注意:是新的连接直接释放资源,老的连接还是处于time_wait状态。

Tcp_tw_reuse

客户端大量time_wait状态存在时,端口被占用,当有新的连接,如果没有可用端口,则会连接失败。启用该功能后,可以复用time_wait状态的连接。客户端tcp_tw_reuse生效前提是启用本端和对端tcp_timestamp。

 

Tcp_tw_reuse端口重用功能一般只针对客户端,因为服务端一般都是监听固定端口,端口数是固定的,端口不会用完。而客户端每次连接端口一般都是由协议栈自动分配。

 

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. 测试验证

      本次测试结果采用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方法总结

 

Time_wait快速回收

端口重用

限制Tcp_max_tw_buckets

配置方法

在需要进行time_wait快速回收的一端进行一下配置:

tcp_tw_recycle:1

本端tcp_timestamps:1

对端tcp_timestamps:1

在需要进行time_wait快速回收的一端进行一下配置:

tcp_tw_reuse1

本端tcp_timestamps:1

对端tcp_timestamps:1

配置Tcp_max_tw_buckets

的值在60000以下。例如配置为30000

副作用

在某些情况下可能引起用户建连接失败(例如需要直接返回给用户信息的服务器)

比较暴力,不符合TCP协议规范

在某些情况下可能引起用户建连接失败(例如需要直接返回给用户信息的服务器

部署复杂,需要同时改服务端,而服务端比较多。

服务器时间戳会带出IDC,经过中间各种网络设备,尤其是运营商的无线设备等,如果某个设备对时戳有校验,则会产生丢包问题。

比较暴力,不符合TCP协议规范

应急的处理,立竿见影。

建议这种。

 

© 著作权归作者所有

y
粉丝 15
博文 5
码字总数 17711
作品 0
杭州
架构师
私信 提问
加载中

评论(2)

莫那鲁道
大佬牛逼
宅大喵
宅大喵
消灭0评论
tcp的复杂机制

懂socket编程的人不一定理解tcp协议,实际上很多计算机编程高手都不一定懂tcp协议,编程高手很多都是对api很理解,对于api下面的机制就不一定理解了,我是一个学网络出身的人,在我会用java或...

晨曦之光
2012/04/10
128
0
当心!TCP本机客户端连接本机服务器

上周,在我们进行性能测试的时候,发现了一个问题。 我们的服务器上启了一个redis服务端,侦听0.0.0.0的1234端口,同处在本机的另外一个进程会频繁发起到该服务端的短连接,结果导致了两个问...

dog250
2015/09/27
0
0
Linux内核Socket参数调优

可调优的内核变量存在两种主要接口:sysctl命令和/proc文件系统,proc中与进程无关的所有信息都被移植到sysfs中。IPV4协议栈的sysctl参数主要是sysctl.net.core、sysctl.net.ipv4,对应的/pr...

China_OS
2013/03/21
0
0
Linux内核TCP/IP参数分析与调优

如图展示的是TCP的三个阶段.1,TCP三次握手. 2,TCP数据传输. 3,TCP的四次挥手. SYN:(同步序列编号,Synchronize Sequence Numbers)该标志仅在三次握手建立的时候有效。表示一个新的TCP连接请求...

shanker
2016/01/13
0
0
Nginx10m+高并发内核优化详解

何为高并发 默认的Linux内核参数考虑的是最通用场景,不符合用于支持高并发访问的Web服务器,所以需要修改Linux内核参数,这样可以让Nginx拥有更高的性能; 在优化内核时,可以做的事情很多,...

喵来个鱼
03/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux的基本命令

目录的操作命令(增删改查) 增: mkdir 目录名称; 查: ls 可以看到该目录下的所有的目录和文件 ls -a,可以看到该目录下的所有文件和目录,包括隐藏的 ls -l,可以看到该目录下的所有目录和...

凹凸凸
今天
2
0
在古老unix中增加新用户

Installing 4.3 BSD Quasijarus on SIMH 目标:要在4.3BSD中新增加用户dmr,指定目录/home/dmr,uid为10 gid=31(guest组,系统已建立) 4.3BSD还没有adduser或useradd 直接修改/etc/passwd...

wangxuwei
今天
2
0
Bootstrap(六)表单样式

基本样式 所有设置了 .form-control 类的 <input>、<textarea> 和 <select> 元素都将被默认设置宽度属性为 width: 100%;。 将 label 元素和前面提到的控件包裹在 .form-group 中可以获得最好...

ZeroBit
昨天
3
0
SSL 证书格式转换

SSL 证书格式转换 不同服务器情况下,需要不同的证书格式。 比如 pem 转 pfx。 pem在window 平台下可以导入,但是无法正常使用。 需要转换成pfx。 推荐在线转换工具,由中国数字证书网站提供...

DrChenXX
昨天
2
0
HAProxy

xx

Canaan_
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部