TCP连接被意外重置的原因

2023-05-16

    今天在做服务器压力测试的时候,出现了很奇怪的情况,与服务器建立连接会成功,但是很快会被重置(RESET)掉。花了半天时间,终于找到原因所在,我把过程和结果写下来与大家分享。

 

    服务器正常逻辑是:接受连接,等待用户注册报文,处理其他请求,如果连接一段时间没有活动,则主动关闭连接。

 

    客户端逻辑是:与服务器建立连接后,马上发送注册报文,然后每隔一段时间发送一个请求。有上万个客户端同时连接一个服务器,当连接出现错误时,马上重新连接。

 

    出现错误时,客户端会报告下面一连串错误:

 

recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer
recv: Connection reset by peer

 

    进一步的测试发现只有在客户端数目超过一定数量才会出现这样的情况,于是联想到Linux进程打开文件描述符(Linux下套接字也是一种文件描述符)的数量限制(前几天刚刚增加了这个数量限制),但是到底有什么联系不知道。

 

    开始以为服务器程序逻辑主动关闭了连接,但是根据抓包的结果,服务器根本就没有发送TCP FIN报文,下面是一个典型的连接建立与重置的过程:

 

14:01:03.567888 IP 192.168.6.45.36692 > 192.168.6.46.8080: S 1231228012:1231228012(0) win 5792 <mss 1460,sackOK,timestamp 174530727 168899918,nop,wscale 8>
14:01:03.567969 IP 192.168.6.46.8080 > 192.168.6.45.36692: S 909133089:909133089(0) ack 1231228013 win 5792 <mss 1460,sackOK,timestamp 168900338 174530727,nop,wscale 8>
14:01:03.567978 IP 192.168.6.45.36692 > 192.168.6.46.8080: . ack 1 win 23 <nop,nop,timestamp 174530727 168900338>
14:01:03.568022 IP 192.168.6.45.36692 > 192.168.6.46.8080: P 1:76(75) ack 1 win 23 <nop,nop,timestamp 174530727 168900338>
14:01:03.568110 IP 192.168.6.46.8080 > 192.168.6.45.36692: . ack 76 win 23 <nop,nop,timestamp 168900338 174530727>
14:01:03.568769 IP 192.168.6.46.8080 > 192.168.6.45.36692: R 1:1(0) ack 76 win 23 <nop,nop,timestamp 168900338 174530727>

 

    检查服务器的日志,也没有主动关闭连接的记录,甚至并没有接受到新的连接。这说明连接是由底层协议栈关闭的,但协议栈为什么会主动关闭呢?

 

    用telnet连接服务器,也不正常,但是是被正常关闭的(有正常的FIN序列),而不是重置。

 

    是否与侦听套接字的就绪连接队列长度有关?但是连接队列满时,协议栈不做任何操作,而是让客户端超市重发SYN报文,与出现的情况不一致。

 

    看来还是有打开文件描述符的数量限制有关,那么不能再打开文件描述符时,会出现什么情况呢?为什么telnet连接会出现不同的情形呢?对这些问题的回答就要透过现象看本质了,我的分析如下:

 

    首先,连接确实是建立了,说明协议栈是接受了这个连接的,当然,应用程序肯定没有接受,否则打开文件描述符数目超过上限了。另一方面,协议栈当然要关闭这个连接,但是没有立即关闭,应该是在应用程序接受连接时(accept)关闭(尚未验证),进一步跟踪,accept会产生too many open files错误。这也说明套接字这个文件描述符是在accept时打开的,在协议栈中建立的连接并没有对应的套接字描述符。

 

        telnet连接的不同之处在于没有向服务器发送数据,此时采用正常方式关闭,这是协议的要求还是Linux实现的特例没有考证过。

 

        还有另外一个结论是在accept之前收到的数据仍然会被接受并应答,并且连接上的数据是存储在协议栈中的,这符合我先前的概念。

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

