网络崩溃和套接字的后续状态



我想知道当它工作的网络崩溃时,套接字的状态是如何变成的。我的问题是,当我模拟这个网络的崩溃时,控制所有套接字的select()函数返回给我一些理论上不应该设置的套接字。是否有可能操作系统在写和读时都设置了一个崩溃的套接字?

首先要记住的是,您的计算机通常不知道什么时候"网络崩溃"本身。计算机所知道的只是它是否正在接收来自网络的数据包。(有些计算机可能也知道其本地以太网端口上的电信号是否已经消失,但由于网络中较远的部分可能会消失而不影响本地以太网电缆上的信号,因此该信息只是偶尔有用)。

实际上,如果您的计算机和(它正在与之通信的计算机)之间的网络停止工作,您将看到以下效果:

(1)你发送的任何UDP数据包都将被丢弃,没有任何痕迹,通常没有任何错误指示。当然,你也不会从远端对等端收到任何UDP数据包。

(2)在你的计算机和远程对等体之间的任何TCP连接上的数据传输将很快停止。在一定的超时时间(通常是几分钟)过去后,操作系统没有收到来自远程对等端的任何响应,操作系统将"放弃"并将TCP连接标记为关闭;此时,您将看到与远程对等端故意关闭连接时相同的行为:也就是说,select()将返回ready-for-read(也可能是ready-for-write,我忘记了),然后当您尝试在套接字上实际执行recv()或read()时,您将获得EOF(即阻塞套接字上的recv()将返回0;非阻塞套接字上的Recv()将返回-1)。(如果网络在超时完成之前恢复,那么套接字上的TCP通信将恢复,尽管它将缓慢地开始恢复,并随着时间的推移逐渐加速)

您的描述不清楚,但有可能select()正在相关套接字上发送EOS信号,这并不代表网络"崩溃",而是对等端有序关闭,可能是您意想不到的。

最新更新