我试图通过根据需要延迟数据包来模拟人工网络条件(被模拟的应用程序是 Java 应用程序)。
我面临的问题是,应用程序检测到它有一段时间没有收到 ACK 并重新传输。这发生在两端,导致裂变反应。数据包被乱序接收,最终,一方发送一个 RST 数据包。
我想确保这永远不会发生。我应该如何避免这种情况?
谢谢
更新:一些 Wireshark 捕获会话图像:http ://db.tt/fav2sRgL和http://db.tt/zGXwMubk
我试图通过根据需要延迟数据包来模拟人工网络条件(被模拟的应用程序是 Java 应用程序)。
我面临的问题是,应用程序检测到它有一段时间没有收到 ACK 并重新传输。这发生在两端,导致裂变反应。数据包被乱序接收,最终,一方发送一个 RST 数据包。
我想确保这永远不会发生。我应该如何避免这种情况?
谢谢
更新:一些 Wireshark 捕获会话图像:http ://db.tt/fav2sRgL和http://db.tt/zGXwMubk
解决方案取决于仿真的意图。
如果您想要线路级保真度,您将需要控制整个 TCP 堆栈来管理时序。相反,如果您希望在套接字级别模拟行为,您可以通过响应保持流不变的零长度段来防止 ACK 风暴。
显然,仍然会有 TCP 段,它们只是不包含任何有效负载。
帧被乱序发送的观察结果很奇怪,因为这暗示了一个包含大量缓冲的环境。您是在路由 WAN 上还是在单个 LAN 网段上进行测试?
重新传输尚未到达的数据包是 TCP所做的。足够乱序的延迟到达——特别是 ACK——破坏了它的同步安全裕度并且它中止了。