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)

大家都在看

  • Linux下使用压力测试工具stress

    首先解压安装包到/usr/local/src/下 mv stress-1.0.4.tar.gz /usr/local/src​tar -zxf stress-1.0.4.tar.g…

    Linux 2023年6月13日
    093
  • 多表查询练习题

    十道多表查询练习题 准备数据: 查询所有的课程的名称以及对应的任课老师姓名 查询姓李老师的个数 查询挂科超过两门(包括两门)的学生姓名和班级、查询选修了所有课程的学生姓名 post…

    Linux 2023年6月7日
    0104
  • 小白上手Linux系统Redis安装与部署教程

    一:Redis的安装 1.首先需要下载linux版的redis,官网地址:http://redis.io/download。 2.创建文件夹 mkdir+文件名 3.用ftp将压缩…

    Linux 2023年6月13日
    0142
  • podman无根用户基本设置和使用

    在允许没有root特权的用户运行Podman之前,管理员必须安装或构建Podman并完成以下配置 cgroup V2Linux内核功能允许用户限制普通用户容器可以使用的资源,如果使…

    Linux 2023年6月13日
    091
  • 初探paramiko

    paramiko模块简介 paramiko是基于SSHv2协议开发的,可用于连接远程SSH服务器,通过SSH连接执行远程命令或者文件传输。paramiko支持Python(2.7,…

    Linux 2023年6月7日
    086
  • 机器学习学习笔记之一:K最近邻算法(KNN)

    假定数据有M个特征,则这些数据相当于在M维空间内的点 [X = \begin{pmatrix} x_{11} & x_{12} & … & x_…

    Linux 2023年6月14日
    082
  • 定时任务调度

    一、crond任务调度 概述: 使用crontab 指令进行定时任务的设置,任务调度是指系统在某个时间端执行的特定任务或程序,例如:病毒扫描,数据库备份等 基本语法: cronta…

    Linux 2023年6月6日
    0136
  • 自定义 systemd service

    Red Hat Linux 自 7 版本后 采用systemd 形式取代原先 init ,用户可以参考 系统service 创建自己的service ,以便于日常统一管理,系统se…

    Linux 2023年6月6日
    0111
  • ztreejs树 metro风格 鼠标经过 显示用户自定义控件 新增,编辑,删除,向下,向上操作

    php;gutter:true; ztreejs树功能说明:自定义控件功能新增,编辑,删除,向下移动,向上移动已实现,只是前端,如果需要跟后台交互,封装对应的函数,在相应位置调用即…

    Linux 2023年6月7日
    089
  • 位图

    例题1 给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在 这40亿个数中。 首先肯定不能用传统的int数据存储 因为内存不够 40亿的整数大概为1…

    Linux 2023年6月13日
    093
  • 我叫MongoDb,不懂我的看完我的故事您就入门啦!

    这是mongo基础篇,后续会连续更新4篇 大家好我叫MongoDb,自从07年10月10gen团队把我带到这个世界来,我已经13岁多啦,现在越来越多的小伙伴在拥抱我,我很高兴。我是…

    Linux 2023年6月14日
    0129
  • ArchLinux安装-2022-01-12

    这篇教程,是我基于B站up住theCW的视频教程整理的,其中添加了一些我在安装n次之后的经验(虽然失败过几次,但我现在安装不会再出差错,所以请放心的看此教程) 当然,我认为theC…

    Linux 2023年6月13日
    0103
  • FusionCompute制作Linux虚拟机模板

    创建虚拟机 创建虚拟机下一步这里实验就创建红帽7.4选择存储磁盘精简创建先在存储上传红帽镜像挂载镜像VNC登录安装安装完成配置yum源安装bzip*(因为最小化安装没有bzip程序…

    Linux 2023年6月8日
    0143
  • 最短的可通过编译的C语言程序

    要求:写一个最短的,能通过编译的C语言程序,但不要求能正确运行。 一般人首先想到的是除0。即 除0会引发SIGFPE信号(浮点异常)。 我们也可以删掉return,但是这样做的话编…

    Linux 2023年6月14日
    090
  • 音视频技术入门课- 05 使用FFmpeg与OBS进行直播推流

    做直播推流的前提是要有直播服务器接收直播流,所以需要我们自己建设一个流媒体服务器。 流媒体服务器SRS SRS是一个简单高效的实时视频服务器,支持RTMP/WebRTC/HLS/H…

    Linux 2023年6月7日
    0113
  • IEEE浮点数标准

    IEEE浮点数标准 阅读笔记:Computer System : A Programmmer’s Perspective 基本概念 IEEE浮点数标准采用 [V=(-1…

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