aodv路由协议分析

1 AODV 报文格式
AODV 有三种基本的协议报文类型:RREQ 报文、RREP 报文和RRER 报文。
1.1 RREQ 报文
a. RREQ 的处理
接收到RREQ 的结点做如下处理:
1)创建一个表项,先不分配有效序列号,用于记录反向路径。
2)如果在路由发现定时内已收到一个具有相同标识的RREQ 报文,则抛弃该报文,不做任何处理;否则,对该表项进行更新如下:
I.下一跳结点=广播RREQ 的邻居。
II.跳数=RREQ 报文的跳计数字段值。
III.设置表项的过时计时器
3)如果满足以下条件,则结点产生路由回答报文”RREP,并发送到信源;否则更新RREQ 报文并广播更新后的RREQ 报文。
I.该结点是信宿。
II.结点的路由表中有到信宿的活动表项,且表项的信宿序列号大于RREQ中的信宿序列号。
4)更新RREQ 报文并广播更新后的RREQ 报文
I.信宿序列号=本结点收到的信宿相关的最大序列号。
II.跳计数加1
1.2 RREP 报文
1)信宿结点产生RREP
执行如下操作:
I.如果收到相应的RREQ 的信宿序列号与信宿维护的当前序列号相等,则信宿将自己维护的序列号加1,否则不变。
II.跳计数=0
III.定时器值。
2)中间结点产生的RREP
执行如下操作:
I.本结点获取的该信宿的最大序列号。
II.跳计数=本结点到信宿的跳数(查相应表项即可得到)。
III.更新本结点维护的前向路由表项的下一跳和反向路由表项的前一跳
b. RREP 的处理
结点对接收到的RREP 作如下处理。
1)如果没有与RREP 报文中的信宿相匹配的表项,则先创建一个前向路表空表项。
2)否则,满足如下条件对已有表项进行更新。
条件:
I.现有表项的信宿序列号小于RREP 报文中的序列号。
II.现有的表项没有激活。
III.信宿序列号相同,但RREP 报文的跳计数值小于表项相对应的值;通过更新或创建,产生一个新的前向路由。
更新:
IV.下一跳=广播RREP 的邻居结点。
V.信宿序列号=RREP 中的信宿序列号。
VI.跳计数加1
3)按照上述的过程,任何转发RREP 的结点,都记录了到信宿的下一跳,当RREP到达信源时。结点地址匹配,不再转发RREP,信源到信宿的前向路由已经建立起来了。信源可以沿这条前向路径进行数据传输。
1.3 RRER 报文
邻居间周期性的互相广播“Hello”报文,用来保持联系,若在一段时间内没有收到“Hello”报文,则认定为链路断。例如当结点X之间链路产生断路使数据无法通过此条链路传至信宿,则结点会产生RRER 报文向信源报告此情况。RRER 通过广播形式传送,维护路由表的结点收到此报文会更新路由表(将XY
间的路由设成无效),并转发RRER 报文。