TCP连接被意外重置的原因 的相关文章

  • Nodejs TCP连接客户端端口分配

    我使用nodejs在客户端和服务器之间创建了tcp连接 网络模块 https nodejs org api net html 服务器正在侦听已经预定义的端口 并且客户端正在连接到该端口 据我了解客户端的端口是由节点动态分配的 那是对的吗 节
  • 很难理解带有 async_read 和 async_write 的 Boost ASIO TCP 的一些概念

    我很难理解使用 async read 和 async write 时构建 tcp 客户端的正确方法 这examples http www boost org doc libs 1 38 0 doc html boost asio examp
  • Node.js 找不到模块“tcp”

    节点在以下行崩溃 var tcp require tcp 错误文本 node js 201 throw e process nextTick error or error event on first tick Error Cannot f
  • tcp_max_syn_backlog 和 somaxconn 有什么区别?

    我一直在阅读一些关于 Linux 上的 TCP 实现的文章 我很困惑 它们之间有什么区别net ipv4 tcp max syn backlog and net core somaxconn和backlog作为参数传递给listen 系统调
  • 如何使用 kotlin 通过 TCP 连接发送和接收字符串

    我在 Windows 上有一个 TCP 服务器 我想在服务器和我的 Android 设备之间发送和接收文本字符串 我花了很多时间搜索使用 Kotlin 的示例 但没有找到任何有用的代码 所以我现在只能创建套接字并连接 fun connect
  • Scapy 不需要的 RST TCP 数据包

    为了理解TCP是如何工作的 我尝试伪造自己的TCP SYN SYN ACK ACK 基于教程 http www thice nl creating ack get packets with scapy http www thice nl c
  • 如何模拟客户端和服务器之间的套接字断开连接(在 Windows 上)?

    我已经实现了一种 心跳解决方案 我想看看在实际情况下网络 故障 时会发生什么 特别是当套接字上没有流量时发生这种情况 问题 我只有一台电脑 我在windows java上 我想简单地拔掉网线 停用网卡不会影响这两个进程 因为它们在同一个盒子
  • 在 Perl 中如何接受多个 TCP 连接?

    我对 Linux 的 Perl 脚本有疑问 它的主要目的是成为 3 个应用程序之间的中间人 它应该做什么 它应该能够等待 UDP 文本 不带空格 udp port 当它收到 UDP 文本时 它应该将其转发到连接的 TCP 客户端 问题是我的
  • PHP 上的多个 TCP 套接字请求

    是否可以使用 PHP 上的套接字服务器接受多个请求 并行 如果可以的话 怎样做 普通的 PHP 脚本无法接收多个请求 但如果你真的计划创建一个套接字服务器 作为 cmdline php 脚本启动 那么是的 这是可能的 调查http pear
  • 为什么我们可以将 sockaddr 转换为 sockaddr_in

    我明白为什么强制转换很有用sockaddr to sockaddr in 但我不明白这怎么可能 据我所知 它们的大小相同sockaddr in添加了sin zero使其大小相同 我想知道编译器如何知道从哪里获取信息sockaddr in如果
  • 如何在java应用程序中检测FIN - tcp标志?

    我在两台计算机之间有持久的 TCP 连接 第二台计算机不受我的控制 第二台计算机可以随时发送FIN标志 并且首先必须关闭当前连接 将FIN标志发送回第二台计算机 我如何知道第二台计算机正在发送 FIN 标志 以及何时必须调用 Java 应用
  • C# Socket.receive连续接收0字节且循环中不阻塞

    我正在尝试用 C 编写一个最简单的多线程 TCP 服务器 它接收来自多个客户端的数据 每次连接新客户端时 都会建立套接字连接 并将套接字作为参数传递给新类函数 之后运行 while 循环并接收数据 直到客户端连接为止 这里的问题是 sock
  • AMQP如何克服直接使用TCP的困难?

    AMQP如何克服直接使用TCP发送消息时的困难 或者更具体地说 在发布 订阅场景中 在 AMQP 中 有一个代理 该代理接收消息 然后完成将消息路由到交换器和队列的困难部分 您还可以设置持久队列 即使客户端断开连接 也可以为客户端保存消息
  • 是否可以找到哪个用户位于 localhost TCP 连接的另一端?

    这是一个编程问题 但它是 Linux Unix 特定的 如果我从本地主机获得 TCP 连接 是否有一种简单的方法可以告诉哪个用户在 C 程序内建立了连接而无需 shell 我知道这对于 Unix 域套接字来说并不太难 我已经知道远程 IP
  • 为什么 TCP 段中的 SYN 或 FIN 位会占用序列号空间中​​的一个字节?

    我试图理解这种设计背后的基本原理 我浏览了一些 RFC 但没有发现任何明显的东西 这并不是特别微妙 这样 SYN 和 FIN 位本身就可以被确认 因此如果丢失则可以重新发送 例如 如果连接关闭而没有发送更多数据 那么如果 FIN 没有发送任
  • 如何强制关闭 TcpListener

    我有一个通过 tcpListener 进行通信的服务 问题是当用户重新启动服务时 抛出 地址已在使用 异常 并且服务在几分钟左右无法启动 有没有办法告诉系统终止旧连接 以便我可以打开一个新连接 我不能只使用随机端口 因为服务无法通知客户端端
  • Erlang gen_tcp 连接问题

    简单的问题 这段代码 client gt SomeHostInNet localhost to make it runnable on one machine ok Sock gen tcp connect SomeHostInNet 56
  • 中断 Select 以添加另一个要在 Python 中监视的套接字

    我正在 Windows XP 应用程序中使用 TCP 实现点对点 IPC 我正在使用select and socketPython 2 6 6 中的模块 我有三个 TCP 线程 一个读取线程通常会阻塞select 一个通常等待事件的写入线程
  • 当 TCP 序列号到达而不是预期时会发生什么情况?

    我正在编写一个程序 使用 libpcap 捕获数据包并重新组装 TCP 流 我的程序只是监视流量 因此我无法控制数据包的接收和发送 我的程序忽略所有非 TCP IP 流量 我根据 ISN 计算下一个预期序列号 然后计算连续的 SEQ 号 我
  • 为什么SOCKS5需要通过UDP中继UDP?

    The SOCKS5 https en wikipedia org wiki SOCKS SOCKS5协议 描述为RFC1928 https www rfc editor org rfc rfc1928提供对 UDP 的支持 总而言之 希望

