【问题标题】:Java: Clearing up the confusion on what causes a connection reset [duplicate]Java:清除导致连接重置的混淆[重复]
【发布时间】:2011-02-11 03:33:55
【问题描述】:

关于各种 SO 答案的陈述似乎有些混乱和矛盾:What's causing my java.net.SocketException: Connection reset?。您可以在此处看到接受的答案表明连接已被另一方关闭。但这不是真的,关闭连接不会导致连接重置。这是由“底层 TCP/IP 错误”引起的。

我想知道的是,SocketException: Connection reset 是否真的意味着“不可靠的 TCP/IP 错误”。真正造成这种情况的原因是什么?因为我怀疑它与关闭的连接有什么关系(因为关闭连接不是一个值得例外的标志,并且从关闭的连接中读取是,但这不是“潜在的 TCP/IP 错误”。

我的假设是这样的

连接重置是由于服务器未能确认 ACK 数据包(根据 TCP/IP 完全或只是不正确)。并且只有当没有 data 生成要 read 时才会生成 SocketTimeoutException (因为这是在一定时间后的读取期间抛出的,并且 read 正在等待数据,但是不关心 ACK 数据包)。换句话说,如果 read() 在分配的时间内没有读取任何字节的实际数据(数据层),它会抛出 SocketTimeoutException。

【问题讨论】:

  • '连接重置是由于服务器未能确认 ACK 数据包':否。是由于关闭了还有未读数据的连接造成的;通过向对等方已经关闭的连接发送数据;或者在关闭之前与SO_LINGER 混在一起。

标签: java tcp ioexception


【解决方案1】:

从 openjdk6 来源看来,当尝试读取数据失败并出现 ECONNRESET 错误(Linux 和 Solaris)或 WSAECONNRESET(Windows)时,会发出“连接重置”。

根据我的经验,典型的原因是套接字另一端的一方在没有先执行关机的情况下关闭了套接字。

【讨论】:

  • jdk/src/solaris/native/java/net/SocketInputStream.c 中,“连接重置”消息可能由EPIPEECONNRESET 引起。
  • 不需要关闭,如果省略也不会导致此错误。它主要发生在对等端关闭连接而不读取所有待处理数据时。
【解决方案2】:

根据我的经验,当客户端中止请求(用户关闭选项卡或单击另一个链接)时会发生这种情况。

【讨论】:

  • 您在 web 应用程序上下文中有点说话。这个问题似乎与 Web 应用程序无关。
  • 我不确定问题到底是什么,但链接的问题显示了 Tomcat 错误日志。当客户端突然关闭连接时,肯定会出现“连接重置”消息,但可能在其他情况下也是如此。
猜你喜欢
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 2013-08-02
  • 2012-11-20
  • 2017-10-28
  • 1970-01-01
相关资源
最近更新 更多