协议从接收到一个分组开始的基本流程
AODV 路由协议主要包括以下几个组件:
1、协议实体
2、路由表
3、定时器
1)广播定时器
2)周期Hello 报文广播定时器
3)用于邻居管理的定时器
4)用于路由缓存的定时器
5)用于本地修复的定时器
6)缓存广播ID 的定时器
4、日志记录器
5、路由缓存队列
当协议接收到一个分组,即recv(Packet*, Handler*)函数被调用,函数根据分组类型调用不同的处理函数进行处理。
1、如果是协议分组,则将分组的ttl 值减1,并调用recvAODV(Packet*)函数进行处理。recvAODV 函数再根据分组的不同类型来调用不同的函数进行处理。
1)如果接收到的是路由请求分组,则调用recvRequest(Packet*)函数进行处理。如果该分组由节点自身产生或已经接收过的,会被节点丢弃,并结束处理。否则,节点将缓存该分组的序列号,并将该分组发送来的路径添加到反向路由中,转发相应分组。然后,节点根据该分组的目的地址进行判断并调用不同函数进行
处理。如果节点自身即为目的节点,则调用sendReply(nsaddr_t, u_int32_t,nsaddr_t, u_int32_t, u_int32_t, double)函数进行响应。如果节点不是目的节点,但知道通往目的节点的路由,则调用sendReply 函数进行响应,并在源和目的前驱列表中分别插入到源和目的的下一跳节点。否则,不能直接响应该请求,
将跳数加1,并调用forward(aodv_rt_entry*, Packet*, double)函数转发该分组。在sendReply 函数中,节点首先查找到达目的节点(即发送路由请求分组的节点)的路由,创建并填充分组,然后调用Scheduler::instance().schedule()函数来发送该分组。
2)如果接收到的是路由响应分组,则调用recvReply(Packet*)函数进行处理。节点首先查询前往分组目的节点的路由,如果不存在则新增一条路由项。然后,节点更新到该目的节点的路由项,并发送所有相关分组。如果节点为目的节点则更新路由发现延迟并发送所有相关的分组。如果节点不是目的节点,但知道通往目的节点的路由,则将跳数加1,调用forward 函数转发该分组,并修改响应的前驱列表。如果节点不是目的节点,也不知道通往目的节点的路由,则丢弃该分组。
3)如果接收到的是路由错误分组,则调用recvError(Packet*)函数进行处理。
节点首先清除所有受到影响的路由项,丢弃所有受影响的分组。然后,如果前驱节点中存在会受该路由错误影响的分组,则调用sendError(Packet*, bool)函数转发该分组。sendError 函数创建并填充分组, 然后调用Scheduler::instance().schedule()函数来发送该分组。
4)如果接收到的是Hello 消息分组,则调用recvHello(Packet*)函数进行处理。节点会将该邻居的信息添加到邻居列表中(或更新该邻居的信息)。
2、如果是数据分组,则节点丢弃已经发送过或者ttl 的分组,并结束处理。如果分组是由上层协议产生的,则节点添加IP 报头。随后,节点根据目的路由进行不同处理。
1)如果目的节点路由未知,则调用rt_resolve(Packet*)函数进行路由解析和转发。如果目的节点路由在路由表中存在,则直接调用forward 函数进行转发。如果分组是由节点自身产生的,则将分组保存到缓冲队列中,并调用sendRequest(nsaddr_t)函数查询目的路由。如果目的路由已知,但正在进行本地修复,则将分组保存到缓冲队列中。否则,丢弃该分组,并调用sendError 函数报错。
2)如果目的节点路由已知,则调用forward 进行转发。节点丢弃ttl 的分组,并根据分组类型决定下一步操作。如果接收到的是数据分组,且自身为目的节点,则通过调用PortClassifier 对象的recv(Packet*, Handle*)函数将分组交递给高层协议, 并结束处理。否则, 节点设置分组属性, 并调用
Scheduler::instance().schedule (Handler*, Event*, double)函数来发送分组。其中,Handler 为基类中的属性target_(会根据脚本中的设置指向相应的协议实体), Event 为要发送的分组即可。以上就是在节点收到分组后的一个处理过程。

以下是各个定时器所做的工作。
1、广播定时器BroadcastTimer 在到时后调用id_purge()函数删除广播项中已超时的项目,并通过调用Scheduler:: instance().schedule()函数来设置下次被调用的时间(Handler this 指针,Event 为类属性intr)。
2、周期Hello 报文广播定时器HelloTimer 在到时后调用sendHello()函数向邻居创建并发送Hello 消息,并调用schedule()函数来设置下次被调用的时间。
3、邻居管理定时器NeighborTimer 在到时后调用nb_purge()函数来清除邻居列表中已超时的邻居项,并调用schedule()来设置下次被调用的时间。nb_purge会调用nt_delete(nsaddr_t) 函数来清除超时的邻居项, 其又会调用handle_link_failure(nsaddr_t)函数来处理由于邻居节点被删除而引起的路由
变化。
4、路由缓存定时器RouteCacheTimer 在到时后调用rt_purge()函数来清除路由表中已超时的路由项,并丢弃相关的分组,再调用schedule()来设置下次被调用的时间。
5、本地修复定时器LocalRepairTimer 在调用后根据传递的分组的目的地址关闭相应的路由项。
6、缓存广播ID 定时器BroadcastID 用来保存广播分组的ID

