tcp 连接 time-wait 状态过多问题解释

前言

tcp 连接 time-wait 状态过多问题解释

两条竖线分别是表示:

  • 主动关闭(active close)的一方
  • 被动关闭(passive close)的一方

网络上类似的图有很多,但是有的细节不够,有的存在误导。有的会把两条线分别标记成 client 和 server。给读者造成困惑。对于断开连接这件事,客户端和服务端都能作为主动方发起,也就是 active close 可以是客户端,也可以是服务端。而对端相应的就是 passive close。不管谁发起,状态迁移如上图。

问题描述

模拟高并发的场景,会出现批量的 time-wait 的 tcp 连接:

tcp 连接 time-wait 状态过多问题解释

短时间后,所有的 time-wait 全都消失,被回收,端口包括服务,均正常。即,在高并发的场景下,time-wait 连接存在,属于正常现象。

线上场景中,持续的高并发场景:

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

所以,上述大量的 time-wait 状态 tcp 连接,有什么业务上的影响吗?

Nginx 作为反向代理时,大量的短链接,可能导致 Nginx 上的 tcp 连接处于 time_wait 状态:

  • 每一个 time_wait 状态,都会占用一个本地端口,上限为 65535(16 bit,2 Byte);
  • 当大量的连接处于 time_wait 时,新建立 tcp 连接会出错,address already in use : connect 异常;

统计 tcp 连接的状态:

// 统计:各种连接的数量
$ netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
ESTABLISHED 1154
TIME_WAIT 1645

tips: tcp 本地端口数量,上限为 65535 ,这是因为 tcp 头部使用 16 bit 存储端口号,因此约束上限为 65535。

问题分析

大量的 time-wait 状态 tcp 连接存在,其本质原因是什么?

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

time-wait 状态:

  • tcp 连接中,主动关闭连接的一方出现的状态;(收到 FIN 命令,进入 time-wait 状态,并返回 ACK 命令)
  • 保持 2 个 MSL 时间,即 4 分钟;(MSL 为 2 分钟)

解决办法

解决上述 time_wait 状态大量存在,导致新连接创建失败的问题,一般解决办法:

  • 客户端,HTTP 请求的头部,connection 设置为 keep-alive,保持存活一段时间,现在的浏览器,一般都这么进行了;
  • 服务器端,允许 time_wait 状态的 socket 被重用;
  • 服务器端,缩减 time_wait 时间,设置为 1 MSL;(即 2 分钟)

顺便提一嘴服务端出现大量 close_wait 的原因。多是由于服务端处理请求耗时过长,导致客户端超时,发起关闭链接,导致服务端大量的 close_wait。

参考链接:https://www.zhihu.com/question/298214130

Original: https://www.cnblogs.com/jmcui/p/15657676.html
Author: JMCui
Title: tcp 连接 time-wait 状态过多问题解释

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/621756/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • cmake 入门笔记

    1. cmake 是什么? 这些年大型 C/C++ 工程都纷纷转到了 cmake 环境下,那么这个工具到底有什么魅力吸引着大家呢?无它,软件工程崇尚实用主义,而 cmake 的功能…

    Linux 2023年6月6日
    0102
  • KMS官网链接(无毒)

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月7日
    087
  • linux 应用程序直接读写寄存器或物理内存

    1.程序说明: 调试驱动程序时,经常遇到候需要查看或设置寄存器的情况,但是直接更改内核代码又不方便。 这里提供一个应用程序源码能在应用层访问底层寄存器。(网上找到的,进行过更改)。…

    Linux 2023年6月6日
    0183
  • Dubbo + ZooKeeper

    16 Dubbo + ZooKeeper 16.1 Dubbo下载 GigHub下载地址: https://github.com/apache/dubbo-admin/tree/m…

    Linux 2023年6月14日
    077
  • 如何访问github.io类的网站

    上网查找后看到有两种说法: 找到/etc/hosts文件,Windows一般在/Windows/System32/drivers/etc目录下,MAC在/private/etc目录…

    Linux 2023年6月8日
    0111
  • make

    make 背景 gcc 在编译一个包含多个源文件的工程时, gcc需要将每一个源文件都编译一遍,任何再链接起来形成一个可执行文件。实际上,用户很少对所有源文件都进行修改,这就会造成…

    Linux 2023年6月7日
    095
  • Linux系统查看磁盘可用空间的5个命令

    大家好,我是良许。 工作中,经常会遇到磁盘爆满的情况,尤其是一台服务器运行了 N 年之后,里面会充满各种各样垃圾文件,比如:编译产生的中间文件、打包的镜像文件、日志文件,等等。 别…

    Linux 2023年5月27日
    0121
  • Ubuntu 18.04安装sysv-rc-conf

    sudo nano /etc/apt/sources.list 加入deb http://archive.ubuntu.com/ubun…

    Linux 2023年6月13日
    080
  • 【MQTT】阿里云搭建MQTT物联网平台通信

    MQTT环境搭建和测试 物联网环境搭建 MQTT.fx使用 物联网环境搭建 1.首先进入阿里云官网注册并登录你的账号。2.点击控制台。3.在产品与服务下面搜索物联网平台4.点击公共…

    Linux 2023年6月13日
    080
  • 阅读习惯2(选做)

    任务详情 参考https://www.cnblogs.com/rocedu/p/6528920.html 提交微信读书(或其他平台)目前的读书数据(总时长,册数,笔记数等)的截图,…

    Linux 2023年6月8日
    093
  • CentOS7安装MySQL5.7并配置账户等

    注意: 有的Centos版本默认安装了mariadb, 可以先将其卸载 检查mariadb是否安装 yum list installed | grep mariadb 卸载mari…

    Linux 2023年6月6日
    072
  • WPF 将控件放入到 UserControl 里获取 HwndSource 为空的情况

    本文记录将 WPF 控件放入到 UserControl 里,如果此 UserControl 没有被设置 Visibility 为可见过,那么放在此 UserControl 内的控件…

    Linux 2023年6月6日
    083
  • 互斥锁与多线程间共享全局变量

    互斥锁 一、 代码展示 ① 没加锁(X) import threading num = 0 def write1(): global num i = 1 while i 运行结果 …

    Linux 2023年6月14日
    0106
  • rtmp和rtsp的区别

    刚刚接触到视频推流,搞不清楚rtmp和rtsp到底有什么区别 1.视频传输 RTSP+RTP主要用于IPTV,原因是传输数据使用的是UDP,在网络环境比较稳定的情况下,传输效率是比…

    Linux 2023年6月8日
    093
  • WEB自动化-12-Cypress 调试

    12 调试 Cypress的测试代码和被测试程序在同一生命周期中的浏览器中,也就是意味着,可以使用浏览器的开发者工具直接参与调试。Cypress提供了几种调试方法,分别为: deb…

    Linux 2023年6月7日
    079
  • OpenResty入门

    OpenResty介绍 OpenResty通过汇聚各种设计精良的 Nginx模块(主要由 OpenResty 团队自主开发),从而将 Nginx 有效地变成一个强大的通用 Web …

    Linux 2023年6月8日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球