我試圖根據需要通過延遲數據包來模擬人工網絡條件(正在模擬的應用程序是Java應用程序)。TCP RST數據包延遲數據包
我面對的問題是,應用程序檢測到它在一段時間內沒有收到ACK並重新發送。這發生在兩端引起裂變反應。數據包被無序接收,最終,一方發送RST數據包。
我想確保這絕不會發生。我應該如何避免這種情況?
感謝
UPDATE:一些Wireshark的捕獲會話圖片:http://db.tt/fav2sRgL和http://db.tt/zGXwMubk
我試圖根據需要通過延遲數據包來模擬人工網絡條件(正在模擬的應用程序是Java應用程序)。TCP RST數據包延遲數據包
我面對的問題是,應用程序檢測到它在一段時間內沒有收到ACK並重新發送。這發生在兩端引起裂變反應。數據包被無序接收,最終,一方發送RST數據包。
我想確保這絕不會發生。我應該如何避免這種情況?
感謝
UPDATE:一些Wireshark的捕獲會話圖片:http://db.tt/fav2sRgL和http://db.tt/zGXwMubk
這聽起來像你拿着數據包超過1秒,這是一個很長的時間在網絡土地,並不是TCP會很滿意。導致的失敗級聯幾乎是您應該從TCP中獲得的。
但首先你需要考慮這種延遲是否真的是你想要模擬的。數據包遍歷路徑所需的時間(單向),往返時間(即返回)以及應用程序處理和響應所花費的時間(獨立於網絡堆棧)。
我寫了幾篇關於network statistics和emulation的文章,您可能會感興趣。
聲明:我爲一家生產替代傳輸協議的公司工作。
該解決方案依賴於仿真的意圖。
如果你想要線級保真度,你需要控制整個TCP堆棧來管理時間。相反,如果您希望模擬套接字級別的行爲,則可以通過響應使流保持不變的零長度段來防止ACK風暴。
顯然,仍然會有TCP段,它們不會包含任何有效負載。
觀察到幀被亂序發送是令人好奇的,因爲這將暗示包含大量緩衝的環境。你正在通過路由廣域網或單個局域網段進行測試嗎?
尚未到達的重發分組是TCP 確實是。充足的無序延遲到達 - 具體來說是確認 - 吹出其同步安全裕度並中止。
那麼你是說我應該延遲那些包含數據的數據包?讓只有ACK的數據包沒有任何延遲? –
ACK是TCP報頭中的元數據,不是特殊的數據包。如果必須,TCP將發送一個無數據包,以便按時發送ACK,但不會優先選擇。 – jthill
我不明白這個問題。 TCP不會這麼做,所以如果有任何問題,那就是你的模擬問題。 – EJP
我關掉了我的模擬器,並用「tc」(流量控制)規則產生了相同的效果。同樣的事情發生。 –