【发布时间】: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