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)

大家都在看

  • 【C++基础】数据类型

    C++规定在创建一个变量或者产量时,必须要指定相应的数据类型,否则无法给变量分配内存空间 数据类型的存在意义:给变量分配合适的内存空间 整型 作用:整型变量表示的是整数类型的数据 …

    Linux 2023年6月13日
    0101
  • Redis分布式锁的N种姿势

    Redis几种架构 Redis发展到现在,几种常见的部署架构有: 单机模式; 主从模式; 哨兵模式; 集群模式; 我们首先基于这些架构讲解Redisson普通分布式锁实现,需要注意…

    Linux 2023年5月28日
    0112
  • MySQL slow log 慢日志

    sql慢日志用于记录执行时间超过指定阈值的SQL,对于系统性能和故障排错非常有帮助 1.如何开启sql慢日志 –开启slow log …

    Linux 2023年6月6日
    079
  • Redis集群架构

    Replication+Sentinel 这里Sentinel的作用有三个: 监控:Sentinel 会不断的检查主服务器和从服务器是否正常运行。 通知:当被监控的某个Redis服…

    Linux 2023年5月28日
    0101
  • sql注入

    一.原理 SQL注入攻击指的是通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有…

    Linux 2023年6月6日
    095
  • c++智能指针的使用,shared_ptr,unique_ptr,weak_ptr

    c++智能指针的使用 官方参考 普通指针的烦恼:内存泄漏,多次释放,提前释放 智能指针 负责自动释放所指向的对象。 三种智能指针 shared_ptr,unique_ptr,wea…

    Linux 2023年6月14日
    0134
  • 节约内存:Instagram的Redis实践(转)

    1.M emcached 内存Key-Value Cache Redis 内存数据库 四,节约内存:Instagram的Redis实践 Instagram可以说是网拍App的始祖级…

    Linux 2023年5月28日
    0100
  • 最新版Linux以root登陆后,无声音、桌面无图标的原因分析

    近两年几乎所有的Linux发行版,以root登陆后无声音、桌面无图标。 声音好处理,这是因为声音服务程序因为安全问题, 不推荐在Root环境下运行; 且本身Linux并不推荐在Ro…

    Linux 2023年6月14日
    0173
  • 系统架构的11条原则

    基本原则 原则一:价值为王 解析: 价值为王的另一种说法叫做YAGNI。YAGNI 是 You aren’t gonna need it 的缩写。该原则的基本含义就是,…

    Linux 2023年6月14日
    0124
  • win的系统自动启动任务计划!!!

    posted @2022-04-19 16:56 钟小川 阅读(18 ) 评论() 编辑 Original: https://www.cnblogs.com/zhongxiaoch…

    Linux 2023年6月13日
    090
  • 删除数据库表中重复数据的方法

    一直使用Postgresql数据库,有一张表是这样的: DROP TABLE IF EXISTS "public"."devicedata"…

    Linux 2023年6月6日
    0101
  • 代码审计-PHP反序列化漏洞

    什么是序列化 序列化可以实现将对象压缩并格式化,方便数据的传输和存储。为什么要序列化?PHP 文件在执行结束时会把对象销毁,如果下次要引用这个对象的话就很麻烦,所以就有了对象序列化…

    Linux 2023年6月6日
    0121
  • Django_渲染详解

    Django_render 模板语法 模板引擎是一种可以让开发者把服务端数据填充到html网页中完成渲染效果的技术。它实现了把前端代码和服务端代码分离的作用,让项目中的业务逻辑代码…

    Linux 2023年6月7日
    0138
  • WEB自动化-04-Cypress 测试用例编写和组织

    4 测试用例编写和组织 4.1 用例结构 Cypress是建立在 Mocha和 Chai之上,因此同时支持Chai的 BDD和 TDD两种风格。如果你熟悉JavaScript风格的…

    Linux 2023年6月7日
    0118
  • [LINUX] 像电影里的黑客一样用 terminal 作为日常开发

    1、效果预览 2、具体实现 2.1 定位鼠标位置 2.2 获取屏幕位置 2.3 计算鼠标在哪个窗口 2.4 1920×1080 平铺效果设计 2.5 1280×…

    Linux 2023年6月8日
    0133
  • 学习一下 JVM (一) — 了解一下 JVM 基本概念

    一、JVM 基本认识 1、虚拟机 与 JVM (1)虚拟机(Virtual Machine),可以理解为一台虚拟的计算机,其是一款软件,用来执行一系列虚拟的计算机指令。可以分为:系…

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