第5章:网络层:控制平面(二)
声明:以下所有内容均来自陈老师的课件,此博客只是为了方便日后复习
提纲
- 概述
- 路由选择算法
- 链路状态
- 距离向量
- Internet中自治系统内部的路由选择:OSPF
- ISP之间的路由选择:BGP
- SDN控制平面
- 因特网控制报文协议
- 网络管理和SNMP
链路状态
链路状态路由选择算法(简称LS算法)
-
集中式:所有节点掌握网络拓扑和链路开销
- 通过“链路状态广播”
- 所有节点拥有相同信息
-
用Dijkstra算法计算从一个节点(“源”)到达所有其他节点的最低开销路径
- 获得该节点的转发表
-
迭代式:k次迭代后,可知道到达k个目的节点的最低开销路径
![image]()
![image]()
-
LS算法示例:
![image]()
![image]()
- 备注
- 通过遍历前序节点来构造最低开销路径树
- 如果存在相同的最低开销,则随机选取
- 备注
-
LS算法测试题:
![image]()
-
考虑上图所示的具有6个节点的网络,u为源节点,每条边上的值表示对应链路的开销
-
借助LS算法,寻找从源节点u到所有其他节点的最低开销路径
-
请问:
-
- 从u到节点y的最低开销为多少?
-
- 节点y的前一个节点是哪个?
-
-
答案:
![image]()
-
-
LS算法:讨论
- 算法复杂度:给定n个节点(不算源节点)
- 每次迭代:需要检测所有不在集合N'中的节点w
- 在最坏的情况下:n(n+1)/2 次比较,O(\(n^2\))
- 更高效的实现O(nlogn)
- 通信复杂度:
- 每个路由器必须向网络中所有路由器广播它的链路状态信息
- 每个路由器的广播要穿越O(n)条链路
- 总的通信复杂度:O(\(n^2\))
- 算法复杂度:给定n个节点(不算源节点)
-
LS算法:存在振荡的可能
- 当链路开销依赖于链路上承载的流量,可能会发生路由振荡
- 示例场景:
- 链路开销是双向的,并且等于相对应链路上承载的流量
- a为目的节点;节点d产生的发往a的流量值为1,节点b产生的发往a的流量值为1,节点c产生的发往a的流量值为e
![image]()
-
LS路由选择的工作过程
- 配置LS路由选择算法的路由器的工作过程概述:
- 各节点(即各台路由器)通过各种渠道获得网络拓扑、网络中所有链路的开销等信息【这部分和算法无关,属于协议和实现】
- 使用LS算法,计算本节点到其他节点的最低开销路径,得到路由表(也即得到了转发表)
- 按照此路由表转发数据分组【数据平面的工作】
- 分发到输入端口的网络层(物理层->链路层->网络层;严格意义上说不是路由的一个步骤)
- LS路由选择的主要步骤:对于每一台路由器
-
- 发现与其物理连接的路由器(即邻居),获知它们的网络地址
-
- 测量它到其邻居的开销
-
- 构造一个链路状态分组(LS分组),描述它到其所有邻居的开销情况
-
- 将LS分组通过扩散的方法发给其他所有的路由器
- 以上四步让每台路由器获得网络拓扑和链路开销
-
- 通过Dijkstra算法计算最低开销路径【这才是路由选择算法】
- 每个节点独立算出来它到其他节点的最低开销路径
- 迭代算法:第k步能够知道本节点到k个其他节点的最低开销路径
-
- 配置LS路由选择算法的路由器的工作过程概述:
-
LS路由选择的工作过程(具体化)
- 1.发现与其物理连接的路由器(即邻居),获知对方的网络地址
- 一个路由器上电后,向所有链路发送HELLO分组
- 其他路由器收到HELLO分组,回送应答,在应答分组中告知自己的名字(全局唯一)
- 在LAN中,通过广播HELLO分组,获得其他路由器信息,可以认为是引入了一个人工节点
![image]()
- 2.测量它到其邻居的开销(如时延)
- 实测法:发送一个特别的ECHO分组,另一端立即回送一个应答
- 通过测量往返时间可以获得一个合理的时延估计值
- 为了获得更好的结果,可多次测量,取均值
- 3.构造一个LS分组,描述它到其所有邻居的开销情况
- 每个LS分组包含的信息:发送方的名称或ID、序号、年龄、邻居列表(给出它的邻居以及它到邻居的开销值)
- 构造LS分组的时间点:周期性地构造和发送,或者有特别的事件(比如,某条线路或邻居进入down状态)发生时构造
![image]()
- 4.将LS分组通过扩散方法发给其他所有路由器
- 序号:用于控制无穷的扩散
- 每个LS分组都包含一个序号,序号随着新分组产生而递增
- 每个路由器都记录它看见的所有(源路由器,序号)对,发现重复的或老的就不扩散
- 具体问题1:循环使用问题
- 具体问题2:路由器崩溃之后序号从0开始
- 具体问题3:序号出现错误
- 解决问题的办法:年龄字段
- 生成一个分组时,年龄字段不为0
- 每经历一个时间段,年龄字段减1
- 年龄字段为0的分组将被抛弃
- 关于扩散分组的数据结构
- Source:从哪个节点收到LS分组
- Seq,Age:序号,年龄
- Send flags:发送标记,必须向指定的哪些相邻节点转发LS分组
- ACK flags:本节点必须向哪些相邻节点发送应答
- Data:来自Source节点的LS分组
![image]()
- 序号:用于控制无穷的扩散
- 5.通过Dijkstra算法计算最低开销路径【这才是路由选择算法】
- 路由器获得各节点的LS分组和整个网络的拓扑
- 通过Dijkstra算法计算出它到其他各个路由器的最低开销路径
- 将计算结果安装在路由表中
- LS的应用情况
- OSPF协议是一种LS协议,被用于Internet上
- IS-IS:被用于Internet主干中
- 1.发现与其物理连接的路由器(即邻居),获知对方的网络地址
距离向量路由选择算法(简称DV算法)
- 基于Bellman-Fold(BF)方程(动态规划):
![image]()
- 于Bellman-Fold(BF)示例
假设u的邻居x,v,w已经知道它们的目的地z的最低开销路径的开销:
![image]()
由Bellman-Ford方程可知:
![image]()
那个取得最小值的节点x,就是u到目的地z的最低开销路径上的下一条路由器 --> 可用于转发表中
距离向量路由选择算法

