我试图根据需要通过延迟数据包来模拟人工网络条件(正在模拟的应用程序是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”(流量控制)规则产生了相同的效果。同样的事情发生。 –