2012-05-26 109 views
0

我試圖根據需要通過延遲數據包來模擬人工網絡條件(正在模擬的應用程序是Java應用程序)。TCP RST數據包延遲數據包

我面對的問題是,應用程序檢測到它在一段時間內沒有收到ACK並重新發送。這發生在兩端引起裂變反應。數據包被無序接收,最終,一方發送RST數據包。

我想確保這絕不會發生。我應該如何避免這種情況?

感謝

UPDATE:一些Wireshark的捕獲會話圖片:http://db.tt/fav2sRgLhttp://db.tt/zGXwMubk

+0

我不明白這個問題。 TCP不會這麼做,所以如果有任何問題,那就是你的模擬問題。 – EJP

+0

我關掉了我的模擬器,並用「tc」(流量控制)規則產生了相同的效果。同樣的事情發生。 –

回答

0

這聽起來像你拿着數據包超過1秒,這是一個很長的時間在網絡土地,並不是TCP會很滿意。導致的失敗級聯幾乎是您應該從TCP中獲得的。

但首先你需要考慮這種延遲是否真的是你想要模擬的。數據包遍歷路徑所需的時間(單向),往返時間(即返回)以及應用程序處理和響應所花費的時間(獨立於網絡堆棧)。

我寫了幾篇關於network statisticsemulation的文章,您可能會感興趣。

聲明:我爲一家生產替代傳輸協議的公司工作。

0

該解決方案依賴於仿真的意圖。

如果你想要線級保真度,你需要控制整個TCP堆棧來管理時間。相反,如果您希望模擬套接字級別的行爲,則可以通過響應使流保持不變的零長度段來防止ACK風暴。

顯然,仍然會有TCP段,它們不會包含任何有效負載。

觀察到幀被亂序發送是令人好奇的,因爲這將暗示包含大量緩衝的環境。你正在通過路由廣域網或單個局域網段進行測試嗎?

+0

我正在一臺PC上這樣做。你能否詳細說明你的答案?我還添加了兩個圖像來顯示通信順序。 –

+0

如何? TCP沒有辦法發出一個零長度的數據包,缺少libpcap API。 – EJP

+0

標準套接字API允許長度爲0的send()操作。這會觸發一個帶有PSH標誌的段,並要求來自對端的ACK響應。 – Pekka

0

尚未到達的重發分組是TCP 確實是。充足的無序延遲到達 - 具體來說是確認 - 吹出其同步安全裕度並中止。

+0

那麼你是說我應該延遲那些包含數據的數據包?讓只有ACK的數據包沒有任何延遲? –

+0

ACK是TCP報頭中的元數據,不是特殊的數據包。如果必須,TCP將發送一個無數據包,以便按時發送ACK,但不會優先選擇。 – jthill