Windows 上的 TCP 堆栈究竟如何确定连接已被强制关闭或被对端重置?
我知道 Windows 上的 TCP 默认会尝试重新传输未确认的数据包 5 次。如果 5 次尝试后仍未收到确认,会发生什么情况?它会立即在阻塞套接字上返回 WSAECONNRESET 代码吗?
另外,当我们确实收到 WSAECONNRESET 错误代码时,该 TCP 连接的实际状态是什么?
答案1
连接重置通常意味着远程主机发送了一些表示错误的消息,而不是通常会产生的无响应WSAETIMEDOUT
。
例如,远程主机可能会发送 ICMP“端口不可达”消息,这表明远程应用程序关闭了其端口。
此时 TCP 连接已关闭,尽管您的本地套接字可能仍有资源等待您关闭套接字。
请记住,根据所涉及的操作系统的具体版本,行为可能会有细微的差别。