0

我试图通过根据需要延迟数据包来模拟人工网络条件(被模拟的应用程序是 Java 应用程序)。

我面临的问题是,应用程序检测到它有一段时间没有收到 ACK 并重新传输。这发生在两端,导致裂变反应。数据包被乱序接收,最终,一方发送一个 RST 数据包。

我想确保这永远不会发生。我应该如何避免这种情况?

谢谢

更新:一些 Wireshark 捕获会话图像:http ://db.tt/fav2sRgL和http://db.tt/zGXwMubk

4

3 回答 3

0

解决方案取决于仿真的意图。

如果您想要线路级保真度,您将需要控制整个 TCP 堆栈来管理时序。相反,如果您希望在套接字级别模拟行为,您可以通过响应保持流不变的零长度段来防止 ACK 风暴。

显然,仍然会有 TCP 段,它们只是不包含任何有效负载。

帧被乱序发送的观察结果很奇怪,因为这暗示了一个包含大量缓冲的环境。您是在路由 WAN 上还是在单个 LAN 网段上进行测试?

于 2012-05-26T09:02:53.413 回答
0

重新传输尚未到达的数据包是 TCP所做的。足够乱序的延迟到达——特别是 ACK——破坏了它的同步安全裕度并且它中止了。

于 2012-05-26T10:21:20.450 回答
0

听起来您保存数据包的时间超过 1 秒,这在网络中确实很长,而且 TCP 不会对此感到满意。导致的故障级联几乎是您对 TCP 的期望。

但首先你需要考虑这种延迟是否真的是你想要模拟的。数据包遍历路径(单向)所需的时间、往返时间(往返)和应用程序处理和响应所需的时间(独立于网络堆栈)之间存在很大差异)。

我写了几篇关于网络统计仿真的文章,您可能会发现它们很有用。

免责声明:我为一家生产替代传输协议的公司工作。

于 2012-06-04T20:06:21.593 回答