我们有一个应用程序以定义的速率定期发送 TCP 消息(使用 MODBUS TCP)。如果在设定时间内未收到消息,则会发出警报。但是,每隔一段时间,接收消息似乎会有延迟。调查表明,这与正在刷新的 ARP 缓存有关,导致重新发送 TCP 消息。
IP 堆栈提供者告诉我们这是 TCP 的预期行为。问题是, 这是 IP 堆栈的预期行为吗?如果不是,其他堆栈如何在 IP/MAC 地址转换不可用期间工作 如果这是预期的行为,我们如何才能减少这段时间内 TCP 消息的延迟?(永久 ARP 条目已尝试过,但不是最佳解决方案)
最佳答案
在我上一份工作中,我曾在一家制造路由器和交换机的公司工作。我们的实现将等待 ARP 回复的数据包排队,并在收到 ARP 回复时发送它们。因此,不需要 TCP 重传。
当在给定时间内未收到 ACK 时,TCP 会发生重传。如果 ARP 回复需要很长时间,或者本身丢失了,即使等待 ARP 回复的设备正在排队数据包,您也可能会重新传输。
从您的问题看来,TCP 消息的周期比 ARP 刷新时间短。这意味着 ARP 的重用不会导致它保持刷新状态,这可能是对您的情况有帮助的行为。
对所发生情况的数据包跟踪可能会有所帮助 - 您是否真的丢失了第一个数据包? ARP 回复需要多长时间?
为了阻止 ARP 缓存超时,您可能想尝试找到可以刷新它的东西,例如对同一地址的另一个 ARP 请求,或者一个免费的 ARP。 我找到了 MODBUS TCP 的规范,但没有帮助。你能发布一些关于你的网络的细节——媒体、设备、速度吗?
关于tcp - 如何减少 MODBUS TCP 的 ARP 刷新导致的 TCP 延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1672408/