10054 java_【理解】 Error 10053和 Error 10054

article/2025/9/28 14:01:44

1. 10053

这个错误码的意思是:  A established connection was aborted by the software in your host machine, 一个已建立的连接所在主机的软件中止

2. 10054

这个错误码的意思是: Connection closed by peer, 连接已经被对方关闭

10053 出现的可能原因是:数据传输超时或者协议错误。

当主动端发起连接服务器的请求,连接成功之后发送数据请求给服务器,服务器处理时间稍长,导致客户端超时关闭,等到服务器将数据写入缓冲区后,TCP协议发现socket已经关闭,所以服务器会出现10053的错误码,这是正常的现象。

10054 出现的可能原因是:对端关闭了socket(可能是异常也可能是超时),然而本端还没有感知到,依旧写入数据(对端接收缓冲区有数据),对端发现有未处理的数据直接回复RST重置连接标记,表明对端已经关闭了socket

检测出这个错误码一般是对端发送了RST包给本端,本端接收这个包, 表示对端出现了异常:  四种情况发送RST码:

1. 本端连接对端未打开的端口, 对端发送RST包

2. 请求超时

3. 已关闭连接上收到数据:

主要出现在连接的关闭过程,当请求关闭连接的一方在两个MSL后,仍然收到服务机发送来的最后一个FIN,说明其最后发送出的ACK丢包, 服务机又重发了FIN包,而此时客户机已经不处于TIME_OUT状态,连接已经彻底不存在,再收到服务机发送来的FIN,就会直接回复一个RST包,让服务机直接关闭连接,抛弃 缓冲区的所有数据。

举一个其他例子: 主动端关闭socket,发送了fin给被动端,此时主动端无法接受和发送数据了,此时如果被动端调用read会收到fin(读取0),如果被动端write给主动端,主动端会发送rst,但rst不会立即通知到被动段,只有被动端在第二次write时,数据不会发送给主动端而是发出一个SIGPIPE信号而终止被动端(可捕获忽略该信号)

4. close连接时, 接收缓冲区还有数据

如果close连接时,接收缓冲区还有对端发过来的数据,则回一个RST,直接丢弃接收缓冲区的内容

5. 设置了so_linger选项但是 l_lingertime 为0, close 时会发出RST

注意到10053和10054出现的原因有重复,以下是区分他俩的一个文章:

http://www.blogjava.net/pandawang/archive/2013/11/28/406922.html

某端出现10053和10054的在于主动端(客户端)和被动端(服务器)建立连接后,服务器非正常关闭时有没有关闭socket,这个fin包是不是在rst之前被客户端收到,fin先于rst,则10053

update problem:

今天启动flask的自带server,非常简单,就是一个直接返回字符串(有sleep操作,故意的),发送一个请求给flask,这个请求会超时: 1. 在本机上发,2. 在其他主机上发;

发现这俩种方法的结果不同,第一种会打印10053的错误信息,第二种不会;

经过microsoft message analyzer 抓包工具分析, 第一种操作,数据包是在环路接口流动,socket很快就关闭并回收了,导致server将响应返回时报错,协议栈认为是自己关闭的所以报的10053,但其实应该是10054.

因为在一个已经关闭的socket写会引起对端发送rst,连接重置,但因为是回路接口,windows的实现可能认为是自己关闭的,所以错误码才是10053。

第二种因为不再同一个机器,对端关闭不影响,数据发送还是成功的(对端回复了rst),所以没有报错。

同样的实验在linux下面运行,报的错是 error 32 broken pipe。这点和Windows不一样,如果协议栈认为是自己关闭的,在linux上的错误应该是 error 53 ECONNABORTED。

所以数据传输的错误码,在环路接口上可能与正常的理解不同,同时与系统相关。

以下附上抓包工具的结果:

下图是client和server在统一机器上的情况:其报错10053,看右侧的第二个框,其响应并没有写入完全,就报错,所以断定是socket资源已经被销毁了,但由于是在同一个机器,所以协议层认为是自己断的,报了10053

ps:环路接口每个syn,fin,ack包都重发一遍了,不知道为啥。。。。

cc16c47ffe248a134a71e26af8ac0ff4.png

下图是client和server不在同一机器上的情况:其未报10053, 可以看39938消息,数据是写入缓冲区成功了,发送的时候对端回了rst,参考39950。 flask自带的server可能处理了这种并没有打印连接重置的错误

09d1c3fb097bc5cea70e15e3d0cf3834.png

ps:

1. close 是优雅关闭过程,当socket的引用计数减少到0,开始优雅关闭流程,发送fin包,经四次握手关闭

2. shutdown 是直接破坏socket的通信,如果指定关闭WR,则发送fin包给对方


http://chatgpt.dhexx.cn/article/Q12102BU.shtml

相关文章

mysql 端口号_mysql的端口号(mysql常用端口号)

mysql的端口号(mysql常用端口号) 2020-05-07 21:58:15 共10个回答 mysql的默认端口号是多少 mysql默认端口号为3306,修改端口号方法:修改配置文件/etc/my.cnf 如何查看mysql的端口号 1使用命令showglobalvariableslikeport;查看端口号2修改端口,编辑/etc/my.cnf文件,早期版本有…

IT开发+软件测试常用端口号

