tcp port numbers reused出现原因_TCP连接出现大量TimeWait状态的连接-原因解析

一. 问题背景

应用在高并发运行情况下出现大量TimeWait连接请求

# 统计命令:  # 统计已连接上的,状态为“established  netstat -na|grep ESTABLISHED|wc -l# 查看80端口连接数netstat -ant|grep -i "80"|wc -l# 如果需要统计tcp连接每种状态的连接的数量netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'复制代码

短时间后,所有的TIME_WAIT全部消失,被回收,端口包括服务,均正常。 即,在高并发的场景下,TIME_WAIT连接存在,属于正常现象。 线上场景中,持续的高并发场景

  • 一些部分TIME_WAIT连接被回收,但新的TIME_WAIT连接产生;
  • 一些极端情况下,会出现大量的TIME_WAIT

在出现大量TIME_WAIT的情况下,因为linux是基于文件的操作系统,维护每一个socket都需要创建一个文件,而每个进程最大能够打开的文件数是65535个,如果大于这个数量,如果使用Nginx这样的web服务器作为反向代理就会发生诸如:addres already in use:connect 异常。

二. 问题分析

  • 大量的##短连接##存在
  • 特变是HTTP请求中,如果connection头部取值被设置为close时,基本都是【服务端】发起主动关闭连接
  • 而,TCP四次挥手关闭连接机制中,为了保证ACK重发丢弃延迟数据,设置time_wait为2倍的MSL(报文最大存活时间)
  • 保持2个MSL时间,即4分钟;

三. 解决办法

  • 客户端,HTTP请求的头部,connection设置为keep-alive,保持存活一段时间:现在的浏览器,一般都这么进行了
  • 服务器端, 允许time_wait状态的socket被重用 #让TIME_WAIT状态可以重用,这样即使TIME_WAIT占满了所有端口,也不会拒绝新的请求造成障 echo "1" > /proc/sys/net/ipv4/tcp_tw_reuse #让TIME_WAIT尽快回收,我也不知是多久,观察大概是一秒钟 echo "1" > /proc/sys/net/ipv4/tcp_tw_recycle 复制代码 所见time_wait时间,设置为1MSL

*time_wait状态,存在的必要性

  • 可靠的实现 TCP 全双工连接的终止:四次挥手关闭 TCP 连接过程中,最后的 ACK 是由「主动关闭连接」的一端发出的,如果这个 ACK 丢失,则,对方会重发 FIN 请求,因此,在「主动关闭连接」的一段,需要维护一个 time_wait 状态,处理对方重发的 FIN 请求;
  • 处理延迟到达的报文:由于路由器可能抖动,TCP 报文会延迟到达,为了避免「延迟到达的 TCP 报文」被误认为是「新 TCP 连接」的数据,则,需要在允许新创建 TCP 连接之前,保持一个不可用的状态,等待所有延迟报文的消失,一般设置为 2 倍的 MSL(报文的最大生存时间),解决「延迟达到的 TCP 报文」问题;

附录:TCP三次挥手和四次握手

详细细节,参考:

  • TCP的三次握手与四次挥手(详解+动图)

具体示意图:

  1. 三次握手,建立连接过程
  2. 四次挥手,释放连接过程
37da8d917c377052e063dbc61b8442cc.png

几个核心疑问:

  1. time_wait 是「服务器端」的状态?or 「客户端」的状态?

RE:time_wait 是「主动关闭 TCP 连接」一方的状态,可能是「客服端」的,也可能是「服务器端」的
2. 一般情况下,都是「客户端」所处的状态;「服务器端」一般设置「不主动关闭连接」


作者:JeffDu
链接:https://juejin.cn/post/6904027349763751950
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP端口号被重用的原因可能是因为先前使用该端口的应用程序已经关闭或崩溃,导致该端口号变得可用。另外,一些应用程序可能会在同一台计算机上使用相同的端口号,但在不同的IP地址上进行监听,这也可能导致TCP端口号被重用。 ### 回答2: TCP端口号的重用是因为TCP连接的四元组——源IP、源端口号、目标IP、目标端口号——可以确定一个唯一的连接。但是,在TCP连接被断开后,这个四元组可以被操作系统重用,从而建立新的连接。这样做的原因是为了节省端口号的使用,避免系统占用过多的端口。 在实际应用中,TCP连接的创建和销毁频繁而快速,而TCP端口号是有限的资源。在时间内不可能用完所有的端口号,因此操作系统可以重用已经被关闭的连接的端口号,从而降低了系统开销。 TCP端口号被重用还有另外一种情况。在服务端应用程序关闭前,它还可能保留这个端口号并等待重新唤醒。这对于减少服务启动和停止的开销是非常有用的。此外,TCP端口号的重用还可以使连接建立更加快速,缩了用户的等待时间。 需要注意的是,TCP连接的四元组不同,即使是相同的端口号也不能进行重用。例如,如果新建一个连接的源IP、源端口号与之前的连接相同,但目标IP地址或目标端口号改变了,仍视为一个新的连接,系统会为它分配一个新的端口号。只有当TCP连接的四元组完全相同,包括状态和时间戳等信息时,系统才会认为这是同一条连接的重复使用。 ### 回答3: 网络通信中的TCP协议是一种面向连接通信的协议,它通过创建一条可靠的双向通信通道来进行数据传输。而TCP端口号就是用来标识每一条连接通道的。 TCP端口号是充分利用了网络资源的一项重要措施,允许多个进程同时使用网络上的同一个IP地址。在TCP协议中,每个端口号都对应着一个正在工作的进程,这些进程通过不同的端口号来实现在同一个IP地址下进行通信。 然而,在某些情况下,操作系统中的一个端口号已经被一个进程使用了,但是这个进程又被终止了,导致这个端口号就被占用了。这时候,如果另一个进程需要使用同一个端口号来进行通信,那么它就无法与网络上其他设备建立连接。为了解决这个问题,TCP协议允许端口号重用,即在一个进程结束后,其他进程仍然可以使用相同的端口号。 TCP端口号重用的出现原因主要有以下几点: 1. 提高资源利用率 端口号是有限资源,在同时需要进行大量TCP连接的情况下很容易出现资源不足的状况。为了提高资源的利用率,TCP端口号能够被重用,避免了由于资源缺造成的连接阻塞,确保网络通信的稳定性。 2. 快速建立连接 TCP协议允许端口号被重用,当进程结束后,其他进程不需要等待操作系统释放端口号,在同一端口上可以很快的建立连接,节约了时间。 3. 允许多进程并发监听同一端口 TCP协议允许多进程并发监听同一端口,这样做可以帮助用户构建高可用性的网络服务,不因为某一个进程的故障而影响其他进程的工作。 总之,TCP端口号重用能够有效地提高网络的利用率,加快连接速度,以及保障网络稳定性。但是在实际应用中,需要注意TCP端口号重用的次数和范围,以免出现数据冲突、复制等问题,影响用户体验和数据安全。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值