转载于:https://www.cnblogs.com/yue-/archive/2012/04/23/6260090.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409907.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rfid射频前端的主要组成部分有_第4章 RFID的射频前端(simple).ppt

(1)阅读器天线电路 * Microchip 公司的13.56 MHz应答器(无源射频卡)MCRF355和MCRF360芯片的天线电路 无源应答器的天线电路多采用并联谐振回路 * 并联谐振回路 在研究并联谐振回路时,采用恒流源(信号源内阻很大)分析比较方便。 并联谐振 谐振条件 - 实际中线圈的电…

c语言转换为python语言_python和c语言

广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! c语言是编译型语言,经过编译后,生成机器码,然后再运行,执行速…

Tomcat安装与使用

Tomcat安装与使用 Tomcat是JAVA语言编写的,需要jdk环境。jdk从Oracle官网下载,不过要求登录后才能下载。 Tomcat的主配置文件:安装路径下的 conf/server.xml。 Tomcat默认监听8080端口。 下载&安装jdk #卸载或升级自带的java环境。 #查找…

COJ1196(Staginner 去爬山)

题目大意:给定一个n*m的只含0和1的矩阵,从矩阵的最后一行中的某个1出发,每步只能走到相邻的且是1的格子中,求能达到的最大高度(最小行数)。 这题直接DFS即可,复杂度为O(N*M)。 View Code 1 #in…

[html] 对一个元素设置浮动后,它的特征是什么?

[html] 对一个元素设置浮动后,它的特征是什么? 浮动元素脱离正常的文档流浮动元素后的内联元素,将围绕在浮动元素周围浮动元素会造成父元素的高度坍塌个人简介 我是歌谣,欢迎和大家一起交流前后端知识。放弃很容易, 但…

python网格划分_在python中创建一个2d网格

我真的很喜欢编程……但这是我的问题:我不能发布图像,但我想要的图是一个“冠”(两个半径为a的同心圆)我的意思是,在数学上讲这很容易定义,但我怎么能用python程序呢?我想到了这样的事情:def Fm1(X, Y):r r sqrt(1.*X**21.*Y**2)cos 1.*X/r…

python 三维地球_用python生成地球运动的动态模拟动态图

python作为一门简单易学且应用范围极广的语言有着其他语言无法比拟的优势,通过python可以实现各种各样的功能,例如我们可以利用python matplotlib的绘图库实现各种动态模拟仿真,在科学实验中有着极大的应用价值。下列是通过python实现地球公转…

xmlhttprequest level 2

http://caniuse.com/xhr2转载于:https://www.cnblogs.com/fullhouse/archive/2012/04/24/2468892.html

tomcat常用功能

修改端口号 1024-655365 之间取端口号 Tomcat有3个重要端口&#xff1a; 默认访问端口&#xff1a;8080 默认监听关闭tomcat的端口&#xff1a;8005 默认AJP访问端口&#xff1a;8009 vim tomcat/conf/server.xml<Server port"8005" shutdown"SHUTDOWN&quo…

[html] 可以给内联元素设置宽和高吗?为什么?

[html] 可以给内联元素设置宽和高吗&#xff1f;为什么&#xff1f; 1.正常情况下不能设置宽高(可替换内容元素除外例如img)2.元素被浮动&#xff0c;绝对定位&#xff0c;固定定位后&#xff0c;可以设置宽高3.display:block,display:inline-block等后可以设置宽高4.内联元素的…

