SAP: 10054: WSAECONNRESET: Connection reset by peer

因为Connection reset by peer这个错误是与网络/TCP协议相关,

所以对于他的诊断, 无论是java还是.net, 等等都适用.

具体到这个例子, 我们是一个sap系统, dev_disp里面有一条形如下面这样的log

***LOG Q0I=> NiIRead: P=10.50.XXX.XXX:3900; L=10.50.XXX.XXX:XXXXX: recv ( 10054: WSAECONNRESET: Connection reset by peer) [nixxi.cpp 5087]
*** ERROR => NiIRead: SiRecv failed for hdl 17/sock 2420
(SI_ECONN_BROKEN/10054; I4; ST; P=10.50.XXX.XXX:3900; L=10.50.XXX.XXX:XXXXX) [nixxi.cpp 5087]
*** ERROR => MsINiRead: NiBufReceive failed (NIECONN_BROKEN) [msxxi.c 2829]

*****************************************************************************
*
* LOCATION SAP-Dispatcher XXX on host XXX
* ERROR Reading data from the message server (XXX / 3900)
* failed.
* Please check the trace file of the message server.
*
* TIME Sun Apr 21 11:38:00 2013
* RELEASE 720
* COMPONENT MS (message handling interface, multithreaded)
* VERSION 4
* RC -36
* MODULE msxxi.c
* LINE 2848
* COUNTER 12
*
*****************************************************************************

显然, 出了一个叫做10054: WSAECONNRESET: Connection reset by peer的错误.

那么什么是Connection reset by peer呢?

简单的说, 如果两个地址A和B他们在进行TCP通信, 如果A说他遇到了一个Connection reset by peer的问题, 那么着意味着, 他收到了一个B发给他的一个叫做RST的控制位. 或者B没有按照协议中定义的,正常的握手方法结束会话, 而是被强制或者异常终止.

那么什么时候, 为了什么B要给A发一个RST控制字符呢?

简单的说, 当B认为自己遇到了一些无法恢复的错误时.

具体的话, 可以参照TCP协议标准RFC 793,

如果你和我一样, 有刨根问底的"坏习惯的话", 我还推荐你看下面这两个链接.

这两个连接中对RST有更详细的阐述.

他们还解释了诸如, 为什么一个abnormal close(也叫slamming the connection shut)将会导致一个RST?

为什么一个连接都被关闭, 或者异常终止了他还会发出RST(实际是TCP stack所为)?, 等等问题.

RST - tracing @WireShark
Winsock Programmer’s FAQ:  Debugging TCP/IP

 既然这是一个tcp的error, 所以, 不仅仅是sap, 对于java,.net也同样适用,

只要出现了这个错误, 如果不是明显程序的bug, 那么从网络方面查查, 总是明智的选择.

关于这个错误提示信息, 可以参考这个note:

SAP note 1519484

这个note里面也有提到, 某些防火墙设置, 也会导致这个错误,

比如, 某些防火墙, 我们可以配置, 在检测到一些连接, 超过一定时间没有发生通信时,

会对这个连接的双方做timeout处理, 比如给双方发一个RST控制位.

这也是为什么很多程序都有keepalive的功能与配置.

ps. 我并不是防火墙的专家, 所以更详细的内容请自行google

但在我调查的范围, 上述情况并不是防火墙发送RST的唯一原因,

而且不同的防火墙软件也通常都具备不同的功能,

但是从理论上讲, 如果我想拒绝, 阻塞或者中断一个连接的话, 我都可以发送一个RST控制位.

(这听起来和防火墙做的事情有点像...)

 下面是SCN上面的一些连接(第一个连接, 提问者声称通过调整网络, 基本解决了这个问题):

http://scn.sap.com/message/6467523

http://scn.sap.com/thread/1571790
https://scn.sap.com/thread/1295138

下面是关于这个error的其他的一些连接.

同样, 在第一个连接里面, 也有人声称, 他也通过调整firewall设置(这些设置会影响网络), 解决了这个问题.

http://www.sapfans.com/forums/viewtopic.php?f=12&t=90143

http://stackoverflow.com/questions/1434451/what-does-connection-reset-by-peer-mean

http://www.saptechies.com/winnt-connection-reset-by-peer/
http://h30499.www3.hp.com/t5/Networking/10054-WSAECONNRESET-Connection-reset-by-peer/td-p/3436931

