一个 TCP 段中可以有多个应用层 (Modbus) PDU 吗?

Can there be several application layer (Modbus) PDUs in one TCP segment?

我正在分析一些捕获的数据包,发现对于某些数据包,Wireshark 显示了下图,它似乎在一个 TCP 段中包含多个 Modbus PDU。我在网上搜索了答案,但在任何地方都看不到这种行为。根据我正在阅读的内容,Wireshark 重新组装收集了不同的 TCP 段,因此看来这不能重新组装。

我的问题是:这种行为(即在一个 TCP 段中有多个 Modbus PDU)是否正常且符合预期?如果不是,是什么导致了这个问题?这是 Wireshark 的问题吗?

link to fullsize image

是 - Modbus TCP 在 application layer and supports multiple simultaneous transactions over a single connection (see page 10 of the spec 运行。所以发送:

00 01 00 00 00 06 01 03 00 00 00 01 00 02 00 00 00 06 01 03 00 01 00 01

很好(这是 2 个“Read Holding Register”命令——注意不同的事务标识符)。如果这是同时发送的,那么这两个命令很可能会在同一个数据包中发送出去。虽然这是支持的(某些设备!),但我并不经常看到它(除非性能是关键,否则在发送另一个请求之前更容易处理响应)。

不过,我认为您的情况并非如此。您突出显示的行已标记为 TCP Retransmission,因此我假设存在连接问题。您还可以在重新传输的打包请求和上一个请求之间的 1s 间隔中看到这一点(看起来每 300 毫秒发送一次查询)。

862.493794
862.805685 - 0.3 秒的差距
863.117588 - 0.3 秒差距
864.232576 第一次重传 - 1.1 秒间隔

您还会注意到,在重传之后,有几个响应非常接近(相隔不到 1 毫秒)。

当数据被重新传输时,我相信(不是我的领域,所以依赖 和假设!)多个数据包可能会合并。所以我怀疑你看到的是:

  • 网络连接问题开始
  • 客户端发送请求
  • 未收到响应,因此客户端会重试(可能会发生多次)
  • 连接问题已解决
  • 出现问题时发送的数据包被合并并重新传输(由网络堆栈处理)。

在任何情况下,TCP 都不能确保如果您发送 x 字节的数据包,另一端将在单个数据包中接收 x 字节。

可能发生一方发送1000字节而另一方先收到800然后收到200,或者发送了1000和2000的两个数据包而另一方只收到3000中的一个。

从接收到的 PDU 中,首先必须读取获得长度所需的字节,然后读取其余部分,依此类推以提取 PDU