MSTP帧失步解决方案

因为固件版本3.x,于2020.3.25更新

我们曾在下面的文章中讨论过BACnet MSTP协议中有帧失步的弱点:

BACnet MSTP 帧失步

针对 BACnet MSTP 的帧失步攻击

对于BACRouter 来说,怎么来防范这个漏洞呢?让我们从标准的 9.5.3章节找线索:

Tframe_gap 翻译为字节间隔,指的是 “节点在发送一个帧时,在两个字节之间允许的最长的空闲时间”,它的值是20位时间。市面大部分MSTP设备的字节间隔为0。

所以BACRouter采用一个改进的接收有限状态机:

  1. 在一个MSTP帧中,字节间隔如大于Tframe_gap,认为MSTP帧中断。
  2. 字节间隔如大于帧间隔Tturnaround,认为新的MSTP帧出现。考虑到字节帧失步引起的测量误差,我们实际采用的值是30.5位时间。
  3. 为了尽量兼容部分不遵守Tturnaround的设备,所有在有效MSTP帧后的数据认为是新的一帧。

在115200波特率下,一个数据位的时间仅8.7微秒,为了精确地测量空闲时间,BACRouter采用了5微秒精度的定时器,它有效地防止帧失步出现,并且 在115.2kbps下达到98.8%的带宽利用率 因为BACRouter发包时精确地遵守40位的Tturnaround,没有浪费多余的等待时间。