OLSR路由协议详解 一

OLSR路由协议,全称为Optimized Link State Routing,中文名为优化链路状态路由协议,是主要用于MANET网络(Mobile Ad hoc network)的路由协议。

下面可能会用到的概念:

  • 邻居节点:如果节点可以监听到节点 X,则节点 X 是节点的邻居节点。
  • 2 跳邻居:通过邻居节点监听到的节点是 2 跳邻居节点,可以包含节点自身以及某些 1 跳邻居节点。
  • 严格 2 跳邻居:即不是节点自身或其邻居节点,而是严格通过邻居节点监听到的节点。
  • 孤立两跳邻节点:指仅通过一个邻节点同目标节点相连的两跳邻节点。
  • 主要地址:在OLSR中,被定义为 OLSR 接口地址。
  • 链路:两个不同 OLSR 节点接口之间相互监听形成链路。
  • 对称链路:两个 OLSR 接口之间已经认证的双向链路。

核心机制---MPR机制

        在OLSR路由协议中,比较核心的思想就是MPR机制。基于MPR机制,在路由表构建过程中,所有节点都可以接收信息,但是只有很少的被选定的节点才有权利传播接收到的信息,而被选定的节点称为 MPR节点。MPR节点关系到链路状态信息的广播,同时也是优化网络资源的一步,所以如何选定合适的MPR节点很重要。

       MPR节点选定过程如下:

  1. 首先选择能够覆盖孤立两跳邻节点的一跳邻节点;
  2. 在剩下的一跳邻节点中,将节点根据覆盖二跳邻节点的数量从高到低排序,依序选择节点,直到覆盖所有的两跳邻节点。

数据包格式以及重要报文介绍

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报文

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。

你可能感兴趣的:(路由协议,其他,分布式,linux)