2009-11-04 376 views
2

我们有一个应用程序定期以定义的速率发送TCP消息(使用MODBUS TCP)。如果在设定的时间内未收到消息,则会发出警报。然而,每过一段时间,收到的消息似乎都会延迟。调查显示,这与正在刷新的ARP缓存相关,导致TCP消息的重新发送。如何减少MODBUS TCP的ARP冲刷引起的TCP延迟

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

回答

1

在我上一份工作中,我曾与一家建立路由器和交换机的公司合作。我们的实现会对等待ARP答复的数据包进行排队,并在接收到ARP答复时发送它们。因此,不需要TCP重传。

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

从您的问题中可以看出,TCP消息的周期短于ARP刷新时间。这意味着重复使用ARP并不会导致其刷新,这可能会对您的情况有所帮助。

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

为了阻止ARP缓存超时,您可能需要尝试查找将刷新它的内容,例如另一个针对相同地址的ARP请求或免费ARP。 我发现一个MODBUS TCP的规范,但它没有帮助。你可以发布你的网络的一些细节 - 媒体,设备,速度?

0

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

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