Sequence number在正常使用中可能带来的问题:
一般正常发送数据,每条数据的Sequence number会在原来的基础上加1,这样接收者会保存发送者的Sequence number,如果此时发送者掉电上电后Sequence number被清零,发送的数据的Sequence number会再次从零开始累加,这样接收者接收到的数据小于之前保存的Sequence number的数据,就会将这条数据丢弃不处理,这样就会导致该设备一段时间无法正常通信,一般建议掉电上电前发送的Sequence number需要保存,掉电后也在掉电前的数据上进行累加,然后接收的Sequence number就不需要保存,这样即使上电后之前保存的接收的Sequence number为0后面正常接收过来的数据的Sequence number也会大于0也能正常处理。
Sequence number的作用:
在网络安全中,重放攻击是一种技术,窃听者拦截并捕获一个或多个消息,然后在稍后重新发送它们,目的是欺骗接收者,执行攻击设备没有授权做的事情。一个经常被引用的例子是,汽车的无钥匙进入系统被攻击者破坏,拦截车主和汽车之间的认证序列,然后重播这些信息,以进入汽车并偷走它。
蓝牙mesh有保护功能,可以防止重放攻击。这种保护的基础是使用了两个网络PDU字段,分别称为序列号(SEQ)和IV索引。元素在每次发布消息时都会增加SEQ值。节点从包含SEQ值小于或等于最后一条有效消息中的值的元素接收消息时,将丢弃它,因为它很可能与重放攻击有关。IV指数是一个单独的领域,与SEQ一起考虑。IV来自给定元素的消息中的索引值必须始终等于或大于来自该元素的最后一条有效消息。
Sequence number的定义:
序列号是一个包含在网络PDU的SEQ字段中的一个24位值,主要设计用于防止重放攻击。同一节点内的元素可能彼此共享,也可能不共享序列号空间。在每个新的网络PDU中为每个消息源拥有不同的序列号(由SRC字段中包含的单播地址标识)对网状网络的安全性至关重要。
使用24位序列号,元素可以在重复一次重复之前发送16,777,216条消息。如果一个元素平均每5秒发送一次消息(对于已知用例表示相当高的频率消息),该元素可以在一次重复之前传输2.6年。
每个元素生成的网络pdu应严格增加序列号。在序列号接近最大值(0x FFFFFF)之前,元素应使用IV更新程序更新IV索引。这样做是为了确保序列号永远不会被环绕起来。
IV Index:
IV索引是一个32位的值,它是一个共享的网络资源(即,网状网络中的所有节点共享相同的IV索引值,并将其用于它们所属的所有子网)。
IV索引从0x00000000开始,并在第3.10.5节所述的IV更新过程中增加。当值增加时的时间不必是精确的,因为最小有效位是在每个网络PDU内通信的。由于IV索引的值是一个32位的值,所以一个网状网络可以在IV索引结束之前运行大约5万亿年。
IV索引通过安全网络信标在网络中共享。在一个子网上接收到的IV更新被处理并传播到该子网。传播是通过传输安全网络信标的设备与更新的IV索引的特定子网。如果主子网上的设备接收到主子网上的更新,则它应将IV更新传播到所有其他子网。如果主子网上的设备接收到任何其他子网上的IV更新,则应忽略该更新。
如果一个节点在网状网络中缺失一段时间,它可以扫描安全网络信标或使用IV索引恢复程序,从而自动设置IV索引值。
空口数据包中的sequence number: