【发布时间】:2014-08-20 23:33:33
【问题描述】:
我有一个使用持久 TCP 连接的客户端-服务器 (Java) 应用程序,但有时服务器在尝试写入套接字时会收到 java.io.IOException: Connection reset by peer 异常,但我在客户端日志中没有看到任何错误。
此 RST 可能是由中间代理/路由器引起的,但如果是这种情况,是否也应该在客户端上看到?
【问题讨论】:
我有一个使用持久 TCP 连接的客户端-服务器 (Java) 应用程序,但有时服务器在尝试写入套接字时会收到 java.io.IOException: Connection reset by peer 异常,但我在客户端日志中没有看到任何错误。
此 RST 可能是由中间代理/路由器引起的,但如果是这种情况,是否也应该在客户端上看到?
【问题讨论】:
如果 RST 是由客户端发送的,则可以使用数据包嗅探器(例如 wireshark)在其上看到它。但是,它不会出现在任何用户级套接字中,因为它是由操作系统作为对各种错误输入(例如连接到关闭端口的连接尝试)的响应而发送的。
如果 RST 是网络发送的,那么它就冒充客户端断开连接。它可以在一个方向上这样做,也可以在两个方向上这样做。在这种情况下,客户端可能什么都看不到,除了当客户端继续向它认为打开的连接发送数据时实际服务器发送的 RST,而服务器认为它是关闭的。
尝试捕获服务器和客户端上的流量,看看重置来自哪里。
【讨论】: