网络协议栈设计与分析内容摘要:

消息不回被重发。 表格 4 OLSR协议数据包 Packet Length Packet Sequence Number Message Type Vtime Message Size Originator Address 《网络协议栈分析与设计》 8 / 35 HELLO 消息包 HELLO用于建立一个节点的邻居表,其中包括邻居节点的地址以及本节点到邻居节点的延时和开销, OLSR采用周期性的广播 HELLO分组来侦听邻居节点的状态和无线链路 的对称性。 节点之间无线链路的状态包括:非对称链路,对称链路,连接 MPR的链路。 但 OLSR协议只关心对称链路,同时 HELLO分组只在一跳的范围内广播,不能被转发;与此相反, TC分组必须被广播到全网,在 TC分组中包含了将发送 TC分组的节点选为 MPR的邻居节点的信息,节点根据收到的 TC分组来计算出网络 拓扑图。 结构体 lq_hello_message 即 Hello 消息数据包 介绍 : htime, HELLO 消息发射间隔; will,指定节点的意愿进行,有意愿的 WILL_NEVER 的节点被选为 MPR 的任意节点; neigh,消息 传递的下一个节点。 lq_hello_neighbor 是 HELLO 消息邻居节点集: neigh_type,邻居类型( SYM_NEIGH, NOT_NEIGH); link_type,连接类型( UNSPEC_LINK); addr,地址;linkquality,链路的质量。 TC 消息包 Time To Live Hop Count Message Sequence Number MESSAGE 《网络协议栈分析与设计》 9 / 35 TC 分组数据包必须通过 MPR 节点传递消息被广播到全网中,用以维护网络的拓扑信息 、确保链路时刻连通状态和 更新路由表集。 lq_TC_message 是封装后的 拓扑数据包格式。 from:接受包的上一个节点地址 ; ansn:节点接受到消息时拓扑集合会被更新。 TC_message 是 TC 消息数据包格式。 第四章 邻居发现 邻居发现是基于节点的邻居信息库,通过 HELLO 消息的传播实现。 邻居信息库包含关于邻居、 2 跳邻居、 MPRs 和 MPR 的信息。 节点信息的存储 每个节点都 存储自身的信息在结构体 link_entry 中。 《网络协议栈分析与设计》 10 / 35 0005900060: local_iface_addr 存储该节点接口 ip 地址, neighbor_iface_addr存储邻居节点 ip 地址。 00067: neighbor 以链链表形存储邻居节点信息。 邻居节点具体信息如下: neighbor_entry 结构体,同来存储邻居节点的信息。 记录了邻居节点的主地址,状态,作为 MPR 的 willingnessz 值,是否是 MPR,是否曾是 MPR,覆盖的两跳邻居节点的数量,及节点连接链路的数量以及指向 neighbor_2_list 连表的指针。 《网络协议栈分析与设计》 11 / 35 其中,成员变量 was_mpr 用来发现 MPR 的变化。 这段代码定义了 neighbor_2_list_entry 结构体, 这是 用来存储邻居节点信息,两跳邻居节点信息以及记录有效时间的链表结构。 mid_address 存储本节点的其他接口 ip 地址。 其中 mid_entry 节点链路信息。 mid_entry 包含节点主地址,上一节点和下一节点链路,同时还有本节点链路中其他端口信息存储在 aliases 链表中。 关于节点的具体操作分析 函数功能:重置所有节点信息。 0009500103:遍历所有节点一遍, 把所有信息置为初始值,并把邻居节点也设为空值。 《网络协议栈分析与设计》 12 / 35 函数功能: 通过查找 main_addr(184185 行 )找到节点 link_entry,通过 lookup_link_status找出节点链路状态。 判断其是否是对称状态。 0019700206: 行是查找主地址并找出节点上的其他端口 ip 判断该节点其他端口 aliases 链路状态。 并判断该 ip 地址所在的链路状态是否是对称状态。 只返回对称链路的信息。 《网络协议栈分析与设计》 13 / 35 函数功能: 查找端口 ip 地址的最少跳数邻居,并返回该节点信息 link_entry; 首先定义了三个 link_entry 结构 walker, good_link,backup_link; 0022300229: 找出该节点的主地址,通过遍历 walker 链表,查找出跳数最少的邻居,这就是最新的邻居表信息,最短的邻居表。 函数功能: 删除节点链路上所有的信息。 定义拓扑边缘节点 TC_edge:通过邻居端口地址找出 TC_edge 边缘链路。 0036500369: 删除边缘链路 spf; 0037200377:删除邻居链路信息,存储在 hash 表中的链路表删除 ; 《网络协议栈分析与设计》 14 / 35 0037900394:清空一些正在计时的属 性,同时释放 link 的资源空间 ; 同时将 change_neighborhood 设置为 true,让其他节点更新自己的链路状况,发送 hello 消息包及时更新邻居表的信息。 函数功能:更新链路信息状态,通过 hello_message 来更新邻居节点的信息。 0069400699:如果该节点不在链路中,把它加入到链路中去,并将计时器更新; 0070800732:通过 check_link_status 同过发送 hello_message 发现该节点的邻居节点链路状态 link_type,对不同的状态采取不同的操作: 0070800718:如果是对称或者非对称的需将定时器重新设置,更新定时器; 《网络协议栈分析与设计》 15 / 35 00732:更新邻居节点的状态信息,是对称还是非对称。 函数功能:发送 Hello 消息,维护一个端口的邻居信息。 0078000797:发送 hello_message 来维护端口信息,直到消息到达端口的所有的邻居节点,就停止发送,则该端口的所有邻居节点链路都检查完毕。 邻居表的操作 邻居表的初始化 函数功能:初始化邻居表。 0006100064:将每一个邻居表 neighortable[i]初始化为指向自身的仅有一个节点的链表。 《网络协议栈分析与设计》 16 / 35 删除节点 函数功能:删除释放一个两跳邻居节点记录。 0007300077:获取两跳邻居节点记录中 nbr2_list中的邻居节点结构体 nbr和两跳邻居节点结构体 nbr2; 0007900082:释放两跳邻居节点结构体 nbr2 的空间 ; 0008700088:将两跳邻居节点记录中的计时器置为空 ; 0009600097:通过将全局变量 changes_neighborhood,changes_topology置为真,通知网络重新计算 MPR 集合和路由表。 《网络协议栈分析与设计》 17 / 35 函数 功能:将从两跳邻居节点信息中,根据给定的邻居节点地址删除对应的两 跳邻居节点。 0011100113:获取邻居节点的两跳邻居节点信息表 ; 0011500121:遍历邻居节点的两跳邻居及节点信息表,直到找到信息表中两跳邻居节点与给定的两跳邻居节点相同,则删除该两跳邻居节 点并返回 1,表示成功删除; 否则返回 0 表示没有删除。 函数功能:删除邻居节点信息表(及连带的两跳邻居节点信息表) 0017700182:寻找邻居节点信息表 entry。 0018900197:删除邻居节点信息表即连带的两跳邻居节点信息表。 《网络协议栈分析与设计》 18 / 35 邻居节点的查找与插入 函数功能:查找给定邻居节点,能否通过该节点连接到一个给定的两跳邻居节点地址。 00140:定义返回值 entry,用来记录找到的两跳邻居节点信息表结构体。 0014200147:遍历邻居节点的两跳邻居节。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。