我们有一个应用程序,它定期以定义的速率发送TCP消息(使用MODBUS TCP)。如果在设定的时间段内未收到消息,则会发出警报。然而,每隔一段时间似乎就会收到消息的延迟。调查显示,这与正在刷新的ARP缓存相关联,导致重新发送TCP消息。
IP堆栈提供商告诉我们这是TCP的预期行为。问题是, 这是IP堆栈的预期行为吗?如果不是,那么当IP / MAC地址转换不可用时,其他堆栈如何工作 如果这是预期的行为,我们如何在此期间减少TCP消息的延迟?(已尝试永久ARP条目,但不是最佳解决方案)
答案 0 :(得分:1)
在我上一份工作中,我与一家建造路由器和交换机的公司合作。我们的实现会将等待ARP回复的数据包排队,并在收到ARP回复时发送它们。因此,不需要TCP重传。
在给定时间内未收到ACK时,会发生TCP重传。如果ARP回复需要很长时间,或者本身丢失,即使等待ARP回复的设备正在对数据包进行排队,也可能会进行重新传输。
从您的问题中可以看出,TCP消息的周期短于ARP刷新时间。这意味着ARP的重用不会导致它保持刷新状态,这可能会对您的情况有所帮助。
发生情况的数据包跟踪可能会有所帮助 - 您实际上是丢失了第一个数据包吗? ARP回复需要多长时间?
为了阻止ARP缓存超时,您可能希望尝试查找将刷新它的内容,例如针对同一地址的另一个ARP请求或无偿ARP。 我找到了MODBUS TCP的规范,但它没有帮助。你能发布网络的一些细节 - 媒体,设备,速度吗?
答案 1 :(得分:0)
您的描述表明,对等ARP条目在TCP网段之间到期,导致某些后续网段因缺少当前MAC目的网而失败。
如果您将MODBUS设备放在一个单独的子网上,那么目标路由器可能会对该段进行排队,直到它收到有效的MAC。如果您不能使用单独的子网,则可以尝试强制会话激活keep-alives - 这将导致发送定期空消息,从而使ARP计时器保持重置状态。如果保持活动的开销太高并且您完全控制系统中的应用程序,则可以尝试强制将零长度消息传递给对等方。