2

我们有一个应用程序以定义的速率定期发送 TCP 消息(使用 MODBUS TCP)。如果在设定的时间内没有收到消息,则会发出警报。但是,每隔一段时间,收到的消息似乎都会有所延迟。调查表明,这与刷新 ARP 缓存导致重新发送 TCP 消息有关。

IP 堆栈提供商告诉我们这是 TCP 的预期行为。问题是,这是 IP 堆栈的预期行为吗?如果不是,其他堆栈如何在 IP/MAC 地址转换不可用期间工作 如果这是预期的行为,我们如何减少此期间 TCP 消息的延迟?(已尝试永久 ARP 条目,但不是最佳解决方案)

4

2 回答 2

1

在我的上一份工作中,我曾在一家制造路由器和交换机的公司工作。我们的实现将等待 ARP 回复的数据包排队,并在收到 ARP 回复时发送它们。因此,不需要 TCP 重传。

当在给定时间内未收到 ACK 时,TCP 中会发生重传。如果 ARP 回复需要很长时间,或者本身丢失,即使等待 ARP 回复的设备正在对数据包进行排队,您也可能会重新传输。

从您的问题中可以看出,TCP 消息的周期短于 ARP 刷新时间。这意味着 ARP 的重用不会导致它保持刷新,这可能是对您的情况有帮助的行为。

对所发生情况的数据包跟踪可能会有所帮助 - 您是否真的丢失了第一个数据包?ARP回复需要多长时间?

为了阻止 ARP 缓存超时,您可能想尝试找到可以刷新它的东西,例如对同一地址的另一个 ARP 请求,或者一个免费的 ARP。我找到了 MODBUS TCP 的规范,但没有帮助。您能否发布您的网络的一些详细信息 - 媒体、设备、速度?

于 2009-11-11T17:24:45.997 回答
0

您的描述表明,TCP 段之间的对等 ARP 条目到期,并导致一些后续段由于缺少当前 MAC 目标而失败。

如果您在单独的子网上有 MODBUS 设备,那么目标路由器可能会好心地将该段排队,直到它接收到有效的 MAC。如果您不能使用单独的子网,您可以尝试强制会话激活 keep-alives - 这将导致定期发送空消息,从而使 ARP 计时器保持重置。如果保持活动的开销太高并且您完全控制系统中的应用程序,您可以尝试强制零长度消息通过对等方。

于 2009-11-14T07:25:01.943 回答