【概述】
动态源路由协议(Dynamic Source Routing protocol,DSR)是基于源路由概念的按需自适应路由协议,其允许节点动态地发现到任何目的地的源路由,中间节点不必存储转发分组所需的路由信息,而是采用 Cache 来存放路由信息,同时允许网络完全自我组织和自我配置,但存在陈旧路由
DSR 协议简单而有效,网络开销较小,是 Ad-Hoc 网络的首选路由协议
DSR 协议有如下假设:
- 所有节点都愿意参与协议工作
- 当节点收到损坏分组时,能检测出来并丢弃
- 节点的移动速度相对于分组的传输延迟,以及底层网络硬件的无限传输范围来说,相对温和
- 节点的无线网络接口硬件可以混杂模式(Promiscuous)工作,即接口将收到的每个帧都上交给驱动器软件,不会针对目的地址进行过滤
- 任何一对节点之间的无线通信能力可不同
- 每个节点只能宣称一个 IP 地址
【DSR 协议描述】
DSR 协议由两个相互协同的机制组成:
1.路由发现
路由发现(Route discovery),用于发现网络中的路由
由需要发送数据给节点 $D$ 的节点 $S$ 使用,该过程只在 $S$ 需要发送数据,并且不知道到 $D$ 的路由时才启动
2.路由维护
路由维护(Route maintenance),用于维护网络中的路由
节点 $S$ 在给 $D$ 发送数据时,要能检测出由于网络拓扑动态变化导致源路由中断的情况
当前的源路由不能用时,节点 $S$ 会切换到另一条已知的路由,或者重新发起 Route discovery 来寻找新路由
DSR 协议的路由发现和路由维护都是按需进行的,既不需要周期性地发送路由广播分组,也不需要感测链路状态,更不需要邻居检测,同时其不依赖于任何底层协议,仅需要维护路径上结点间的路由,能够完全地消除路由环路,并且能够同时提供多条路由
但相较于周期性通告来说,DSR 协议的每个分组都要携带完整路由的信息,这不仅增大了开销,还降低了网络带宽利用率,同时,会引起过时路由问题
【DSR 多路径】
在 DSR 协议中,如果正在使用的一条路径中断,节点可立即切换到另一条缓存的路由,这样多条路由的缓存可避免每次路由中断后执行路由发现,减少了开销
多路径的获得途径有以下三种:
- 作为路由发现的响应
- 其他路由控制包和数据包中的路由信息
- 为任何目的地缓存多条路由
【路由发现】
过程
当源节点将路由请求消息(Route Request)作为局部广播分组发送时,这个分组包含两个参数:
Request id
:请求 idList
:初始为空的链表,用于记录路由发现包经过的结点
如下图,$A$ 是路由发现的发起者,$E$ 是路由发现的目标
如果目标结点 $E$ 收到请求包,那么会给请求源 $A$ 回答一个路由回复消息(Route Reply),其值是 List
的拷贝,当路由请求源收到路由回复消息后,会在本地的路由 Cache 中缓存该路由信息。
路由请求消息记录了一条从路由发现发起端到本节点的路由,路由回复消息给出了一条从目标端到发起端的反向路由,数据分组给出记录了一条从数据报源端到目标端的正向路由
无穷迭代路由发现
如果网络存在单向链路,且目标端在路由 Cache 中未找到去往发起端的路由信息,那么会发起新一轮路由发现过程,来寻找一条路径,这就造成了无穷迭代路由发现
为避免上述问题,DSR 规定目标端可使用路由请求消息中记录的路由,作为返回的路由回复消息的源路由,这样首选逆向路由,不仅可以避免无穷迭代路由的发现过程,还可以避免第二次路由发现过程带来的开销
路由缓存
如果两个节点间的链路是双向的,那么在缓存侦听时获得的路由信息会被缓存
如下图,假设 $C$ 与 $X$ 间的链路是双向的,那么在从节点 $V$ 到节点 $Z$ 的路由发现过程中,$C$ 会缓存如下路由
收到路由请求包的中间结点可以使用自己的路由 Cache 缓存的到目标节点的路由信息应答路由请求,即:
需要注意的是,在返回路由回复消息前,要检查是否存在路由环路,若存在环路,则需要丢弃
应答风暴
应答风暴是指:当一个节点广播针对某目标端的路由请求时,若其邻居的 Cache 中都有该目标端的路由,每个邻居都试图以自己的缓存路由响应
应答风暴会加剧局部网络冲突,且浪费网络带宽,为预防应答风暴,可采用以下三种方法:
- 节点将网络接口置于混杂接收方式(promiscuous)
- 延迟发送路由回复消息
- 同时侦听路由请求端是否在用更短的路径发送
【路由维护】
过程
路由维护过程会确保每个节点能够使用源路由发送或转发的数据分组被路由的下一跳接收,当没有收到下一跳的确认时,会不断地重发,直至最大重试次数
如果数据分组被重发了最大次数,但仍未收到下一跳的确认,那么节点要向源端路由发送路由错误消息(Route Error),并指明中断的链路
同时,分组的源端会将该路由从路由缓存中删除
之后,若源端路由缓存中存在另一条到目标的路由,那么会重发此分组,否则,重新开始路由发现过程
在新一轮的路由发现过程中,新的路由请求消息会捎带路由错误消息的内容,以便通告所有邻居特定链路中断情况,由此保证之后收到的路由回复消息不是原来的过时路由
营救分组
如果节点在自己的缓存路由中发现有到目标的路由,那么在报告路由错误消息后会努力营救分组(Slavaging)
营救分组有两种方式:
- 将分组的源路由替换成缓存的路径
- 保留分组源路由的前缀,用缓存的路由替换分组源路由的后缀
路由最短自动化
数据分组使用的源路由在一个或多个中间节点不需要时,节点会给数据分组的源端发回一个免费的路由回复消息消息,从而能够自动实行路由最短化
缓存否定消息
节点收到路由错误消息后,其实并不是简单地删除该路由,而是会将特定链路中断信息缓存一段时间,这样随后收到的所有包含该中断链路的路由都很容易判断为不可用,但缓存的链路中断信息必须超时删除,以便在该链路恢复工作时可用