OLSR数据包格式与转发

数据包格式与转发

OLSR使用与协议相关的所有数据的统一数据包格式进行通信。这样做的目的是在不破坏向后兼容性的情况下促进协议的可扩展性。这也提供了一种简单的方式,将不同“类型”的信息承载到单个传输中,从而为给定的实现优化利用网络提供的最大帧大小。这些数据包被嵌入UDP数据报在网络上传输。本文档使用IPv4地址。关于IPv6的考虑在第17节中给出。

每个包封装一个或多个消息。这些消息共享一个公共的头格式,这使节点能够正确地接受和(如果适用的话)重新传输未知类型的消息。

消息可以被淹没到整个网络中,或者可以将淹没限制在距离消息始发者直径(以跳数表示)以内的节点上。因此,将消息传递给节点的邻居只是洪泛的一个特例。当淹没任何控制消息时,重复的重发将在本地被消除(即,每个节点都维护一个重复的集合,以防止发送相同的OLSR控制消息两次),并通过使用MPRs在整个网络中最小化。

此外,节点可以检查消息的标头,以获得关于到消息发送者的距离(以跳数表示)的信息。这种特性在某些情况下可能有用,例如,来自存储在节点上的接收控制消息的时间信息取决于到发送方的距离。


数据包格式

OLSR中任何包的基本布局如下(省略IP和UDP报头):

1572351481258

Packet Length:数据包的长度(以字节为单位)

Packet Sequence Number:数据包序列号

Message Type

Vtime: 此字段指示在接收后多长时间内节点必须认为消息中包含的信息是有效的,除非接收到信息的最新更新。有效时间由其尾数(Vtime字段的四个最高位)和指数(Vtime字段的四个最低位)表示。换句话说

1572351839640

其中a为Vtime字段的四个最高位代表的整数,b为Vtime字段的四个最低位代表的整数。第18节规定了比例因子C的建议值。

Message Size:这将给出此消息的大小,以字节为单位进行计数,并从“消息类型”字段的开始到下一个“消息类型”字段的开始(或者,如果没有以下消息,则直到数据包结束)进行测量。

原地址(Originator Address):此字段包含最初生成此消息的节点的主地址。此字段不应与来自IP报头的源地址混淆,后者每次都更改为重新传输此消息的中间接口的地址。在重发中,发起人地址字段必须“永远”不变。

生存时间(Time To Live):此字段包含要传输的消息的最大跳数。在重新传输消息之前,生存时间必须减少1。当节点接收到时间为0或1的消息时,在任何情况下都不能重新传输该消息。通常,节点不会接收TTL为0的消息。

跳数(Hop Count):此字段包含消息已达到的跳数。在重新传输消息之前,跳数必须增加1。


包处理和消息泛滥

在接收到基本数据包后,节点检查每个“消息头”。根据“消息类型”字段的值,节点可以确定消息的命运。一个节点可以多次接收相同的消息。因此,为了避免对一些已经接收和处理的消息进行重新处理,每个节点维护一个重复集。在这个集合中,节点记录关于最近接收的消息的信息,避免对消息进行重复处理。对于这样的消息,节点记录一个“重复元组”(D_addr、D_seq_num、d_re、D_iface_list、D_time),其中D_addr是消息的发起者地址,D_seq_num是消息的消息序列号,d_retransmission是一个布尔值,指示消息是否已被发送

已经重新传输的D_iface_list是接收到消息的接口的地址列表,D_time指定元组过期和必须删除的时间

因此,在接收到基本数据包时,节点必须为每个封装的消息执行以下任务:

  1. 如果数据包不包含任何消息(即,数据包长度小于或等于数据包报头的大小),则必须悄悄地丢弃数据包。对于IPv4地址,这意味着当数据包长度小于16时,必须静静地丢弃数据包。

  2. 如果消息的生存时间小于或等于“0”(0),或者消息是由接收节点发送的(即,消息的发起者地址为接收节点的主地址):消息必须被静默丢弃。

  3. 处理条件

    ​ 若:

    1
    2
    D_addr == Originator Address, AND
    D_seq_num == Message Sequence Number

    表示信息早已被处理,无需再处理


默认转发算法

  1. 如果未检测到消息的发送方接口地址位于节点的对称1跳邻域内,则转发算法必须在此静默停止(且不能转发消息)。

  2. 若:

    1
    2
    D_addr == Originator Address, AND
    D_seq_num == Message Sequence Number

    已收到,将进一步考虑转发消息,当且仅当;

    D_retransmitted is false, AND 接收到消息的接口的地址不在D_iface_list地址中

  3. 否则,如果这样的条目不存在,则进一步考虑转发消息。

  4. 如果发送方接口地址是该节点的MPR选择器的接口地址,并且消息的存活时间大于’1’,则必须重新传输消息(如后面的步骤6到8所述)。

  5. 如果重复集中存在具有相同发起者地址和相同消息序列号的项,则按以下方式更新该项:

  6. 消息的TTL减少了1。

  7. 消息的跃点计数增加1

  8. 消息在所有接口上广播(注意:消息头的其余字段应该保持不变)。