非OLSR的接口
- 一个节点可能配置有多个接口,其中有些接口不参与OLSRMANET网络操作
这些非OLSR接口可能通过点对点方式连接其他单个主机或者单个网络
为了提供OLSR MANET接口和非OLSR接口之间的连接
一个节点应该能够将外部路由信息注入到OLSR MANET网络中
将路由信息从OLSR MANET网络注入非OLSR接口超出本规范的讨论范围
- 但是,应该清楚OLSR MANET网络路由信息可以从拓扑表中提取或者可以从OLSR路由表中直接得到
- 并且应该注入到非OLSR接口,不论这些非OLSR接口提供何种机制(路由协议、静态配置、等等)
- 给出一个例子如下:
- 一个节点通过一个固定网络(比如以太网)连接到一个较大的网络,同时配备有运行OLSR协议的无线网络接口
注意:这种一个节点同时具有OLSR接口和非OLSR接口的情况不同于一个节点同时具有“多接口”情况,后者是全部接口都运行OLSR协议,参与MANET网络操作
为了使一个具有非OLSR接口的节点能够将外部路由信息注入到OLSR MANET网络,该节点周期性发送主机和网络关联(Host and Network Association, HNA)消息
-
HNA消息的格式
HNA消息作为前面描述的通用分组格式中的数据组成部分来发送
- 其“消息类型”被设为HNA_ MESSAGE (HNA消息类型)
- TTL 应该设为最大值255
- Vtime 相应地设为HNA_HOLD_TIME (HNA消息保持时间)
对各个组成域详细说明如下:
每个节点维护可以作为“网关”连接到关联主机和关联网络的有关节点的信息
- 其方法是记录“关联数组(Association Tuple)”
- A_gateway_addr 表示本网关的一个OLSR接口的地址
- Anetwork_addr 和 A netmask 分别表示一个通过本网关可达的一个网络的网络地址和掩码地址
- A_time 表示本数组的有效期满时间,期满时间结束后必须删除本数组
一个节点的全部关联数组组成的集合叫做“关联集合”(Association Set)
应该注意
- HNA消息可以看成“广义化的”TC消息
- HNA消息和TC消息的源节点都向外声明其他哪些主机“可达”
- 因为根据每个主机来声明可达性,所以TC消息不需要使用掩码地址
在HNA消息中,通常宁愿通过网络地址和掩码地址声明可达一个地址序列,而不愿意声明可达单个的主机地址
HNA消息和TC消息之间的重要区别是
- TC消息对以前的信息具有删除作用(假如其ANSN是递增的)
-
HNA消息的产生
连接关联主机或者关联网络的节点应该周期性产生HNA消息
- HNA包含所连接的主机和网络的地址对(网络地址,掩码地址)
- 应该以HNA_INTERVAL作为HNA消息的发送周期时间
- Vtime 相应地设为HNA_HOLD_TIME (HNA消息保持时间)
-
HNA消息的转发
接收到一条HNA消息后
- 而且符合本版OLSR通用分组格式
-
HNA消息的处理
术语“源节点地址”用于表示OLSR MANET网络中最初发送一条HNA消息的节点的主地址
- 一条HNA消息被接收后,必须根据本条消息头部的Vtime域计算其“有效时间”
然后应该按照以下方法更新主机和网络关联信息库
第一,若本条消息的发送节点(注意:不是消息的源节点)接口不在该节点的对称一跳相邻区域内,则必须丢掉本条消息
第二,否则,对于本条消息中的每对地址( 网络地址,掩码地址):
- (1)若关联集合中存在-一个数组条目(即关联数组):
- A_gateway_addr = originator address (本条HNA消息的源节点地址)
- A_network_addr = network address (网络地址)
- A_netmask = netmask ( 掩码地址)
- 则本关联数组的保持时间设为:
- A_time = current time + validity time
- (2)否则,在关联集合中记录一个新的关联数组:
- (1)若关联集合中存在-一个数组条目(即关联数组):
除了前面描述的路由表计算(内核功能之一)以外
还必须按照以下方法添加主机和网络关联集合:
对于关联集合中的每个关联数组:
- 第一步,若路由表中不存在路由条目:
- R_dest_addr = A_network_addr/A_netmask (网络地址/掩码地址)
- 则建立一个新的路由条目
第二步,若按照第一步建立了一个新的路由条目, 或者路由表中存在一个路由条目:
- Rdest_addr = A_network_addr/A netmask (网络地址/掩码地址)
- R_dist > 到达当前关联集合数组的A_gateway_addr的跳数据离
- 则将该路由条目修改如下:
- R_dest_addr = A_network_addr/A_netmask (网络地址/掩码地址)
- R_next_addr = 从本节点到达A_gateway_addr 的路由上的下一跳
- R_dist = 到达A_gateway_addr 的跳数距离
- 必须使Rnext_addr 和 R_iface addr 分别等于路由集合中 R_dest_addr = A_gateway_addr 的路由数组中的R_next_addr 和 R_iface_addr
互操作性考虑
没有实现非OLSR接口支持的节点能够共存于包含真正支持非OLSR接口的节点的网络
- 通用分组格式和消息转发确保HNA消息被所有节点正确转发
- 因此,支持非OLSR接口的节点可以根据本节的规则发送和处理HNA消息
不支持非OLSR接口的节点不能利用本节说明的功能,但是仍然能够正确转发HNA消息
链路层通知
OLSR协议并不有意利用或者需要链路层的任何特定信息
但是,假如一个节点能够从链路层得到有关链路中断的信息,那么该节点就可以按照本节的描述使用这种信息
若能够得到描述与相邻节点连接的链路层信息(即,诸如接收不到链路层应答的连接丢失信息)
- 则可以联合利用该信息和HELLO消息中的信息来维护相邻节点信息库和MPR选择器集合
因此,接收到一个关于一个节点和一个相邻节点之间的链路已经中断的链路层通知后,就链路探测采取以下操作:
除了在OLSR协议内核中描述的链路探测及本地链路信息库操作以外
- 本地链路集合中的每个链路数组应该包含一个LLOST_LINK time 组成域
- L_LOST_LINK_time 表示一个定时器
- 用于在一条已建立链路变得即将中断之时声明该条链路已经丢失
(注意:这就是在链路滞后作用中介绍的一个子集,因此,链路层滞后作用和链路层通知能够共存)
HELLO消息的产生应该考虑以下这些组成域:
- (1)若时间L_LOST_LINK_time 还没有结束,则使用链路类型LOST_LINK (链路丢失)广播该条链路
- 此外,在更新关联相邻节点数组时不用将这条链路考虑为一条对称链路
- (2)若到达一个对称(或者不对称)相邻节点接口的链路已经中断,则将对应的链路数组修改如下
- 将LLOST_LINK_time和L_time均设成current time + NEIGHB HOLD TIME
(3)认为本条链已经丢失,而且应该按照相邻区域和二跳相邻区域变化的处理规则进行适当的处理
链路层通知为一个节点提供了另外一个准则
- 即确定到达一个相邻节点的链路是否丢失的准则
一旦检测出一条链路已经丢失,则根据本版规范前面描述的规则广播这条链路
链路滞后作用(Link Hysteresis)
已建立的链路应该是尽可能的可靠,以便防止分组丢失
- 这就意味着链路探测应该具有抗链路突发丢失和节点间短暂连接的能力
-
本地链路集
除了在OLSR协议内核中描述的链路探测及本地链路信息库操作以外
- 本地链路集合中的每个链路数组应该包含
- L_link_pending 是一个布尔标志,用于说明是否认为本条链路即将中断(即:认为本条链路没有建立)
- L_link_quality 是一个位于0和1之间的无穷小数,用于描述本条链路的质量
L_LOST_LINK_time 表示一个定时器,用于在一条已建立链路变得即将中断之时声明该条链路已经丢失
HELLO消息的产生
HELLO消息的产生应该考虑以下这些组成域:
- (1)若时间LLOST_LINK_time还没有结束,则使用链路类型LOST LINK (链路丢失)广播该条链路
- (2)否则,若时间LLOST_LINK_time已经结束,并且标志L link_ pending 设为“真”,则根本不应该广播该条链路
- (3)否则,若时间LLOST_LINK_time已经结束,并且标志L link_ pending设为“假”,则根据HELLO消息的描述广播该条链路
- 对于同时满足以下条件的每个链路数组,节点认为自己存在一条对称链路
- ①时间L_LOST_LINK_time 已经结束
- ②标志L_link_pending设为“假”
- ③时间L_SYM_timne 还没有结束
- 在计算一个相邻节点的状态 N_status 时,应该使用这个“对称链路”定义来更新关联相邻节点数组
- 因此,在计算MPR集合时以及路由表计算第一步的寻找“对称相邻节点”中,应该将这个对称链路定义作为寻找对称相邻区域的基础。
- 除了上面的描述以外,前面的描述没有涉及到链路数组中的这些高级链路探测域
- L_link_pending、 L_link_quality、 L_LOST_LINK_time 三个组成域专门根据本节的描述来更新
-
滞后作用策略
一个节点和其一个相邻节点的其中一个接口之间的链路可能质量很差
- 即有时这条链路刚好让HELLO消息传输完毕就立即衰落
- 在这种情况下,相邻节点信息库应该将一条质量差的链路维护一段至少等于“有效时间(Validity Time)” 的时间
应该采用下列滞后作用策略来处理这种情况
对于接口I能够接收到的每个相邻节点接口NI,由相应链路数组的L_link_quality 决定是否建立该条链路
Llink_quality 的取值可以与两个固定在0和1之间的门限值HYST THRESHOLDHIGH、HYST_THRESHOLD LOW进行比较,HYST_THRESHOLD_HIGH ≥ HYST_THRESHOLD_LOW
该链路数组的L_link_pending标志设置如下:
- (1)若L_link_quality > HYST_THRESHOLD_HIGH, 则:
- L_link_pending = false (假)
- L_LOST_LINK_time = current time - 1 (期满时间已经结束)
- (2)否则,若Llink_quality < HYST_THRESHOLD LOW,则:
- L_link_pending = false (假)
- L_LOST_LINK_time = min (L_time, current time + NEIGHB_HOLD_TIME)
- 然后认为本条链路已经丢失,这有可能导致一个相邻节点丢失
(3)否则,若HYST_THRESHOLD_LOW ≤ L_link_quality ≤ HYST_THRESHOLD_HIGH
- 则L_link_pending 标志和 L_LOST_LINK _time 时间保持不变
因此,考虑建立一条链路的条件比考虑丢失一条链路的条件严格
- 所以,可以根据定时器定时时间结束来丢失一条链路,
或者可以根据Llink_quality 低于门限 HYST_THRESHOLD LOW来丢失一条链路
即使根据链路滞后作用认为一条链路没有建立,但是由于所接收到的每条HELLO消息,其链路数组仍然得到更新
这就特别意味着:不论链路滞后作用是否认为一条链路已经建立,除了链路数组的L_time时间决定该数组的期满时间以外,链路集合中的链路数组是不会期满的
作为一个基本的实现要求,链路质量的估计必须得到维护并存储在L_ link _quality 域
- 假如能够得到接收消息时的信号电平/噪声电平的测量数据(例如作为一个链路层通知)
- 那么将其标准化处理之后就可以作为对应链路的估计
- 假如从链路层得不到信号电平/噪声电平测量数据或者其他链路质量信息
- 那么可以采用下列算法(这是一个对传输成功率进行指数平滑移动平均的算法)
- 该算法采用取值固定在0和1之间的一个比例参数HYST_ SCALING来表示
- 对于接口I能够接收到的每个相邻节点接口NI, 第一次NI被接口I所接收
- L_link_quality 设为 HYST_SCALING
(L link pending 标志设为真,L_LOST_LINK_time 时间设为 current time-1)
根据下面两个规则更新链路数组
- 每当相邻节点接口NI发送的一个OLSR分组被接口I所接收到的时候,则采用稳定性规则:
- Llink_quality = (1-HYST SCALING) x Llink_quality + HYST SCALING
- 每当相邻节点接口NI发送的一个OLSR分组被接口I丢失的时候,则采用不稳定性规则:
- Llink_quality = (1-HYST SCALING) x L_link_quality
- 通过跟踪每个接口上的丢失分组序列号,以及一个节点“长时间静默”来检测OLSR分组的丢失
因此,“长时间静默”可以被检测出来:
一个节点到达一个相邻节点的链路被认可或者被拒绝的准则由链路滞后作用决定
- 网络节点可以根据通信媒介的特性采用不同的准则
一旦一条链路被认可,则立即根据本版规范前面描述的规则广播该条链路
冗余拓扑信息
为了给拓扑信息库提供冗余度,一个节点的广播链路集合可能包含到达不属于该节点的MPR选择器集合的相邻节点的链路,也可能包含到达该节点所有相邻节点的链路
- 任何一个节点能够在其TC消息中广播的最小链路集合就是到达其MPR选择器的链路组成的集合
可以按照下列规则和根据本地参数TC_REDUNDANCY建立广播链路集合
TC_REDUNDANCY参数
本地参数TC_REDUNDANCY为一个本地节点指定TC消息中可能包含的信息数量
- 本地参数TC_REDUNDANCY解释如下:
- (1)若本节点的参数TC_ REDUNDANCY等于0,则该节点的广播链路集合被限制为其MPR选择器集合
- (2)若本节点的参数TC_REDUNDANCY等于1,则该节点的广播链路集合等于其MPR集合与其MPR选择器集合的并集
- (3)若本节点的参数TC_REDUNDANCY等于2,则该节点的广播链路集合等于全部相邻节点链路集合
一个愿意域设为WILL_NEVER (从不愿意为其他节点传输信息)的节点应该使其TC_REDUNDANCY等于0
互操作性考虑
一个节点将一条TC消息发送到网络中, 用于声明一个链路集合,这个集合叫做广播链路集合
- 其中必须至少包含到达其MPR选择器集合中所有节点(即:已经选择该发送节点作为MPR的相邻节点)的链路
这些信息足够保证能够完成OLSR协议路由计算内核功能
本节说明可以采用参数TC_ REDUNDANCY来声明其他信息的方法
- TC_REDUNDANCY等于0意味着所声明的信息正好相当于MPR选择器集合
- TC_REDUNDANCY的其他取值说明声明其他的信息。也就是说MPR选择器集合的内容总是会被声明的
因此TC_REDUNDANCY取值不同的各个节点可以共存于一个网络中:控制消息被所有节点传输,所有节点至少能够接收到建立路由所需要的链路状态信息
MPR冗余度
MPR冗余度说明一个节点选择多余MPR的能力
- 节点应该将其MPR集合选择得尽可能的小,以便降低协议开销
- 选择MPR的准则是:所有严格二跳节点必须至少通过一个 MPR节点可达
- MPR集合的冗余度影响所广播的链路数量、进行链路广播的节点的数量、以及MPR泛洪机制的效率
- 因而影响协议开销
但是,MPR 集合的冗余度确保一个节点的可达性被多个节点所广播,因此其他的链路被传播到网络中
尽管一般情况下一个最小MPR集合具有最低协议开销,但是有些时候为了其他的考虑而对协议开销进行折中考虑
- 例如,一个节点需要观察其相邻节点信息库由节点移动造成的很多变化时可能决定增大其MPR集合覆盖范围
-
MPR_COVERAGE参数
MPR覆盖范围由参数MPR_ COVERAGE定义,说明任意一个二跳节点被多少个MPR节点所覆盖
- MPR_COVERAGE = 1 说明OLSR协议开销保持在最低程度,以及按照MPR集生成规则进行MPR选择
- MPR_COVERAGE = m 确保:假如可能的话,一个节点选择其MPR集合,使得一个接口的所有严格二跳节点至少通过该接口上的m个MPR节点可达
- MPR _COVERAGE的取值是大于0的整数。必须对每个接口I使用这个搜索过程。
一个节点的MPR集合就是在每个接口上发现的MPR集合的并集
可以在本地调整参数MPR_COVERAGE而不会影响OLSR协议的一致性
例如,网络中的各个节点可以采用各自不相等的参数 MPR_COVERAGE 来操作
MPR集的计算
使用MPR覆盖范围的时候,采用如下一个定义延伸MPR选择搜索过程:
欠覆盖节点(Poorly Covered Node): 一个欠覆盖节点是N2集合中的一个节点,集合N中存在覆盖该节点的节点数量少于MPR_COVERAGE个
因此,本规范建议的MPR选择搜索规程如下
- 第一,从一个MPR集合开始搜索
- 该集合由集合N中的愿意域设为WILL_ALWAYS (总是愿意为其他节点转发信息)的全部成员节点构成
- 第二,为集合N中的全部成员节点计算D(y), y表示集合N中的一个成员节点
- 第三,将集合N中覆盖集合N2中欠覆盖节点的那些节点选为MPR,然后从集合N2中删除这些节点,以便于剩余的计算
- 第四,尽管集合N2中仍然存在未被MPR集合中至少MPR_ COVERAGE个节点所覆盖的节点,但是:
- (1)对于集合N中的每个节点,计算其可达性,即集合N2中仍然未被MPR集合中至少MPR_COVERAGE个节点所覆盖的节点的数量,而且这些节点通过本一跳相邻节点可达
- (2)将集合N中愿意域设置最高、可达性不等于0的那个节点选为一个MPR。存在多个节点选择时,则选择提供可达集合N2中节点的数量最多的那个节点作为MPR。若多个节点提供相同的可达性,则选择其D(y)较大的那个节点作为MPR。将集合N2中现在已被MPR集合中MPR_COVERAGE个节点所覆盖的那些节点删除
- 第五,一个节点的MPR集合由每个接口的MPR集合的并集得到。
- 作为一种优化,按照愿意程度递增方式依次处理MPR集合中的每个节点y
- 假如集合N2中的所有节点仍然被MPR集合中至少MPR_COVERAGE个节点所覆盖
- 并且还假如节点y的愿意域小于WILL_ALWAYS(总是愿意为其他节点转发信息)
- 那么可以从MPR集合中删除节点y
MPR集合被全部计算完毕后,将所有相应主地址存储在该MPR集合中
互操作性考虑
根据MPR集的生成规则,一个节点计算其MPR集合必须要求
- 该节点通过MPR集合中的相邻节点能够到达所有对称严格二跳相邻节点
- 这通过本节介绍的搜索过程对所有的MPR_COVERAGE > 0进行搜索来实现
- MPR_COVERAGE是每个节点的一个本地参数,其设置只影响网络局部的冗余度
- 对于MPR_COVERAGE=1,本节介绍的搜索完全等同于MPR集生成规则的搜索
- MPR_COVERAGE取值不同的各个节点可以共存于一个网络:
- 控制消息被所有节点传输
- 所有节点至少能够接收到建立路由所需要的链路状态信息