当前位置: 首页 > news >正文

大量TCP连接滞留TIME_WAIT、SYN_SENT、CLOSE_WAIT状态的分析

文章目录

  • 一、统计各类状态的tcp连接数量
  • 二、TIME_WAIT
    • 应用服务器上,来自反向代理的连接
    • 反向代理上,访问应用服务的连接
    • 反向代理上,来自用户的连接
  • 三、SYN_SENT
    • 反向代理上,访问位于防火墙另一侧的目标
    • 反向代理上,访问无防火墙阻断的目标
  • 四、CLOSE_WAIT
    • 应用服务器上,来自反向代理的连接

本文记录在nginx、tomcat服务器上一些处理异常TCP连接的方案

一、统计各类状态的tcp连接数量

ss、netstat两个工具都能统计:

ss -ant | awk '{print $1}' | sort | uniq -cnetstat -ant | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

二、TIME_WAIT

应用服务器上,来自反向代理的连接

原因:从nginx发起的请求,申明的是http 1.0版本的协议(或者请求头的Connection字段指是Close),则tomcat响应完请求后会主动断开tcp连接

方案:nginx http_proxy模块的proxy_http_version配置默认使用http 1.0协议访问upstream实例,需要修改为1.1

proxy_connect_timeout 3s;
proxy_http_version 1.1;
# 通知客户端,连接保持60s;服务端实际在75s后才会主动关闭连接;
# 如果不设置第二个参数来返回空闲长连接的超时建议,有的客户端不会利用http连接池来长期保持空闲连接
keepalive_timeout 75s 60s;
# 要与请求端保持http1.1通讯,就不能关闭chunked机制;
# 否则nginx会在完成响应后主动关闭与请求端的tcp连接,相当于退化为http1.0协议
chunked_transfer_encoding on;upstream myapp {# nginx与upstream服务器之间的空闲长连接数量(默认最多保持60s)keepalive 20;server 10.0.0.1:8080;server 10.0.0.2:8080;
}server {listen 80 default;location / {proxy_pass http://myapp;# 请求头指定HTTP 1.1协议,并且Connection不为Close时,# 对方完成响应后才不会主动断开TCP连接proxy_http_version 1.1;proxy_set_header Connection '';proxy_set_header Cookie $http_cookie;proxy_set_header Host $host;proxy_set_header X-Forwarded-For ${proxy_add_x_forwarded_for};}
}

反向代理上,访问应用服务的连接

原因:nginx使用http 1.1协议访问upstream实例后,如果未开启空闲连接复用机制,就会主动关闭tcp连接

方案:nginx upstream模块的keepalive配置默认未开启,需要主动提供一个数值

反向代理上,来自用户的连接

原因1:在请求端(浏览器、http请求框架)默认开启连接池并使用http 1.1协议的情况下,如果nginx关闭了http 1.1协议的chunked_transfer_encoding机制,那么在完成请求后,nginx会主动断开与请求端的连接

方案:不要关闭chunked_transfer_encoding

原因2:未返回建议客户端保持连接的时长(response header里的Keep-Alive: timeout=time),导致用户的客户端迟迟不断开空闲连接,最终由nginx来主动断开连接,把TIME_WAIT留在了nginx服务器上

方案:keepalive_timeout配置最长空闲时间和建议客户端保持连接的时长,让客户端知道应该在什么时间之前关闭空闲连接

三、SYN_SENT

反向代理上,访问位于防火墙另一侧的目标

原因:telnet目标端口时,命令阻塞(未立即得到目标未开通此端口的响应),证明SYN包被防火墙drop了

方案:申请防火墙策略

反向代理上,访问无防火墙阻断的目标

原因1:目标tomcat服务器已接收(springboot应用的server.tomcat.max-connections配置,默认10000)的http连接数量、在服务端口排队等待accept(操作系统的net.core.somaxconn配置,默认128或1024)的tcp socket数量,都达到上限后,后续到达服务端口的SYN包会被丢弃,请求端的连接状态保持为SYN_SENT

方案:在使用webflux、websocket等响应式IO框架时,可调大server.tomcat.max-connections配置

原因2:telnet目标端口时,命令阻塞(未立即得到目标未开通此端口的响应),证明目标服务器上使用iptables对访问服务端口的请求进行了DROP处理

方案:使用iptables规则把请求方IP加入放行名单

原因3:应用服务的进程已处理的文件句柄(包含tcp socket)数量超过限额

# 查看当前用户下单进程的文件句柄限额
ulimit -n

方案:编辑/etc/security/limits.conf文件,重启应用服务进程

四、CLOSE_WAIT

应用服务器上,来自反向代理的连接

原因:应用程序开了端口,但是后续初始化失败(比如没有成功连接配置中心、服务注册中心、数据库等原因),accept socket的逻辑没运行起来;
已建立的请求放在服务端口待accept的backlog(操作系统的net.core.somaxconn配置)里,收到的请求内容放在操作系统tcp buffer里;
迟迟得不到应用程序处理并响应后,客户端发出FIN指令,服务端响应ACK后,服务端连接进入CLOSE_WAIT状态,由于tcp buffer里的数据没有被处理,所以服务端没有继续回复FIN,连接以CLOSE_WAIT状态滞留在服务端口待accept的backlog里;
在backlog塞满之前,应用服务端口实际处于可以连接但是不能响应的假死状态

方案:对部署的应用进行readyness定时探测,及时发现未成功初始化的应用

相关文章:

大量TCP连接滞留TIME_WAIT、SYN_SENT、CLOSE_WAIT状态的分析

文章目录 一、统计各类状态的tcp连接数量二、TIME_WAIT应用服务器上,来自反向代理的连接反向代理上,访问应用服务的连接反向代理上,来自用户的连接 三、SYN_SENT反向代理上,访问位于防火墙另一侧的目标反向代理上,访问…...

kotlin怎么定义类

在Kotlin中,你可以使用class关键字来定义一个类。以下是一个简单的例子: class MyClass {// class body} 这个例子定义了一个名为MyClass的类。你可以在类体中定义属性和方法。 如果你想定义一个带有属性的类,你可以这样做: cla…...

如何查看数据集下载后保存的绝对路径?

1.问题 当我们下载torchvision.datasets里面的数据集时,有时候会遇到找不到数据集保存路径的问题。 2.解决 引入os库 import os调用如下方法 os.path.abspath(数据集对象.root)以下面代码为例 import os import torchvision.datasets as datasets# 指定数据集…...

使用php实现微信登录其实并不难,可以简单地分为三步进行

使用php实现微信登录其实并不难,可以简单地分为三步进行。 第一步:用户同意授权,获取code //微信登录public function wxlogin(){$appid "";$secret "";$str"http://***.***.com/getToken";$redirect_uriu…...

【LeetCode-中等题】24. 两两交换链表中的节点

文章目录 题目方法一:递归方法二:三指针迭代 题目 方法一:递归 图解: 详细版 public ListNode swapPairs(ListNode head) {/*递归法:宗旨就是紧紧抓住原来的函数究竟返回的是什么?作用是什么即可其余的细枝末节不要细究,编译器…...

5.10 汇编语言:汇编过程与结构

过程的实现离不开堆栈的应用,堆栈是一种后进先出(LIFO)的数据结构,最后压入栈的值总是最先被弹出,而新数值在执行压栈时总是被压入到栈的最顶端,栈主要功能是暂时存放数据和地址,通常用来保护断点和现场。 栈是由CPU管…...

【每日一题Day304】LC1267统计参与通信的服务器 | 哈希表

统计参与通信的服务器【LC1267】 这里有一幅服务器分布图,服务器的位置标识在 m * n 的整数矩阵网格 grid 中,1 表示单元格上有服务器,0 表示没有。 如果两台服务器位于同一行或者同一列,我们就认为它们之间可以进行通信。 请你统…...

深度解读零信任身份安全—— 全面身份化:零信任安全的基石

事实上,无论是零信任安全在数据中心的实践,还是通用的零信任安全架构实践,全面身份化都是至关重要的,是“企业边界正在瓦解,基于边界的安全防护体系正在失效”这一大背景下,构筑全新的零信任身份安全架构的…...

音视频 ffmpeg命令提取音视频数据

保留封装格式 ffmpeg -i test.mp4 -acodec copy -vn audio.mp4 ffmpeg -i test.mp4 -vcodec copy -an video.mp4提取视频 保留编码格式:ffmpeg -i test.mp4 -vcodec copy -an test_copy.h264 强制格式:ffmpeg -i test.mp4 -vcodec libx264 -an test.h2…...

vscode 配置

vscode 配置 安装插件 Better C SyntaxC/CCMake、CMake Tools 、CMake Language SupportDoxygen Documentation GeneratorGit Graphhighlight-wordsPythonvscode-iconsClang-Format和clangdtyporahex editor .vscode 中的文件 在 VS Code 中,.vscode​ 文件夹是用于…...

企业数字化管控平台及信息化治理体系建设方案(附300份方案)

本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除,更多浏览公众号:智慧方案文库 数字化校园整体解决方案.doc150页6万字数字化智能工厂信息化系统集成整合规划建设方案.docx2022年采购数字化市场研究报告…...

ABB PCD231B通信输入/输出模块

多通道输入和输出: PCD231B 模块通常配备多个输入通道和输出通道,用于连接传感器、执行器和其他设备。 通信接口: 这种模块通常支持各种通信接口,如以太网、串口(RS-232、RS-485)、Profibus、CAN 等&#…...

在springboot项目中显示Services面板的方法

文章目录 前言方法一:Alt8快捷键方法二:使用Component标签总结 前言 在一个springboot项目中,通过开启Services面板,可以快速的启动、配置、管理多个子项目。 方法一:Alt8快捷键 1、在idea界面输入Alt8,在…...

spring之AOP简介

1.AOP简介 什么是AOP Aspect Oriented Program面向切面编程在不改变原有逻辑上增加额外的功能,比如解决系统层面的问题,或者增加新的功能 场景 权限控制缓存日志处理事务控制 AOP思想把功能分两个部分,分离系统中的各种关注点 核心关注点&a…...

ros::init用途用法

文章目录 用途:用法:ros::init 是 ROS(Robot Operating System)中的一个重要函数,它用于初始化 ROS 节点。在启动任何 ROS 节点之前,都必须首先调用这个函数。以下是其用途和基本用法。 用途: 节点初始化:为ROS系统中的节点进行初始化。一个节点是ROS计算图中的一个可…...

逻辑回归的含义

参考:线性回归 & 逻辑回归 问题 1、线性回归(Linear Regression)和逻辑回归(Logistic Regression)有什么联系? 2、逻辑回归的“逻辑”、“回归是什么意思”? 回答1 线性回归假设因变量…...

解决Apache Tomcat “Request header is too large“ 异常 ‍

🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

腾讯音乐如何基于大模型 + OLAP 构建智能数据服务平台

本文导读: 当前,大语言模型的应用正在全球范围内引发新一轮的技术革命与商业浪潮。腾讯音乐作为中国领先在线音乐娱乐平台,利用庞大用户群与多元场景的优势,持续探索大模型赛道的多元应用。本文将详细介绍腾讯音乐如何基于 Apach…...

Java 16进制字符串转换成GBK字符串

问题: 现在已知有一个16进制字符串 435550D3C3D3DAD4DABDBBD2D7CFECD3A6CFFBCFA2D6D0B4E6B7C5D5DBBFDBD0C5CFA2A3ACD5DBBFDBBDF0B6EE3130302E3036 而且知道这串的字符串对应的内容是: CUP用于在交易响应消息中存放折扣信息,折扣金额100.06 但…...

【ES6】JavaScript中的Symbol

Symbol是JavaScript中的一种特殊的、不可变的、不可枚举的数据类型。它通常用于表示一个唯一的标识符,可以作为对象的属性键,确保对象的属性键的唯一性和不可变性。 Symbol.for()是Symbol的一个方法,它用于创建一个已经注册的Symbol对象。当…...

接口测试中缓存处理策略

在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容:参考网站: PID算法控制 PID即:Proportional(比例)、Integral(积分&…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中,拉取视频流只要求udp方式,从2016开始要求新增支持tcp被动和tcp主动两种方式,udp理论上会丢包的,所以实际使用过程可能会出现画面花屏的情况,而tcp肯定不丢包,起码…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...