• 采用一个公共机制来建立本地链路信息库和相邻区域信息库
  • 这个机制就是周期性交换HELLO消息

    HELLO消息的格式

  • 采用一种类似于通用分组格式的方法提供链路探测、相邻区域探测、MPR选择信令,以及今后的协议扩充

image.png

  • HELLO消息作为前面描述的通用分组格式中的数据组成部分来发送
  • 其“消息类型”被设为HELLO_MESSAGE(HELLO消息类型)
  • TTL设为1
  • Vtime相应地设为NEIGHB_HOLD_TIME(HELLO消息保持时间)
  • 对图的各个组成域详细说明如下:
    • 保留(Reserved):

保留域必须设为全0, 以便与本规范保持一致。

  • HELLO消息发送周期(Htime):

本域指定本节点在某个特定接口上发送HELLO消息的间隔时间,即发送下一条HELLO消息之前的时间。
可以将这个时间信息用于链路探测。
HELLO消息发送间隔时间用本域高部4比特表示的尾数和本域低部4比特表示的指数来共同麦示,即:

【自组织网络】OLSR消息HELLO - 图2
其中: a表示本域高部4比特表示的整数,b表示本域低部4比特表示的整数
比例因子C的建议值见(https://www.yuque.com/wangxi_chn/iku3gm/gb60gu

  • 愿意(Willingness):

本域说明一个节点愿意承载和转发其他节点的信息。
一个将本域设为WILL_NEVER (总是不愿意)的节点决不会被任何节点选作MPR
一个将本域设为WILL_ALWAYS (总是愿意)的节点必定总是被选作MPR
在默认情况下,一个节点应该广播本域为WILL_DEFAULT (默认)

  • 链路编码(Link Code):

本域说明发送节点接口与随后相邻节点接口列表之间的有关链路信息
本域也可以说明一个相邻节点的有关状态信息
丢掉节点不认识的链路编码

  • 链路消息长度(Link Message Size):

本域表示一条链路消息的长度,单位是字节
从“链路编码”域开头开始计算,到下一个“链路编码”域开始时结束长度计算
(假如不存在多种链路类型,则到本条消息结尾处结束长度计算)

  • 相邻节点接口地址(Neighbor Interface Address):

本域表示一个相邻节点的其中一个接口的地址

  • 下面根据链路类型和相邻节点类型的链路编码,说明小于16的链路编码的处理
  • 假如链路编码小于或者等于15,则必须按照两个不同的域(每个域长2比特)来解释该链路编码
  • 如图

image.png

  • OLSR协议需要如下四种“链路类型”:
    • UNSPEC_LINK:表示没有特定信息的链路
    • ASYM_LINK:表示非对称链路(即相邻节点接口能够接收的链路)
    • SYM_LINK:表示使用该接口的链路是对称链路
    • LOST_LINK:表示该条链路已经丢失
  • OLSR协议需要如下三种“相邻节点类型”:
    • NOT_NEIGH:表示这些节点不再是对称相邻节点或者至今还未变成对称相邻节点
    • SYM_NEIGH:表示这些相邻节点与本节点之间至少有一条对称链路
    • MPR NEIGH:表示这些相邻节点至少有一条对称链路到达本发送节点,而且这些相邻,节点已经被本发送节点选作MPR
  • 在具体实现中,应该细心,既不要混淆链路类型和相邻节点类型
  • 也不要混淆各个常数(比如,混淆SYM NEIGH和SYM LNK)
  • 同时满足下列条件的一个链路编码广播是无效的:
    • Link Type = SYM_ LINK (对称链)
    • Neighbor Type = NOT_NEIGH (非对称相邻节点)

必须丢掉这样广播的任何链路,无需对其做任何处理
同样,不等于SYM NEIGH (对称相邻节点)、MPR NEIGH (MPR相邻节点)、NOT_ NEIGH(非对称相邻节点)的相邻节点类型无效。必须丢掉这样广播的任何链路,无需对其做任何处理

HELLO消息的产生

  • HELLO消息的产生涉及到链路集合、相邻节点集合,以及MPR集合的发送
  • 原则上,一条HELLO消息完成以下三个独立的任务
    • 链路探测
    • 相邻节点探测
    • MPR选择信令
  • 三个任务都是基于一个节点相邻区域内的周期性信息交换来提供“本地拓扑建立”服务
  • 因此,根据本地链路信息库中的本地链路集合、相邻节点集合,以及MPR集合中存储的信息产生HELLO消息

  • 一个节点必须在每个接口上进行链路探测,以便检测该接口与相邻节点接口之间的链路

  • 为了进行相邻节点探测,一个节点必须将其整个对称一跳相邻区域广播到每个接口上
  • 因此对于一个给定接口,一条HELLO消息包含该接口上(跟链路类型有关)的链路列表,以及整个相邻区域(跟相邻节点类型有关)的列表

  • HELLO消息各个组成域的设置是:

    • 将接收信息有效时间(Vtime) 域设为本节点参数NEIGHB_ HOLD_TIME的数值
    • 将HELLO 消息发送周期(Htime) 域设为本节点参数HELLO_ _INTERVAL的数值
    • 将愿意( Willingness)域设为本节点的愿意设置,以便转发其他节点的信息
  • 在一条HELLO消息中声明的地址列表是相邻节点接口地址列表,其计算如下:

  • 对于链路集合中的每个数组,若L_local_iface_addr 等于本条HELLO消息发往的接口的地址,L_time≥当前时间(即有效时间还没有结束),则广播L_neighbor_iface_addr, 其设置如下:

  • 第一步,链路类型设置如下:
    • 若L_SYM_time ≥ current time (有效时间还没有结束)

则设置Link Type =SYM_ LINK (对称链路)

  • 否则,若L_ASYM_time ≥ curent time (有效时间还没有结束),并且L_SYM_time < current time(有效时间已经结束),则设置Link Type = ASYM_LINK (非对称链路)
  • 否则,若LASYM_time < current time(有效时间已经结束),并且L_SYM_time < current time (有效时间已经结束),则设置Link Type = LOST LINK (丢失链路)
    • 第二步,相邻节点类型设置如下:
  • 若MPR集合包含等于L_neighbor_iface_addr 的主地址

则: Neighbor Type = MPR_ NEIGH(MPR相邻节点)

  • 否则,若相邻节点集合包含等于L_neighbor_iface_addr 的主地址,则:

若Nstatus = SYM,则设置Neighbor Type = SYM NEIGH (对称相邻节点)
否则,若N status == NOT SYM,则设置Neighbor Type = NOT_ NEIGH (非对称相邻节点)

  • 对于相邻节点集合中的每个数组,采用前述算法已经广播的一个关联链路数组不存在相应的L_neighbor_iface_addr地址,则随同下列链路类型和相邻节点类型信息一起广播

    • N_neighbor_main_addr:
    • ①Link Type = UNSPEC_ LINK
    • ②相邻节点类型按照上述第二步方法设置
  • 对于一个单OLSR接口的节点,其主地址等于该OLSR接口的地址,即对于一个单OLSR接口节点,对应于L_neighbor_iface_addr 地址的主地址就是L_neighbor_iface_addr 地址

  • 一条HELLO消息可能被分成若干块(由于系统规定的消息长度有限)发送到每个接口上

  • 其规则如下:
  • 在一个预先规定的刷新周期REFRESH_ INTERVAL 内,每条链路和每个相邻节点必须至少引用一次
  • 为了保持跟踪连通性的快速变化,在每个HELLO_ INTERVAL 周期内至少必须发送一条HELLO消息
  • HELLOINTERVAL周期小于或者等于刷新周期REFRESH INTERVA

  • 为了限制控制消息丢失造成的影响,尽量将一条消息(包括通用分组头)封装到一个MAC分组中

    HELLO消息的转发

  • 产生的每条HELLO消息由其源节点广播到与其相邻节点连接的一个接口上(即,该条HELLO消息就是为该接口产生的)。HELLO消息决不能被转发

    HELLO消息的处理

  • 节点处理其接收到的HELLO消息,以便引导链路探测、相邻节点探测,以及MPR选择器集合的建立。