OLSR路由协议,全称为Optimized link State Routing,中文名为优化链路状态路由协议,是主要用于MANET网络(Mobile Ad hoc network)的路由协议。
下面可能会用到的概念:- 邻居节点:如果节点可以监听到节点 X,则节点 X 是节点的邻居节点。
- 2 跳邻居:通过邻居节点监听到的节点是 2 跳邻居节点,可以包含节点自身以及某些 1 跳邻居节点。
- 严格 2 跳邻居:即不是节点自身或其邻居节点,而是严格通过邻居节点监听到的节点。
- 孤立两跳邻节点:指仅通过一个邻节点同目标节点相连的两跳邻节点。
- 主要地址:在OLSR中,被定义为 OLSR 接口地址。
- 链路:两个不同 OLSR 节点接口之间相互监听形成链路。
- 对称链路:两个 OLSR 接口之间已经认证的双向链路。
在OLSR路由协议中,比较核心的思想就是MPR机制。基于MPR机制,在路由表构建过程中,所有节点都可以接收信息,但是只有很少的被选定的节点才有权利传播接收到的信息,而被选定的节点称为 MPR节点。MPR节点关系到链路状态信息的广播,同时也是优化网络资源的一步,所以如何选定合适的MPR节点很重要。
MPR节点选定过程如下:
- 首先选择能够覆盖孤立两跳邻节点的一跳邻节点;
- 在剩下的一跳邻节点中,将节点根据覆盖二跳邻节点的数量从高到低排序,依序选择节点,直到覆盖所有的两跳邻节点。
OLSR中任何数据包的基本布局如下(省略了IP和UDP的headers):
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Packet Length | Packet Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type | Vtime | Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Originator Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time To Live | Hop Count | Message Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
: MESSAGE :
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Message Type | Vtime | Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Originator Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time To Live | Hop Count | Message Sequence Number |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
: MESSAGE :
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: :
其中,数据包的header主要包括:
- Packet length :数据包的字节长度。
- Packet sequence number :数据包的序列号。为每个接口维护一个单独的数据包序列号,以便顺序枚举通过接口传输的数据包。
消息的header主要包括:
- Message type :消息类型,比如Hello、 topology control(TC)之类。
- Vtime :节点收到消息后消息的有效时间。
- Message size :消息的字节大小。从本消息的Message type字段到下一个消息的Message type字段计算大小。
- Originator address :包含最初生成此消息的节点的主要地址。该字段不会在消息传播中发生改变。
- Time To Live :消息将被传播的最大跳数。
- Hop count :消息已达到的跳数。在重传消息之前,该跳数必须加 1。
- Message sequence number :消息的序列号。用于确保给定的消息不会被任何节点多次重传。
接下来就是Message,消息的主体。消息主体主要有Hello、TC报文。
Hello报文hello报文在数据包的消息header设置如下:
- Message type :设为“HELLO_MESSAGE”
- Time To Live :设为“1”
- Vtime :设为“NEIGHB_HOLD_TIME”
Message主要格式如下:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved | Htime | Willingness |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| link Code | Reserved | link Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
: . . . :
: :
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| link Code | Reserved | link Message Size |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Neighbor Interface Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中,各个字段的含义以及设置规则如下:
- Reserved :设为0000000000000
- HTime :节点接口 HELLO 消息的发送间隔
- Willingness :节点为其他节点携带和转发流量的意愿,主要有为 WILL_NEVER,WILL_ALWAYS 和 WILL_DEFAULT
- link code :有关发送方接口与以下邻居接口列表之间的链路的信息。主要包括link Type和Neighbor Type,如果link code小于16比特,则必包含两个字段,每个字段2比特,格式如下:
7 6 5 4 3 2 1 0
+-------+-------+-------+-------+-------+-------+-------+-------+
| 0 | 0 | 0 | 0 | Neighbor Type | link Type |
+-------+-------+-------+-------+-------+-------+-------+-------+
其中, link Type主要包含四种:UNSPEC_link(无具体信息)、ASYM_link(不对称链接)、SYM_link(对称链接)、LOST_link(链接丢失)。
Neighbor Types主要包含三种:
SYM_NEIGH 表示邻居至少有一个与此节点对称链接。
MPR_NEIGH 表明邻居至少有一条对称链路并且已被发送方选为 MPR。
NOT_NEIGH 表示节点不再或尚未成为对称邻居。
- link message size :从当前 的link Code 到下一个 link Code 的字节长度
- Neighbor interface address :一个邻节点的接口地址
TC报文的全称为Topology Control ,与hello同理,在数据包的消息header设置如下:
- Message type :设为“TC_MESSAGE”
- Time To Live :设为“255”
- Vtime :设为“TOP_HOLD_TIME”
Message主要格式如下:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ANSN | Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertised Neighbor Main Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Advertised Neighbor Main Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| ... |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
其中,各个字段的含义以及设置规则如下:
- Advertised Neighbor Sequence Number(ANSN):给节点提供信息,以便接收到一个 TC 消息时,可以根据ANSN来判断接收到的邻居信息是否比它已有的信息更新。
- Reserved :设为0000000000000000
- Advertised Neighbor Main Address :包含被传播邻居节点的主要地址。是选择这个节点作为 MPR 的节点的集合,也称为 MPR Selector。