随机推荐

  • Access 标准表达式中数据类型不匹配

    Access 标准表达式中数据类型不匹配 Access标准表达式中数据类型不匹配 今天在做一个小程序时 要求用到Access数据库 在调试运行一个SELECT语句时 老是提示标准表达式中数据类型不匹配 弄了好久 原来发现是数据类型不匹配的问
  • c#中new一个对象以后,是否需要手动释放?

    c 中new一个对象以后 xff0c 是否需要手动释放 xff1f 2012 04 28 23 43 wshbfzdzb 分类 xff1a C NET 浏览723次 c 43 43 中 class1 a 61 new class1 需要在用
  • ARM M0+各种定时器驱动的编写

    systick 系统滴答时间 这个定时器之前的文章已经讲过 这个是一个递减的定时器 xff0c 有个模数寄存器 在此不多说 就是一个系统的模块 xff0c 这个模块是集成在ARM M0 43 内核中的 xff0c 其实主要是集成在NVIC
  • MG323所有命令使用

    AT 43 CGMR 61 OK AT 43 GMR 61 OK AT 43 GMR 12 210 10 05 00 OK AT 43 CGSN 351869042318140 OK AT 43 CIMI 460021734971641 O
  • BAT文件的常用语法

    bat文件中常用的命令有 xff1a echo 64 rem pause goto call if copy等 下面简要给出这几个命令的用法 1 echo命令 echo 表示显示此命令后的字符 例如echoHello World choHe
  • c++ http请求,json解析

    一 文章内容 解决c 43 43 http请求以及对返回结果json串进行解析 xff0c 使用jsoncpp库 二 安装jsoncpp插件 vs2015通过NuGet直接安装jsoncpp到项目下 安装好之后 xff0c 会在项目下有个p
  • Linux安装Oracle12c操作手册

    1 基本环境 服务器 xff1a 64位 16核CPU 384G内存 16T硬盘 操作系统 xff1a CentOS 7 4 Oracle版本 xff1a 12c 版本号12 1 0 2 0 2 安装必要的软件包 查看rpm包是否安装 xf
  • tiny6410按键驱动总结

    写了7个版本的按键驱动 xff1a 1 查询法 xff1a 在应用程序的while循环里不停的调用read函数读取按键值 xff0c 太耗费CPU资源了 2 中断发 xff1a 同样是在一个while循环里不停的调用read函数读按键值 x
  • linux中shell的常用命令

    shell 常用命令 什么是shell xff1f shell 也是操作系统中的一个软件 xff0c 它包在 linux 内核的外面 为用户和内核之间的交互提供了一个接口 一 diff命令 diff b表示忽略空格 xff0c B表示忽略空
  • 空心杯电机学习笔记

    空心杯电机学习笔记 1 空心杯电机 xff08 直流电机 xff09 的硬核拆解2 空心杯电机的驱动模块学习 xff08 1 xff09 无人机飞控原理学习的流程介绍 xff08 空心杯四旋翼DIY xff09 xff08 2 xff09
  • C++ 中“空引用”与“空指针”的区别

    网络上有很多讨论C 43 43 的 引用 与 指针 的区别的文章 xff0c 谈到区别 xff0c 其中有一条 xff1a 引用不能为空 xff08 NULL xff09 xff0c 引用必须与合法的存储单元关联 xff0c 指针则可以是N
  • 关于 std::vector 的下标越界检查

    当要获取 std vector 的第 n 个元素 xff0c 下面几种方式都可以 xff1a std vector lt int gt vec size t n 61 1 int amp i 61 vec n int amp j 61 ve
  • 【第三篇】 基于 Qt 的 REST 网络框架

    本文是 Qt 框架性开发实践 基础框架篇 的第三篇 本文所讲的内容已经开源 xff0c 你可以在 这里 找到源代码 在 Java 以及其他语言中 xff0c 处理与后端的 HTTP 通讯 xff0c 有专门的工具库 xff0c 使用起来特别
  • Qt/QML 实现图片圆角剪切效果

    在很多 UI 设计中 xff0c 需要将图片按照一定的方式整形 比如下面的 VIP 图片就是用一个圆形剪切原始图片 xff0c 形成的效果 其实它的原始图片是这样的 xff1a 要在 QML 中实现这样的效果 xff0c 可以使用 Opac
  • 实现 DirectShow 虚拟 Camera 驱动

    今天我们要实现一个虚拟 Camera 驱动 有这个驱动 xff0c 在 播放软件 xff08 如 VLC xff09 视频会议软件 主播视频制作软件 xff08 如 OBS xff09 中 xff0c 就可以播放 加入我们的各种特制内容了
  • 通过 ffmpeg 串流对接 OBS 等直播软件

    我们要将设备通过私有通道输出到 H264 流 xff0c 传给 OBS 等直播软件使用 为此 xff0c 设计了上图所示的串流工具 设计思路 私有通道通过 API 接口提供 H264 流 xff0c 要传给 ffmpeg xff0c 最简单
  • 排查 Edge WebView2 在某个设备上不出图像的问题

    我们在 Windows 应用内嵌入 Edge WebView2 xff0c 来展示部分用网页实现的界面 总得来说还是不错的 xff0c 比如 xff1a 渲染很快 xff0c 基本上内置网页100毫秒以内控件样式很清爽 xff0c 没有多余
  • 一个 Qml MenuBar 的问题

    基本情况 使用 QQuick Control 中的 MenuBar 实现主菜单栏 菜单栏包括 File Edit View Help 菜单项 点击菜单项 xff0c 会弹出对应的菜单 ApplicationWindow id window
  • 在 Linux 中安装微信

    微信 xff0c 是我在 Linux 中最难以舍弃的一个软件 因为安装经常遇到奇怪的问题 xff0c 而知乎上完整的教程并不多 xff0c 本文试图补上这个遗憾 适用范围 xff1a 本文以最流行的发行版 Manjaro xff08 KDE
  • TCP连接被意外重置的原因

    今天在做服务器压力测试的时候 xff0c 出现了很奇怪的情况 xff0c 与服务器建立连接会成功 xff0c 但是很快会被重置 RESET 掉 花了半天时间 xff0c 终于找到原因所在 xff0c 我把过程和结果写下来与大家分享 服务器正