cve20190708补丁的kb名称_微软KB4495667补丁(CVE 2019-0708补丁)V1.1 官方版

微软KB4495667补丁(CVE 2019-0708补丁)是一款很优秀好用的微软升级补丁工具。这款微软KB4495667补丁是针对2019年新发现的Windows系统漏洞CVE-2019-0708的Windows修补程序。此漏洞很可能被新的勒索软件利用&#xff0c;但您只需下载此修补程序即可安装它。欢迎有需要的朋友来下…

enterFrame是什么意思?

影片剪辑脚本和按钮的脚本类似&#xff0c;它们都使用事件处理函数&#xff0c;与按钮的on关键字不同&#xff0c;影片剪辑使用 onClipEvent关键字。当某种影片剪辑事件发生时&#xff0c;就会触发相应的事件处理函数。影片剪辑最重要的两种事件是load和enterFrame&#xff0c;…

python网站模板下载_Python画图模板大全:从此画图不用愁

1、matplotlib具体参数介绍&#xff1a; 在介绍Python画图模板之前&#xff0c;先买个和大家卖个官司&#xff0c;首先介绍一下Python画图常用库matplotlib的参数&#xff0c;如果只介绍模板&#xff0c;如果你想改一些参数&#xff0c;首先要知道各个参数的含义&#xff0c;那…

tomcat多域名访问

多域名访问 配置虚拟主机&#xff0c;提高资源利用率。 tomcat的server.xml文件也可以配置多个虚拟主机&#xff0c;基于端口可以通过增加service节点实现&#xff0c;基于域名则可以同过增加host节点实现 基于域名的虚拟机 #编辑server.xml文件&#xff0c;在Engine段下添加Ho…

[html] 如何解决input在Firefox和Chrome中高度不一致的问题?

[html] 如何解决input在Firefox和Chrome中高度不一致的问题&#xff1f; 原因是firefox的input的border-width padding 受win10系统的文本大小设置影响设置一样的样式input{box-sizing:border-box;height:20px;}将win10 系统的文本大小设置为100%个人简介 我是歌谣&#xff0c…

工业机器人工具中心点标定的意义_如何理解工业机器人的工具中心点

工业现场的机器人实际上是有多个轴的机械手臂。要想让机器人完成指定的生产任务&#xff0c;通常需要在机器人的末端固定一个工具&#xff0c;比如焊接机器人的焊枪、涂胶机器人的胶枪、搬运机器人的夹具等。由于各工具的大小、形状各不相同&#xff0c;这样就产生一个问题&…

学习:重写hashCode()方法的必要性

当一个类有可能会和其他类发生比较的时候&#xff0c;我们会重写equals方法&#xff0c;但大多数情况下&#xff0c;都忽略了重写hashCode方法。 这里说一下重写hashCode的必要性。 当我们使用HashSet或者HashMap的时候&#xff0c;在比对value|key是否存在时&#xff0c;会调用…

python利用缩进写模块_Python之缩进块

MySQL主从复制、半同步复制和主主复制概述 http://www.cnblogs.com/zping/p/5275531.html 17 任务调度相关类综述——Live555源码阅读&lpar;一&rpar;任务调度相关类 这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本…

二进制安装mysql-5.7.26

一、上传二进制 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz包 #/data 是数据盘 自己根据情况定 [rootVM_0_10_centos data]# pwd/datatar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gzmv mysql-5.7.26-linux-glibc2.12-x86_64 mysql #做软连接 ln -s /data/mysql /usr/lo…

[html] 块级元素不能包含其他块级元素有那些?

[html] 块级元素不能包含其他块级元素有那些&#xff1f; 嵌套规则&#xff1a;块级元素可以包含内联元素或某些块级元素&#xff0c;但内联元素不能包含块级元素&#xff0c;它只能包含其它内联元素。块级元素不能放在p里面。有几个特殊的块级元素只能包含内联元素&#xff0…