2011-04-28 72 views
0

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

回答

1

首先要记住的是,您的计算机通常不会知道“网络崩溃”本身的时间。所有的计算机都知道它是否从网络接收数据包,或者不是。 (某些计算机也可能知道其本地以太网端口上的电信号是否已消失,但由于网络中较远的部分可能会在不影响本地以太网电缆上的信号的情况下断开,因此该信息仅偶尔有用)。

在实践中,如果您的计算机之间的网络(这是说给电脑)停止工作,你会看到如下效果:

(1)您发送的任何UDP数据包将没有下降跟踪,通常没有任何错误指示。当然,您也不会收到来自远程节点的任何UDP数据包。 (2)计算机和远程对等体之间的任何TCP连接上的数据通信将迅速停止。经过一定的超时时间(通常几分钟)后,操作系统不会收到来自远程对端的任何响应,操作系统将“放弃”并将TCP连接标记为关闭;在这一点上,如果远程对等端有意关闭连接,您将看到与您将获得的行为相同的行为:也就是说,select()将返回准备好读取的状态(并且可能随时可以写入,我忘记了),然后当你尝试在套接字上实际执行recv()或read()时,你将得到一个EOF(即,阻塞套接字上的recv()将返回0;非阻塞套接字上的recv()将返回 - 1)。 (如果网络在超时完成之前恢复,那么套接字上的TCP流量将恢复,尽管它将开始缓慢恢复并且随着时间的推移再次逐渐加速)

+0

我正在研究TCP连接,我有一个代理,我杀死模拟网络崩溃。我有第二点的问题。我的套接字都bloking,但我呼吁recv套接字准备阅读与国旗MSG_DONTWAIT但不过,它返回我0 ...是否正确它返回0虽然我使用MSG_DONTWAIT标志? – LaPeste 2011-04-29 17:47:01

+0

为了正确地模拟网络崩溃,我不会杀死一个代理进程,我要么拉动连接你的计算机到代理的以太网电缆,要么从电源插座上拔掉代理。 (如果你只是杀了一个进程,代理的操作系统会礼貌地通知你的客户端TCP连接已经关闭 - 在真正的崩溃情况下,这种情况不会发生)。 recv()返回0,因为这是TCP连接关闭时阻塞recv()应该返回的内容。 – 2011-05-01 07:42:46

+0

感谢您的帮助。因为我的教授,我必须使用代理(这只是由我的教授编写的程序)来模拟崩溃网络。 – LaPeste 2011-05-04 09:41:33

0

您的描述不清楚,但有可能select( )正在相关插座上发出EOS信号,这不代表网络“崩溃”,而是由同伴有序地关闭,可能是您意想不到的。