解决TCP连接数过多的问题

2023-10-29

1、建立连接协议(三次握手)
(1)客户 端发送一个带SYN标志的TCP报文到服务器。这是三次握手过程中的报文1。

(2) 服务器端回应客户端的,这是三次握手中的第2个报文,这个报文同时带ACK标志和SYN标 志。因此它表示对刚才客户端SYN报文的回应;同时又标志SYN给客户端,询问客户端是否准备好进行数据通 讯。

(3) 客户必须再次回应服务段一个ACK报文,这是报文段3。

2、连接终止协议(四次握手)
   由于TCP连 接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终 止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接 在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。

 (1) TCP客 户端发送一个FIN,用来关闭客户到服务器的数据传送(报文段4)。
 (2) 服务器收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一 样,一个FIN将占用一个序号。
 (3) 服务器关闭客户端的连接,发送一个FIN给客户端(报文段6)。
 (4) 客户段发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)。

CLOSED: 这个没什么好说的了,表示初始状态。

LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处 于监听状态,可以接受连接了。

SYN_RCVD: 这个状态表示接受到了SYN报 文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手 过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文 后,它会进入到ESTABLISHED状态。

SYN_SENT: 这个状态与SYN_RCVD遥想呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。

ESTABLISHED:这个容易理解了,表示连接已经建立了。

FIN_WAIT_1: 这个状态要好好解释一下,其实FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报 文。而这两种状态的区别是:FIN_WAIT_1状态实际上是当SOCKET在ESTABLISHED状态时,它想主动关闭连接,向对方发送了FIN报文,此时该SOCKET即进入到FIN_WAIT_1状态。而当对方回应ACK报文后,则进入到FIN_WAIT_2状态,当然在实际的正常情况 下,无论对方何种情况下,都应该马上回应ACK报文,所以FIN_WAIT_1状态一般是比较难见到的,而FIN_WAIT_2状态还有时常常可以用netstat看到。

FIN_WAIT_2:上面已经详细解释了这种状态,实际上FIN_WAIT_2状态下的SOCKET,表示半连接,也即有一方要求close连接,但另外还告诉对方,我暂时还有点 数据需要传送给你,稍后再关闭连接。

TIME_WAIT: 表示收到了对方的FIN报 文,并发送出了ACK报文,就等2MSL后即可回到CLOSED可用状态了。如果FIN_WAIT_1状态下,收到了对方同时带FIN标 志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态。

CLOSING: 这种状态比较特殊,实际情况中应该是很少见,属于一种比较罕见的例外状态。正常情况下,当你发 送FIN报文后,按理来说是应该先收到(或同时收到)对方的ACK报 文,再收到对方的FIN报文。但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报 文,反而却也收到了对方的FIN报文。什么情况下会出现此种情况呢?其实细想一下,也不难得出结论:那就是如果双方几乎在同时close一 个SOCKET的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭SOCKET连接。

CLOSE_WAIT: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方close一 个SOCKET后发送FIN报文给自己,你系统毫无疑问地会回应一个ACK报文 给对方,此时则进入到CLOSE_WAIT状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话, 那么你也就可以close这个SOCKET,发送FIN报文给对方,也即关闭连接。所以你在CLOSE_WAIT状态下,需要完成的事情是等待你去关闭连接。

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送FIN报 文后,最后等待对方的ACK报文。当收到ACK报文后,也即可以进入到CLOSED可用状态了。

服务器上出现大量的close_wait的例子和解决方法(例子从网上找的,基本差不多)

oracle9i@RHEL3oracle9i]$ /usr/sbin/lsof -i | grep 6800
oracle    22725 oracle9i    3u IPv4 18621468       TCP RHEL3:6800 (LISTEN)
oracle    22725 oracle9i    4u IPv4 18621469       TCP RHEL3:6800->RHEL3:2174 (CLOSE_WAIT)
oracle    22725 oracle9i    8u IPv4 18621568       TCP RHEL3:6800->RHEL3:2175 (CLOSE_WAIT)
oracle    22725 oracle9i    9u IPv4 18621578       TCP RHEL3:6800->RHEL3:2176 (CLOSE_WAIT)
oracle    22726 oracle9i    3u IPv4 18621468       TCP RHEL3:6800 (LISTEN)
oracle    22726 oracle9i    4u IPv4 18621469       TCP RHEL3:6800->RHEL3:2174 (CLOSE_WAIT)
oracle    22726 oracle9i    8u IPv4 18621568       TCP RHEL3:6800->RHEL3:2175 (CLOSE_WAIT)
oracle    22726 oracle9i    9u IPv4 18621578       TCP RHEL3:6800->RHEL3:2176 (CLOSE_WAIT)

