2012-05-26 81 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