目录 一、端口号二、非常常用端口号-软件测试 ★★★★★三、一般常用端口号 ★★★☆☆四、端口概述 ★★☆☆☆五、端口一览表详情 ★☆☆☆☆一、端口号 具有网络功能的应用软件的标识号。注意,端口号是不固定的,即可以由用户手工可以分配(当然,一般在软件编写时就已经…

Hadoop之常用端口号

hadoop3.xHDFS NameNode 内部通常端口:8020、9000、9820HDFS NameNode 对用户的查询端口:9870Yarn查看任务运行情况的端口:8088历史服务器:19888HDFS NameNode 对用户的查询端口:9870,经常查看目录信息&…

服务器网站常用端口号,web服务器常用端口号

关于 web服务器常用端口号的搜索结果 回答 一般常用的端口号为:WWW是80&xff0c;FTP是21&xff0c;SMTP是25&xff0c;你可以通过修改端口号来提高IIS服务器的安全性。如果你修改了端口设置&xff0c;只有知道端口号的用户才可以访问&xff0c;但用户在访问时需要指定新端…

SQL语句截取字段某指定字符的前半段/后半段内容

最近项目中遇到一个小问题: 需要从数据库中取出对应数据,并根据某个字段中的前半段内容进行排序,搜索资料后得以解决,现将解决方法记录如下: 最初的查询SQL: SELECT file_name,sort FROM base_annexesfil…

sql常用函数详解(一)——字符串截取

1.substring函数——截取字符串 SUBSTRING ( expression, start, length ) expression——字符串、二进制字符串、文本、图像、列或包含列的表达式。请勿使用包含聚合函数的表达式。 start——整数或可以隐式转换为int 的表达式,指定子字符串的开始位置。 length——…

sql截取数据

1、left从左开始截取字符串 left(string, length) -- (字符串,截取长度)示例:SELECT id,LEFT(id,4) FROM organization 运行结果: 2、right从右开始截取字符串 right(strin…

sql数据库,截取语句(截取每列中的字段)

制表人也是省事,把这些信息放在一列中,现在需要取红框圈着的数据,有一百多行,操作了十多行,实在是蛋疼,还是用sql搞吧 首先把excel表导入sqlserver中 //表名为“疑点详细说明”,22为姓名身份证…

SQL语句:如何截取指定字段某一个字符的前面/后面的字符串?

假设数据库中,某一列数据像这样,每个数据都有同一个字符“-”,这时如果我们需要获取这个字符的前面的字符串或后面的字符串,应该用什么SQL语句呢? SUBSTRING ( expression, start, length ) --SUBSTRIN…

SQL server 字符串截取

--1、LEFT()方法--- --函数说明--- --1)语法:LEFT(character,integer) --2)介绍:参数1:要截取的字符串,参数2:截取字符个数 --3)使用: --返回从字符串左边开始指定个数…

sql语句之字符串截取(substring_index)

一、substring_index: 实现提取表单列表中的字符串 来源:https://www.cnblogs.com/mqxs/p/7380933.html 1、格式: substring_index(str,delim,count)2、注释: str:要处理的字符串delm:分隔符count&#…

【SQL时间截取】数据库Sql实现截取时间段和日期

【写在前面】前些日子接到这样的需求,我们要对用户访问网站的时间做个统计,但是我想统计到具体的时间点,便于统计不同时间段(上午、下午、傍晚、凌晨)访问的人数占比。 数据库Sql实现截取时间段和日期 1、原始数据查看…

SQL SERVER字符串截取,SQL SERVER根据指定字符截取

字符串截取 字符串截取函数:substring(str,startlen,endlen) 需要截取的字符:str 开始长度:startlen --从1开始 结束长度:endlen -从1开始 用法:select substring(“abcdefg”,1,2) 输出:bc 为啥这么麻烦&…

sql查询中截取字符串

SQL 语句中查询结果字符截取left,right,substrng用法 在SQL的实际用途中,经常会碰到需要对查询结果值需要做字段的一些截取,下面列举经常用到的三种常用截取方式。 1.LEFT(str, length):从左边开始截取str,length是截取的长度&…

sql server提供三种常用截取字符串方法,LEFT()、RIGHT()、SUBSTRING()

一、sql server提供了三种常用截取字符串方法,LEFT()、RIGHT()、SUBSTRING() 1、LEFT()函数语法:LEFT(character,integer) 注释:参数1:要截取的字符串,参数2:截取字符个数说明:返回从字符串左边…

SQL中的字符串截取函数

字符串截取函数,也是我们在数据开发分析的过程中比较常用的函数,比较常用的函数,有四个 left()、right()、substr()、substring_index() 函数。 一、left()函数 含义:返回从字符串左边开始指定个数的字符 语法格式:le…

图像特征提取算法:方向梯度直方图HOG

1.基本介绍 HOG,全称是方向梯度直方图(Histogram Of Gradient),是目前计算机视觉、模式识别领域很常用的一种描述图像局部纹理的特征。这个特征名字起的也很直白,就是说先计算图片某一区域中不同方向上梯度的值&#…

HOG特征提取算法原理

1.算法基本流程 在一幅图像中,方向梯度直方图(Histogram of Oriented Gradient, HOG)能够很好地描述局部目标区域的特征,是一种常用的特征提取方法,HOGSVM在行人检测中有着优异的效果。在HOG中,对一幅图像进…

sift特征提取算法

简介 SIFT算法是用来提取图像局部特征的经典算法,SIFT算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。 主要步骤 …

特征提取算法:HOG,HAAR,LBP

(一)HOG特征 1、HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子。它通过计算和统计图像局部区域的梯度方向直方图来构成特征。Hog特征…