[oracle9i@RHEL3 oracle9i]$ kill -9 22725

# 22725, 22726就是使用该6800端口的进程号(PID)。
[oracle9i@RHEL3 oracle9i]$ /usr/sbin/lsof -i | grep 6800

进程被kill时,会释放占用的所有链接句柄。

该问题的出现原因网上到处都是,也就是Socket的Client端出现异常没有Close就退出了。
//上面这句话不太准确,应该是被动关闭连接一端没有closesocket就退出了,此时被动关闭一端就处于close_wait 状态


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决TCP连接数过多的问题 的相关文章

  • 删除连接到另一表 SQL 的一个表中的记录

    我有两个表 一个包含 212 000 条记录 已弃用的记录 另一个包含 10 500 000 条记录 我想在 id 和 version number 字段上连接两个表 因为两个表都有这些字段 我希望从连接表中删除匹配的记录 来自连接表 即从
  • Oracle:如何获取刚刚插入的行的序列号?

    如何获取刚刚插入的行的序列号 插入 返回 declare s2 number begin insert into seqtest2 x values aaa returning seq into s2 dbms output put lin
  • 从函数内的 SELECT 返回一个变量

    我正在尝试创建一个返回 varchar 的函数 其中一个字段形成一个选择 即聚合字段 我收到下一个错误 ORA 01422 exact fetch returns more than requested number of rows 我的理
  • 如何获取 Oracle 上 SYSDATE 的 UTC 值

    可能是一个经典 您知道在 Oracle 上检索 SYSDATE 的 UTC 值的简单技巧吗 最好也能在第 8 版上工作 现在我有自定义函数 Cheers Stefan 您可以使用 SELECT SYS EXTRACT UTC TIMESTA
  • Windows 上良好的 Oracle 数据库开发和管理工具 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找像 sql server management studio 这样的 Oracle 数据库管理工具 我在互联网上搜索并在以下链接
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • PL/SQL 中无法选择 count(*)

    DECLARE rec count integer default 0 str varchar 100 BEGIN str select count into rec count from emp table EXECUTE IMMEDIA
  • SQL 按 IN 子句中的元素排序

    我有一个ITEM表 我想返回按 IN 子句中通知的相同顺序排序的结果 这些 ID 由用户告知 今天我有这个 SELECT FROM ITEM WHERE ITEM ID IN 45 2 671 6 ORDER BY CASE ITEM ID
  • 无法在 SQL Developer 中打开 View->DBA 菜单(已安装 Oracle 12C 标准版)

    我已经安装了Oracle 12C标准版 那里一切正常 我还连接了Oracle SQL Developer Client 4 0 从中我可以访问表 索引等 我试图通过单击 View gt DBA 菜单从 SQL Developer Clien
  • 如何使用 tnsname 从 Ant 连接到 Oracle 数据库?

    我正在寻找类似于 Ant sql 任务的东西 但它将接受以下格式的 JDBC url jdbc oracle thin TNS NAME 一种可能的方法似乎是编写我自己的 Ant 任务 该任务使用 OracleDataSource 来创建连
  • 在包之间传递关联数组作为参数

    我有两个单独的 Oracle v9 2 PL SQL 包 并且我试图将 package1 中的过程中的关联数组 即索引表 作为参数传递给 package2 中的过程 这可能吗 我不断得到PLS 00306 wrong number or t
  • Golang SSL TCP套接字证书配置

    我正在创建一个 Go TCP 服务器 不是 http s 并且尝试将其配置为使用 SSL 我有一个 StartCom 免费 SSL 证书 我正在尝试使用它来完成此任务 我的服务器代码如下所示 cert err tls LoadX509Key
  • 如何查明选择补助金是直接获得还是通过角色获得

    Oracle 中的陷阱之一是 有时如果在 SQLplus 中运行查询 则可以从表中进行选择 但从存储过程运行查询时则不能 为了从存储过程运行查询 您需要对象的直接授权 而不是通过角色获得的授权 如果我在 all tables 视图中看到一个
  • UNION 与 WHERE 子句

    我正在做一个UNIONOracle 数据库上的两个查询 他们俩都有一个WHERE条款 如果我这样做的话 性能会有什么不同吗 WHERE after UNION与执行查询相比UNION after WHERE clause 例如 SELECT
  • SQLPlus 中的运行循环

    我制作了一个 bash 脚本 它通过 SQLPlus 连接到数据库并运行一个包含 For 循环的 SQL 脚本 如下所示 但是一旦运行它 它就会卡在循环的 BEGIN 中 如下所示 我尝试直接通过SQLPlus运行 结果是一样的 那么任何人
  • 参数无效”设置键“net.core.somaxconn”

    我尝试设置Linux内核 编辑后 etc sysctl conf并执行sysctl p它显示错误 Invalid argument setting key net core somaxconn Linux 发行版 Ubuntu 12 04
  • 如何查看所有者是否有权在 Oracle 中执行存储过程

    我需要验证我的所有者是否有权执行存储过程 但我必须在 sys 表上进行搜索 我可以在哪个表中找到它 谢谢你 与它的名称相反 DBA TAB PRIVS 允许我们查看所有对象的授予权限 而不仅仅是表 select from DBA TAB P
  • 使用绑定变量动态传递表名和列名

    有没有办法使用绑定变量将列名和表名动态传递给查询 这可以通过使用简单的串联运算符来完成 但我想要一种不同的方法来实现这一目标 EDIT OPEN abc cur FOR Select column name from table name
  • 从 blob 反序列化 java 对象

    首先 我很抱歉 我要问一些愚蠢的问题 我根本不懂java 也不知道我们是否可以问这样的问题 如果没有 删除我的主题 oracle中有一个存储blob的表 它是二进制的 我能够解码它 输出看起来像这样 sr com epam insure c
  • 通用 Oracle 数据收集存储

    我正在设计一个新的实验室数据库 我想将所有测试的原始结果存储在一起 在某些情况下 结果是单个值 然而 结果有时是原始波形或信号 下面哪种情况是理想的 以及为什么 或提供您自己的理想选择 选项 1 将每个单独的数据点存储为单独的结果行 距 t