具体到这个例子, 我们是一个sap系统, dev_disp里面有一条形如下面这样的log

***LOG Q0I=> NiIRead: P=10.50.XXX.XXX:3900; L=10.50.XXX.XXX:XXXXX: recv ( 10054: WSAECONNRESET: Connection reset by peer) [nixxi.cpp 5087]
*** ERROR => NiIRead: SiRecv failed for hdl 17/sock 2420
(SI_ECONN_BROKEN/10054; I4; ST; P=10.50.XXX.XXX:3900; L=10.50.XXX.XXX:XXXXX) [nixxi.cpp 5087]
*** ERROR => MsINiRead: NiBufReceive failed (NIECONN_BROKEN) [msxxi.c 2829]

*****************************************************************************
*
* LOCATION SAP-Dispatcher XXX on host XXX
* ERROR Reading data from the message server (XXX / 3900)
* failed.
* Please check the trace file of the message server.
*
* TIME Sun Apr 21 11:38:00 2013
* RELEASE 720
* COMPONENT MS (message handling interface, multithreaded)
* VERSION 4
* RC -36
* MODULE msxxi.c
* LINE 2848
* COUNTER 12
*
*****************************************************************************

显然, 出了一个叫做10054: WSAECONNRESET: Connection reset by peer的错误.

那么什么是Connection reset by peer呢?

简单的说, 如果两个地址A和B他们在进行TCP通信, 如果A说他遇到了一个Connection reset by peer的问题, 那么着意味着, 他收到了一个B发给他的一个叫做RST的控制位. 或者B没有按照协议中定义的,正常的握手方法结束会话, 而是被强制或者异常终止.

那么什么时候, 为了什么B要给A发一个RST控制字符呢?

简单的说, 当B认为自己遇到了一些无法恢复的错误时.

具体的话, 可以参照TCP协议标准RFC 793,

如果你和我一样, 有刨根问底的"坏习惯的话", 我还推荐你看下面这两个链接.

这两个连接中对RST有更详细的阐述.

他们还解释了诸如, 为什么一个abnormal close(也叫slamming the connection shut)将会导致一个RST?

为什么一个连接都被关闭, 或者异常终止了他还会发出RST(实际是TCP stack所为)?, 等等问题.

RST - tracing @WireShark
Winsock Programmer’s FAQ:  Debugging TCP/IP

 既然这是一个tcp的error, 所以, 不仅仅是sap, 对于java,.net也同样适用,

只要出现了这个错误, 如果不是明显程序的bug, 那么从网络方面查查, 总是明智的选择.

关于这个错误提示信息, 可以参考这个note:

SAP note 1519484

这个note里面也有提到, 某些防火墙设置, 也会导致这个错误,

比如, 某些防火墙, 我们可以配置, 在检测到一些连接, 超过一定时间没有发生通信时,

会对这个连接的双方做timeout处理, 比如给双方发一个RST控制位.

这也是为什么很多程序都有keepalive的功能与配置.

ps. 我并不是防火墙的专家, 所以更详细的内容请自行google

但在我调查的范围, 上述情况并不是防火墙发送RST的唯一原因,

而且不同的防火墙软件也通常都具备不同的功能,

但是从理论上讲, 如果我想拒绝, 阻塞或者中断一个连接的话, 我都可以发送一个RST控制位.

(这听起来和防火墙做的事情有点像...)

 下面是SCN上面的一些连接(第一个连接, 提问者声称通过调整网络, 基本解决了这个问题):

http://scn.sap.com/message/6467523

http://scn.sap.com/thread/1571790
https://scn.sap.com/thread/1295138

下面是关于这个error的其他的一些连接.

同样, 在第一个连接里面, 也有人声称, 他也通过调整firewall设置(这些设置会影响网络), 解决了这个问题.

http://www.sapfans.com/forums/viewtopic.php?f=12&t=90143

http://stackoverflow.com/questions/1434451/what-does-connection-reset-by-peer-mean

http://www.saptechies.com/winnt-connection-reset-by-peer/
http://h30499.www3.hp.com/t5/Networking/10054-WSAECONNRESET-Connection-reset-by-peer/td-p/3436931

猜你喜欢

转载自wjason.iteye.com/blog/1859437
今日推荐