-
核心思想:
- 每个节点不时地将它的距离向量发送给其邻居
- 当x从它的任何一个邻居接收到一个新的距离向量的时候,通过B-F方程更新x的距离向量:
![image]()
- 估计值
将最终收敛于实际的最低开销值![image]()
-
每个节点:
![image]()
-
异步、迭代式:每次局部迭代由以下事件触发:
- 局部链路开销变化
- 来自邻居的DV更新信息
-
自我终止、分布式:每个节点仅当其DV变化时才会通告邻居:
- 邻居再通告它们的邻居————只在必要的时候进行
- 没收到通告,不采取任何动作!
-
DV算法:示例
- t=0
- 所有节点仅具有到其邻居的开销估计
- 所有节点将其距离向量发送给它们的邻居
![image]()
- t=1(一)
- 所有节点接收来自其邻居的距离向量
![image]()
- 所有节点接收来自其邻居的距离向量
- t=1(二)
- 所有节点计算其新的距离向量
![image]()
- 所有节点计算其新的距离向量
- t=1(三)
- 所有节点将其新的距离向量发送给邻居
![image]()
- 所有节点将其新的距离向量发送给邻居
- t=2(一)
- 所有节点接收来自其邻居的距离向量
![image]()
- 所有节点接收来自其邻居的距离向量
- t=2(二)
- 所有节点计算其新的距离向量
![image]()
- 所有节点计算其新的距离向量
- t=2(三)
- 所有节点将其新的距离向量发送给邻居
![image]()
- 所有节点将其新的距离向量发送给邻居
- ......以此类推
- t=0
-
DV算法的计算过程
![image]()
![image]()
![image]()
![image]()
![image]()
-
DV算法:状态信息扩散
迭代式的信息交流和计算使得信息能够扩散到整个网络- t=0
- 在t=0时c的状态仅在c位置
- t=1
- 在t=1时的c的状态已传播到了b,并且可能影响到至多为1跳距离远的位置(也即b)的距离向量计算
- t=2
- 在t=2时的c的状态现在可能影响到了至多为2跳距离远的位置(b; a, e)的距离向量计算
- t=3
- 在t=3时的c的状态现在可能影响到了至多为3跳距离远的位置(b; a, e; c, f, h)的距离向量计算
- t=4
- 在t=4时的c的状态现在可能影响到了至多为4跳距离远的位置(b; a, e; c, f, h; g, i)的距离向量计算
![image]()
- 在t=4时的c的状态现在可能影响到了至多为4跳距离远的位置(b; a, e; c, f, h; g, i)的距离向量计算
- t=0
-
DV算法:示例二
![image]()
![image]()
-
DV算法:链路开销变化
- 链路开销变化
- 节点检测到它的邻居的链路开销发生了变化
- 更新路由信息,重新计算其距离向量
- 如果其距离向量因此而改变了,通告其所有邻居
![image]()
- “好消息”传播快
- t0:y检测到链路开销变化,更新其距离向量,通告其所有邻居
- t1:z接收到y的更新,更新其距离向量表,计算其到达x的新的最低开销,将其距离向量发送给其所有邻居
- t2:y接收到z的距离向量更新,更新其距离向量表,重新计算y的最低开销,未发生改变,不再向z发送任何报文
- “坏消息”传播慢————无穷计数问题
- y看见它到x的直接链路的新开销为60,但是z之前已经说了它有一条开销为5的路径。所以,y计算出“我到x的新开销将会是6(经由z)”;将其到x的新开销6通告给z
- z学习到y到x的路径具有新开销6,所以z计算出“我到x的新开销将会是7(经由y)”;将其到x的新开销7通告给y
- y 学习到z 到x 的路径具有新开销7,所以y 计算出“我到x 的新开销将会是8(经由z )”;将其到x 的新开销8通告给z
- z 学习到y 到x 的路径具有新开销8,所以z 计算出“我到x的新开销将会是9(经由y )”;将其到x 的新开销9通告给y
- ......由上可知,分布式算法是“狡猾的”
![image]()
- 链路开销变化
-
DV算法:无穷计数问题
-
解决方案:毒性逆转
- 如果一个节点(记为z)到达某目的地(记为x)的最低开销路径是通过某个邻居(记为y),那么:z通告给该邻居y,说它到该目的地x的距离是无穷大(“善意的小谎言”)
![image]()
![image]()
- Q:毒性逆转技术能否彻底解决无穷计数问题?
- A:不能。对于涉及3个或更多节点(而不只是两个直接相连的邻居节点)的路由选择环路,毒性逆转技术并不能检测到,因而无法解决这类无穷计数问题。
- 如果一个节点(记为z)到达某目的地(记为x)的最低开销路径是通过某个邻居(记为y),那么:z通告给该邻居y,说它到该目的地x的距离是无穷大(“善意的小谎言”)
-
解决方案:定义最大度量
- 定义一个最大的有效开销值,比如:15跳(16跳则表示了无穷大)
![image]()
- 定义一个最大的有效开销值,比如:15跳(16跳则表示了无穷大)
-
LS算法和DV算法的比较
- 通信复杂度
- LS:n个节点,发送O(\(n^2\))个报文
- DV:邻居之间交换报文,收敛时间不一
- 收敛速度
- LS:O(\(n^2\))
- 可能发生振荡
- DV:收敛较慢
- 可能发生路由选择环路
- 可能遭遇无穷计数问题
- LS:O(\(n^2\))
- 健壮性:路由器故障时会发生什么
- LS:
- 路由器会向与其连接的链路通告不正确的开销
- 每个路由器仅计算其自身的路由表
- DV:
- 路由器会向全网所有节点通告其不正确的最低开销路径
- 每个路由器的路由表可能被其他路由器使用
- 错误可以扩散到全网
- LS:
- 通信复杂度















将最终收敛于实际的最低开销值





















浙公网安备 33010602011771号