随机推荐

  • stm32 freeRTOS lwip TCP快速发送,内存泄露问题

    现象1 发送缓慢 tcp write之后要等200多ms才能过发送出去 而且粘包严重 解决办法 tcp write之后 立马调用tcp output tcp就会立马发送 tcp write tcp output 现象2 持续快速发送和接受T
  • linux top VIRT RES SHR SWAP DATA内存参数详解

    总结 VIRT 虚拟内存中含有共享库 共享内存 栈 堆 所有已申请的总内存空间 RES 是进程正在使用的内存空间 栈 堆 申请内存后该内存段已被重新赋值 SHR 是共享内存正在使用的空间 SWAP 交换的是已经申请 但没有使用的空间 包括
  • cookie的读写设计和浏览器控制台Application设计不一致?

    问题描述 在做需求联调的时候发现 用https的链接登录状态验证正常 但是在http协议下 会出现set cookie失败的情况 导致登录状态验证失败 查看控制台 报错如下 提示 会覆盖具有 Secure 属性的cookie 于是在控制台下
  • C语言:以分号结尾的诗

    目录 前言 1 从Hello world开始 2 数据的类型与运算 2 1 整形在内存中的存储 2 1 1 从二进制说起 2 1 2 数据类型 2 1 2 1 数据类型家族 2 1 2 2 比特 字节 2 1 3 原码 反码 补码 2 1
  • cookie保存,json、字符串相互转换

    cookie读写操作 addcookie函数中 对text进行了eacape编码 方便在各种浏览器 下都可以读取 所以取值的时候需要unescape 解码 function getCookie name var strCookie docu
  • Windows下性能最好的I/O模型——完成端口

    Windows下性能最好的I O模型 完成端口 I O模型 完成端口 设计目的 常见的网络通信分为两种 同步和异步 在同步通信中 每一次接受数据都会导致主线程的挂起 从而阻塞住了其他操作 为了解决这一问题 我们通常会采取同步通信 多线程的策
  • 一个关于Python字符串格式化输出的练习

    请实现一个程序 实现如下需求点 1 程序开始的时候提示用户输入学生年龄信息 格式如下 Jack Green 21 Mike Mos 9 我们假设 用户输入 上面的信息 必定会遵守下面的规则 学生信息之间用分号隔开 分号前后可能有不定数量的空
  • 延时函数中用全局变量还是用局部变量

    从不上系统角度 如果中断函数中没有调用延时函数 就都可以 但是如果中断函数中有用到延时函数 就用 局部变量 因此 全部使用局部变量最好
  • 一次磁盘占用率 100% 的排查记录

    一 排查磁盘占用率100 1 1 查看磁盘使用的大致情况 第一个命令就是 df h 来查看磁盘的占用情况 df 是 disk free 的缩写 用于显示目前在 Linux 系统上的文件系统磁盘的使用情况统计 如下图所示 可以看到磁盘占用率
  • Exoplayer+Exomedia之玩转视频播放事件监听

    说明 视频播放事件包括两个部分 1 播放器本身的事件 开始 暂停 结束播放等 2 用户动作触发的事件 拖拽进度条 点击屏幕等 播放事件监听的途径主要是通过视频播放框架 或开发者自定义 的控制器来实现的 控制器是指操作播放器的组件 按钮 进度
  • 信号完整性分析基础知识之传输线和反射(二):阻性负载的反射,源端阻抗,弹跳图

    传输线的端接需要考虑三种重要的特殊情况 每种情况中 传输线的特性阻抗均为50Ohm 信号将从源端在这条传输线上传播 并以特定的阻抗端接到达远端 TIP 在时域中 信号对瞬时阻抗十分敏感 第二区域并不一定是一条传输线 它也可能是一个分立设备
  • Ubuntu14.04上安装TensorRT 2.1操作步骤

    在Ubuntu14 04 上安装TensorRT2 1有两种方法 1 通过 deb直接安装 2 通过Tar文件安装 这里通过Tar文件安装 安装步骤 1 安装CUDA 8 0 可参考 http blog csdn net fengbingc
  • 离散系统Matlab信号处理

    一 离散时间信号 代码 n 2 7 x 0 2 3 5 6 1 5 7 9 2 subplot 2 1 1 stem n x xlabel n ylabel x n title stem函数绘制离散信号 subplot 2 1 2 plot
  • 使用scrapy cluster构建企业级爬虫系统——(2)实现网站深度抓取

    上回博客中 我们对scrapy cluster进行了介绍 今天我们来搭建scrapy cluster的开发环境 这里我使用的开发机环境是Ubuntu 18 04 大家日常如果使用windows开发时候 最好把zookeeper kafka
  • .Xauthority文件 有问题,导致无法登录

    在用户 home目录下的 Xauthority文件 解决办法 1 修改 2 rm 删除 重启
  • 管理习惯---思维转变

    福州 雨 湿热 简单描述 想起了香港的蜗居 当然 中庸的福州美于香港不止一点 参加了 管理他人者 说道执行 涉及内容 确定方向与明确目标 授权与跟进 发张直属下级 评估和改善绩效 选择团队成员和建设团队 时间分配 上级谈话 课程来说 偏向中
  • 【JVM】手写Java虚拟机-01 命令行工具

    目录 介绍 环境 配置环境 可能遇到的问题 开始 命令行工具 执行 介绍 手写一个简单的Java虚拟机 参考了bugstack虫洞栈 声哥 自己动手写Java虚拟机 和JVM Demo 本系列文章尽可能按照保姆级呈现 如果有任何问题和建议
  • C/C++函数的本质以及多线程函数的调用过程

    C C 中 函数的本质是一段可执行代码 代码包括了局部变量 全局变量的地址等等 到汇编语言的级别 变量函数等都可以视为汇编的代码片段 函数的本质就是一个可执行代码片段的集合 线程的详细介绍 http www cnblogs com trac
  • QT 之wayland 事件处理分析基于qt5wayland5.14.2

    1 Qt wayland 初始化 接收鼠标 案件 触摸屏等事件事件 QWaylandNativeInterface public QPlatformNativeInterface 在QWaylandNativeInterface 继承qpa
  • 解决TCP连接数过多的问题

    1 建立连接协议 三次握手 1 客户 端发送一个带SYN标志的TCP报文到服务器 这是三次握手过程中的报文1 2 服务器端回应客户端的 这是三次握手中的第2个报文 这个报文同时带ACK标志和SYN标 志 因此它表示对刚才客户端SYN报文的回