tcp - 如何减少 MODBUS TCP 的 ARP 刷新导致的 TCP 延迟

标签 tcp arp modbus

我们有一个应用程序以定义的速率定期发送 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/

相关文章:

c - libmodbus 函数输出的部分输出打印

java - DataOutput.writeByte()/DataInput.readByte() 或其他等效项在 Java 中如何工作?

用于 TCP 消息传递的 .NET 项目

c - C语言的TCP客户端和服务器

regex - 使用 grep 正则表达式从 arp 表中提取 MAC 地址

java - J2mod从保持寄存器读取不同的值

c++ - TCP 是否支持不可打印的字符?

router - 网关没有 ARP 响应

iphone - 如何在iPhone上查询ARP表?

c - STM32F103 在 RX 中断时无法通过 UART 接收数据