路由选路算法
在网络层中,选路是指数据包从源主机到目的主机的传输过程中,如何通过网络中的路由器选择一条合适的路径。路由器根据网络拓扑、路由表、协议规则等来决定如何将数据包转发到下一跳,直到数据包到达目的地。
选路算法分类
静态算法or 动态算法
- 静态算法:路由随时间不变或缓慢变化 (手工配置)
- 动态算法:路由器根据拓扑及链路代价的变化而自动更新路由
全局算法 or 分布式算法
全局算法:
- 所有路由器具有关于拓扑和链路代价的全部信息
- 集中式计算
分布式算法:
- 路由器仅知道邻居节点以及到邻居节点的链路代价
- 通过与邻居交换信息,进行迭代计算
链路状态(LS)选路算法
链路状态选路算法为全局算法,其基本思想为:每个节点利用可靠方法获得全网拓扑信息,抽象成一个带权拓扑图,计算到各个节点的最短路径
最常见的链路状态路由协议是 OSPF(Open Shortest Path First)
链路状态选路算法包括五个步骤:
- 发现邻居:有链路直接相连的节点为邻居
- 探测链路代价:探测到每个邻居的代价
- 构造链路状态(LS)分组:利用邻居及链路代价信息
- 扩散LS分组:向网络中所有节点发送LS分组
- 计算路由:利用收到的LS分组构造网络拓扑,计算从本节点到其它各个节点的最短路径
一旦路由器有了完整的网络拓扑图,它就可以使用 Dijkstra 最短路径算法 来计算到每个目标的最短路径。
Dijkstra算法
1 Initialization:
2 N’ = {
u} // N’为已找到最短路径的节点集合,初始时只有u
3 for all nodes v //标记源节点u到各个节点v的路径代价D(v)
4 if v adjacent to u
5 then D(v) = c(u,v) //c(u,v)为链路(u,v)的代价
6 else D(v) = ∞
7
8 Loop
9 find w not in N’ such that D(w) is a minimum //下一条最短路径
10 add w to N’ //将找到最短路径的节点加入N’
11 update D(v) for all v adjacent to w and not in N’ :
12 D(v) = min( D(v), D(w) + c(w,v) ) //更新到相关节点的路径代价
13 until all nodes in N'
Bellman-Ford 方程
假设 x 和 y 分别为源节点和目的节点, N ( x ) N(x) N(x)是x 的邻居集合, c ( x , p ) c(x,p) c(x,p)为 x 到其邻居 p 的链路代价, d x ( y ) d_x(y) dx(y)为从 x 到 y 的最小代价路径的代价,则:
d x ( y ) = m i n p { c ( x , p ) +