禁止码迷,布布扣,豌豆代理,码农教程,爱码网等第三方爬虫网站爬取!
维护转发表
每台路由器的数据平面要解决从输入链路向输出链路转发数据报的问题,控制平面要些协调这些路由器的转发动作,使得数据报沿着源和目的主机间的路由器最短路径进行端到端传输。对于转发表和流表的计算、维护和安装,有 2 种手法可以实现。
每路由器控制
这是传统的方法,每台路由器都包含转发和路由选择的功能。每台路由器都有一个路由选择组件,用于与其它路由器中的路由选择组件通信,OSPF 和 BGP 协议都是基于这种手法实现的。
逻辑集中式控制
SDN 方法,控制平面的路由选择功能和物理的路由器是分离的,由路由选择设备执行转发,远程控制器计算并分发转发表。远程控制器可能实现在具有高可靠性和冗余的远程数据中心中,可能有 ISP 或某些第三方管理。控制器通过协议和每台路由器中的控制代理(CA)进行交互,以此配置该路由器的转发表。CA 的任务是与控制器通信兵按照控制器的命令执行。
SDN 技术使用了逻辑集中式控制器的概念,这种方法在现在的生产部署中得到越来越多的应用。
路由选择算法的分类
对于路由选择问题,我们可以简单地将情景抽象为一个图结构,每一个路由器抽象为顶点,路由器之间的抽象为为边。和图结构有关的知识,可以前往博客——用树结构存储的图博客(笑)进行回顾。
路由选择算法可以从发送方到接收方中确定一条通过路由器的较好的路径,通常来说是最低开销的路径。对于最短路径的分类方式,有 3 种典型的讲法。
集中或分散
集中式路由选择算法用完整的、全局性的网络知识计算出从源到目的地之间的最低开销,这就要求算法在开始运作前获得顶点间的连通性和链路开销。算法的运作既可以在类似于逻辑集中式控制器这种某一设备中进行,也可以在每台路由器的路由选择组件中进行。
与之相对应的是分散式路由选择算法,路由器以迭代、分布式的方式计算出最低开销路径。这类算法的特点是,没有任何结点拥有关于网络链路开销的完整信息,每个结点仅有与其直接相连的链路的开销知识就可以开始工作。通过迭代就先以及相邻结点的信息交换,节点逐渐计算出达到目的节点的最低开销路径。
静态或动态
静态路由选择算法路由随着时间变化非常缓慢,通常是人工进行调整。动态路由选择算法随着网络流量负载或拓扑发生变化而改变路由选择算法,可以周期性的运行或直接响应拓扑或链路开销的变化来运行。虽然动态路由选择算法可以很快获取网络的变化,但是容易受到选择循环、路由震荡等问题影响。
负载敏感或迟钝
负载敏感算法中的链路,会动态地变化以反映底层链路的拥塞水平。但是某条链路的开销并不能明确地反映当前的拥塞水平,因此当今因特网使用的路由选择算法都是负载迟钝的。
链路状态路由选择算法(LS 算法)
算法原理
LS 算法中,网络拓扑和所有链路开销都已知,在实践中可以使用链路状态广播算法来完成,通过结点广播就可以使所有结点得到该网络完整的、统一的视图。该算法的内部实现就是我们熟知的 Dijkstra 算法,具体的知识可以左转博客——最短路径的第一部分进行学习。
对于 Dijkstra 算法可以使用堆结构对其进行强化,使其时间复杂度缩小到 O(nlogn),具体知识可以左转博客——堆、优先级队列和堆排序的第七部分进行学习。
振荡问题
要理解这个问题,我们通过一个例子来看,首先假设链路费用是该链路承载的通信量。通过 x->w、y->x、z->w 发送数据报,我们得到一个初始的路由选择状态,此时 x->w、y->w 都是逆时针的,z->w 为顺时针。
接下来运行 LS 算法,按照开销 x->w 得到的新的路径是 x->y->z->w,y->w 得到的新路径是 y->z->w。此时的状态如图,x->w、y->w 的路径改为顺时针,z->w 改为逆时针。
再次运行 LS 算法,x->w、y->w 的路径改为逆时针,z->w 改为顺时针,如图所示。
再次运行 LS 算法,情况再次发生逆转,此时路由选择算法由于拥塞敏感而产生了振荡。
这个问题要如何解决呢?如果修改度量的基准,使得路由选择算法不按照或者减轻按照所承载的流量来判断的话,显然不行,因为路由选择就是要避开拥塞的路径。比较好的做法是确保并非所有路由器同时运行 LS 算法,也就是路由器以相同的周期,不同的时机来运行算法。同时这又会引发自同步的问题,也就是算法的执行时间随着运行会慢慢趋于同步,此时可以让路由器发送链路通告的时间随机生成,就可以打消自同步。
距离向量路由选择算法(DV 算法)
算法特点
LS 算法我们是比较熟悉的,下面就来详细谈一下距离向量(DV) 算法。相比于 LS 算法需要有网络的全局信息,DV 算法是一种迭代、异步和分布式的算法。分布式体现于算法的流程,是要每个结点都从一个或多个直接连接的邻居接收信息,通过对信息的计算,再把结果通告给邻居。迭代体现于算法对于上述的过程,需要一直持续到邻居之间没有信息需要交换位置。异步体现于不需要所有的节点统一进行操作,而是当收到邻居发来的信息进行操作即可。
Bellman-Ford 方程
DV 算法的原理使用了 Bellman-Ford 方程,具体内容如下。结合我们的情景讲一下每个参数,“c(x,v)” 表示 x 到邻居 v 的开销,dv(y) 表示从邻居 v 到目的地 y 的开销,我们需要在 x 的所有邻居中获得最小值。
dx(y) = minv{c(x,v) + dv(y)}
Bellman-Ford 方程为 DV 算法的与邻居的通信提供了理论基础。简单地说,也就是结点获得最短路径的下一跳,并且将该信息写入转发表中。这时我们也给出距离向量的定义,向量所表示的信息是 x 在 N 中到其他所有结点 y 的开销估计向量。
Dx = [Dy: y ∈ N]
算法实现
DV 算法对于一个节点 x 来说,当 x 发现与它直接连接的链路开销发生变化或从邻居接收到一个距离向量的更新时,重新计算距离向量的估计值,若最低开销路径发生了变化,就像邻居发送新的距离向量。具体怎么实现,通过一个例子来说明:
我们有一个简单的网络拓扑,有 v,y,z 3 个节点,下图中最左边就是 3 个节点的初始路由表。如图展示的就是根据 DV 算法更新路由表的过程。
DV 算法故障分析
好消息,传播快!
下面我们看一个情景,如图哦所示 y->x 的链路开销由 4 变为 1,表示这条链路的最低开销发生变化。首先是 y 发现了开销变化,就更新自己的距离向量并通知 z。z 接收到了 y 的信息之后重新计算到 x 的开销(5->2),并发送消息给 y。下一步 y 的最低开销不变,因此算法进入静止状态。
我们可以看到 DV 算法最终将收敛于一个最佳状态,同时也可以看出对于网络状态变得更好时,最低开销的传播速度是很快的。
无穷计数
下面再看一个网络状态变拥塞的例子,还是如图所示,这次 y->x 的链路开销由 4 变为 60。
那么距离向量是怎么计算的呢?此时在链路开销变化前,Dy(x) = 4,Dy(z) = 1,Dz(y) = 1,Dz(x) = 5,而发生变化的信息是 c(y,x) = 60,根据这些信息计算出来的距离向量如下:
Dy(x) = min{c(y,x) + Dx(x),c(y,z) + Dz(x)} = min{60 + 0,1 + 5} = 6
此时计算出来的路径是 y->z->x,而开销是 6,结合这张图来看很明显是错误的,而此时 y 又会将错误的信息传递给 z,z 到 x 的距离向量的计算为:
Dz(x) = min{c(z,x) + Dx(x),c(z,y) + Dy(x)} = min{50 + 0,1 + 6} = 7
此时再次得到了错误的信息,而且这个还会被传播给 y,这个时候就遇到了选择环路,即 y 和 z 将会不停地更新转发表直到发现了 y->x 的链路出现故障。这样的开销无疑是很大的,这也体现出了 DV 算法“**坏消息,传播慢!”的特点。
时间 | y->x | z->x | 转发信息 |
---|---|---|---|
t0 | 6 | 5 | y->z:Dy(x) = 6 |
t1 | 6 | 7 | z->y:Dz(x) = 7 |
t2 | 8 | 7 | y->z:Dy(x) = 8 |
t3 | 8 | 9 | z->y:Dz(x) = 9 |
t4 | 10 | 9 | y->z:Dy(x) = 10 |
… | … | … | … |
对于路由器彼此之间认为对方可到达而出现环路的情况,我们称之为无穷计数。
毒性逆转
对于上述的“无穷计数”故障,可以使用名为“毒性逆转”的手法规避。这种手法的思想是若一个结点到某目的的最小开销路径需要通过某个邻居,则通告给该邻居节点到达目的的开销为 ∞。
还是刚才的例子,此时我们观察一下无穷计数故障是否被规避了。发生变化的信息是 c(y,x) = 60,而此时在上一次 z 传递给 y 的 Dz(x) = ∞。
时间 | y->x | z->x | 转发信息 |
---|---|---|---|
t0 | 60 | 5 | y->z:Dy(x) = 60 |
t1 | 60 | 50 | z->y:Dz(x) = 50 |
t2 | 51 | 50 | y->z:Dy(x) = ∞ |
t3 | 51 | 50 | NULL |
由此可见,毒性逆转消除了这个故障,请问毒性逆转能够完全解决无穷计数的问题吗?
LS 算法 VS DV 算法
2 种算法采取不同的思路来得出最短路径,这 2 种算法在以下 3 个方面有着很明显的不同。
报文复杂性
LS 算法需要知道网络中所有链路的开销,这就需要发送足够多的(O(|N||E|))报文才能获取,当任何一条链路开销发生改变时,也必须向所有的节点发送新的开销信息。而 DV 算法在每次迭代时,只需要 2 个直接相连的邻居交换报文即可。
收敛速度
LS 算法的时间复杂度和我们熟悉的 Dijkstra 算法相同,但是会遇到振荡问题,而 DV 算法也会遇到麻烦的无穷计数问题。
健壮性
若网络中突然出现某台路由器故障、系统错乱或被蓄意破坏的情况。对于 LS 算法由于路由的计算时分离的,因此路由器可以向其连接的链路广播异常状态。对于 DV 算法来说,当产生了不正确的最低开销的计算结果,这个错误将会蔓延到整个网络。
参考资料
《计算机网络(第七版)》 谢希仁 著,电子工业出版社
《计算机网络 自顶向下方法》 [美] James F.Kurose,Keith W.Ross 著,陈鸣 译,机械工业出版社
用树结构存储的图博客(笑)
堆、优先级队列和堆排序