我试图通过在必要时延迟数据包来模拟人工网络条件(被模拟的应用程序是Java应用程序)。
我面临的问题是,应用程序检测到它一段时间没有收到ACK并重新发送。这发生在两端,引起裂变反应。数据包是无序接收的,最终,一方发送一个RST数据包。
我想确保这种情况永远不会发生。我该怎样避免这个?
由于
更新:一些Wireshark捕获会话图像:http://db.tt/fav2sRgL和http://db.tt/zGXwMubk
答案 0 :(得分:0)
解决方案取决于仿真的意图。
如果您需要线级保真度,则需要控制整个TCP堆栈来管理时序。相反,如果您希望模拟套接字级别的行为,则可以通过响应保持流不变的零长度段来阻止ACK风暴。
显然,仍然会有TCP段,它们只是不包含任何有效载荷。
观察到帧不按顺序发送是很奇怪的,因为这表明包含大量缓冲的环境。您是通过路由WAN还是单个LAN网段进行测试?
答案 1 :(得分:0)
重新传输尚未到达的数据包是TCP 所做的。足够的无序延迟到达 - 特别是确认 - 会破坏其同步安全边缘并中止。
答案 2 :(得分:0)
听起来你持有超过1秒的数据包,这在网络领域真的很长时间,并不是TCP会满意的。结果的失败级联几乎是您对TCP的期望。
但首先你需要考虑这种类型的延迟是否真的是你想要模仿的。数据包遍历路径的时间(单向),往返时间(返回时间)和应用程序处理和响应所花费的时间(独立于网络堆栈)之间存在很大差异)。
我在network statistics和emulation上撰写了几篇您可能会觉得有用的文章。
免责声明:我为一家生产替代传输协议的公司工作。