2011-04-28 68 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信號,這不代表網絡「崩潰」,而是由同伴有序地關閉,可能是您意想不到的。