心跳消息也是上层传输层定义的控制消息之一。用于监控节点是否处于网络中,节点之间的距离。
1. Heartbeat PDU

| Field | Size(bits) | Notes |
|---|---|---|
| RFU | 1 | Reserved for Future Use |
| InitTTL | 7 | 该消息的初始TTL值 取值范围:0x00-0x7F |
| Features | 16 | 该节点正在使用的feature |
Features参数域bit位如下:

| Field | Notes |
|---|---|
| Relay | 0:未使用中继特性 1:使用中继特性 |
| Proxy | 0:未使用代理特性 1:使用代理特性 |
| Friend | 0:未使用Friend特性 1:使用Friend特性 |
| Low Power | 0:未使用低功耗特性 1:使用低功耗特性 |
2. 心跳消息交互
周期向四周发送心跳消息,每个节点发送的次数由配置客户端配置,可以是固定次数,也可以是无限次。
节点接收到同一地址的心跳消息的次数和收到消息的最大最小跳数(hops)来决定两个节点之间的链路质量。
跳数计算如下:
hops=InitTTL−RxTTL+1hops = InitTTL-RxTTL+1hops=InitTTL−RxTTL+1
其中InitTTLInitTTLInitTTL为发送心跳端的初始TTL值,在心跳数据包里面的InitTTL字段,RxTTLRxTTLRxTTL为接收到的消息的当前TTL值。
通过hops可以得到两点之间的最优TTL值。
心跳消息的配置通过配置客户端配置,通过Configuration Model中的Heartbeat Publication state来配置心跳消息的发布周期和次数。通过Heartbeat Subscription state来配置心跳消息接收的时长和次数。
2.1. Heartbeat Publication state
配置客户端发送Config Heartbeat Publication Get/Set消息来获取/设置节点的心跳发布状态,节点收到后响应Config Heartbeat Publication Status。不同的消息类型通过Opcode进行区分。
配置客户端发送的Get消息的Opcode为0x8038,参数域为空。
配置客户端发送的Set消息的Opcode为0x8039,参数域如下:

| Parameters | Size(octets) | Notes |
|---|---|---|
| Destination | 2 | 心跳消息的目的地址,即向哪个组发心跳,若该地址设置为unsigned address,则心跳消息不会发送,相当于取消心跳程序。 |
| CountLog | 1 | 心跳消息的数量,每发送一次心跳,Count值减1,为0时则停止发送。 CountLog和Count的对应值如下: 0x00:不会周期发送心跳消息 0x01-0x11:Count=2(CountLog−1)Count=2^{(CountLog-1)}Count=2(CountLog−1) 0x12-0xFE:无效值 0xFF:无限制发送 |
| PeriodLog | 1 | 两次连续心跳消息的间隔时间。 PeriodLog和Period的对应值如下: 0x00:不会周期发送心跳消息 0x01-0x11:Period=2(PeriodLog−1)Period=2^{(PeriodLog-1)}Period=2(PeriodLog−1) 0x12-0xFF:无效值 |
| TTL | 1 | 发送心跳使用的TTL值,即心跳消息的InitTTL段 |
| Features | 2 | 哪些特性被被改变时需要触发心跳信息程序 tu bit位设置为1:表示该特性被改表需要触发心跳程序 |
| NetKeyIndex | 2 | NetKeyIndex,由NetKey生成,由配置客户端统一管理 |
被配置端响应的Status消息的Opcode为0x06,参数域如下:

| Parameters | Size(octets) | Notes |
|---|---|---|
| Status | 1 | 请求消息的状态码,表示操作成功与否。 |
| Destination | 2 | 心跳消息的目的地址,即向哪个组发心跳,若该地址设置为unsigned address,则心跳消息不会发送,相当于取消心跳程序。 |
| CountLog | 1 | 心跳消息的数量,每发送一次心跳,Count值减1,为0时则停止发送。 |
| PeriodLog | 1 | 两次连续心跳消息的间隔时间。 |
| TTL | 1 | 发送心跳使用的TTL值,即心跳消息的InitTTL段 |
| Features | 2 | 哪些特性被被改变时需要触发心跳信息程序 |
| NetKeyIndex | 2 | NetKeyIndex,由NetKey生成,由配置客户端统一管理 |
可以知道响应的状态只比设置消息多了一个字节表示状态,但是多这一个字节,导致参数域为10字节,而access消息包含Opcode若超过11字节就要分段,所以为了避免分段,Status响应消息的Opcode为1字节,这就是为什么心跳发布的Get/Set消息的Opcode是2个字节,而响应的Status消息是1个字节的原因。
Set设置的参数域中的Features,表示如果那个feature被改变了,我要开始向四周广播心跳。这里为心跳程序开始的起点。若Features域的Relay bit域从0设置为1,此时心跳会被触发,向四周广播当前节点的心跳。心跳消息中的Features域表示当前节点的feature,设置中的Features域表示节点心跳的触发点。
2.2. Heartbeat Subscription state
配置客户端发送Config Heartbeat Subscription Get/Set消息来获取/设置节点的心跳订阅状态,节点收到后响应Config Heartbeat Subscription Status。不同的消息类型通过Opcode进行区分。
配置客户端发送的Get消息的Opcode为0x803A,参数域为空。
配置客户端发送的Set消息的Opcode为0x803B,参数域如下:

| Parameters | Size(octets) | Notes |
|---|---|---|
| Source | 2 | 设置当前要监听的心跳消息的源地址,只能为unsigned address或者单播地址 |
| Destination | 2 | 设置监听源心跳消息的目的地址,只有源地址和目的地址都匹配的心跳消息才能被接收,只能为unsigned address或者节点的首元素地址或者group address。 |
| PeriodLog | 1 | Period=2(PeriodLog−1)Period=2^{(PeriodLog-1)}Period=2(PeriodLog−1)。设置当前的心跳接收的窗口,Period随时间减少,当为0时,停止心跳接收。 |
心跳的发布订阅地址和正常消息的发布订阅不是同一套系统,心跳消息都靠配置客户端设置的心跳Pub/Sub来进行收发和过滤。这样就能使设置了黑白名单的被代理节点也能收到心跳消息??P149
被配置端响应的Status消息的Opcode为0x803C,参数域如下:

| Parameters | Size(octets) | Notes |
|---|---|---|
| Status | 1 | 请求消息的状态码,表示操作成功与否。 |
| Source | 2 | 设置当前要监听的心跳消息的源地址。 |
| Destination | 2 | 设置监听源心跳消息的目的地址。 |
| PeriodLog | 1 | 监听心跳消息的窗口剩余时间。 |
| CountLog | 1 | 接收心跳消息的次数区间。count=[2(CountLog−1),2CountLog)count=[2^{(CountLog-1)},2^{CountLog})count=[2(CountLog−1),2CountLog) |
| MinHops | 1 | 接收心跳消息的最小跳数。取值范围为:0x01-0x7F |
| MaxHops | 1 | 接收心跳消息的最大跳数。取值范围为:0x01-0x7F |
本文深入解析心跳消息在节点监控及网络通信中的作用,探讨其在维护节点间链路质量和距离评估上的具体实现,包括心跳消息的结构、周期发送机制、TTL值计算,以及心跳消息的发布与订阅状态配置。
1281

被折叠的 条评论
为什么被折叠?



