TCP/IP之路由算法

网络层的重要功能就是路由和转发。而路由是根据路由器根据所维护的路由表进行路由选择。所以,如果创建和更新转发表就是一个很重要的问题。通常,在路由时,我们总是选取所需代价最小的一条路由。

image.png

首先,我们需要将网络进行抽象,最常见的抽象就是,将网络抽象成图结构。

image.png

每段链路的费用可以总是1,或者是,带宽的倒数、拥塞程度等。

关键问题: 源到目的(如u到z)的最小费用路径是什么?
所谓的路由算法: 寻找最小费用路径的算法。

路由算法的分类

静态路由 vs 动态路由

静态路由就是所有路由信息由人工静态配置好,以后需要更新的话,就要重新配置。

  • 手工配置
  • 路由更新慢
  • 优先级高

动态路由就是在网络随时根据网络拓扑结构的结构的变化,进行动态更新

  • 路由更新快
  • 定期更新
  • 及时响应链路费用或网络拓扑变化

全局信息 vs 分散信息

有的路由算法需要所有路由器掌握完整的网络拓扑和链路费用信息,也就是对网络的全局有一个了解
最有代表性的就是链路状态(LS)路由算法。

有的路由算法只需要路由器只掌握物理相连的邻居以及链路费用。通过邻居间信息交换、运算的迭代过程来更新路由信息。
最有代表性的就是距离向量(DV)路由算法。

链路状态路由算法

image.png

首先将网络抽象,然后利用图算法中的最短路径算法,Dijkstra 算法。

所有结点(路由器)掌握网络拓扑和链路费用

  • 通过“链路状态广播”
  • 所有结点拥有相同信息

利用Dijkstra 算法计算从一个结点(“源” )到达所有其他结点的最短路径。从而可以获得该节点的转发表。
然后对不同的节点进行迭代,就可以使所有节点都得到自己的转发表。

  • c(x,y): 结点x到结点y链路费用;如果x和y不直接相连,则=∞
  • D(v): 从源到目的v的当前路径费用值
  • p(v): 沿从源到v的当前路径, v的前序结点
  • N’: 已经找到最小费用路径的结点集合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1 初始化:
2 N' = {u}
3 for 所有结点v
4 if v毗邻u
5 then D(v) = c(u,v)
6 else D(v) = ∞
7
8 Loop
9 找出不在 N’中的w ,满足D(w)最小
10 将w加入N'
11 更新w的所有不在N’中的邻居v的D(v) :
12 D(v) = min( D(v), D(w) + c(w,v) )
13 /*到达v的新费用或者是原先到达v的费用,或者是
14 已知的到达w的最短路径费用加上w到v的费用 */
15 until 所有结点在N’中

image.png

image.png

算法复杂性: n个结点

  • 每次迭代: 需要检测所有不在集合N’中的结点w
  • n(n+1)/2次比较: O(n2)
  • 更高效的实现: O(nlogn)

算法可能存在震荡现象

image.png

当链路状态更新的太快并且不断变化的时候,假设我们发出一个分组,结果还没到目的地,路由表就更新了,然后这个数据报就一直在路由间切换,最后由于ttl到0,直接丢弃。这就是震荡现象。

距离向量(Distance Vector)路由算法

image.png

image.png

重点:结点获得最短路径的下一跳, 该信息用于转发表中!

核心思想:

  • 每个结点不定时地将其自身的DV估计发送给其邻居
  • 当x接收到邻居的新的DV估计时, 即依据B-F更新其自身的距离向量估计:

image.png

Dx(y)将最终收敛于实际的最小费用 dx(y)

异步迭代:

  • 引发每次局部迭代的因素
  • 局部链路费用改变
  • 来自邻居的DV更新

分布式:

  • 每个结点只当DV变化时才通告给邻居
  • 邻居在必要时(其DV更新后发生改变)再通告它们的邻居

image.png

距离向量路由算法:举例

image.png

image.png

如果链路发生变化,距离向量节点会怎么样呢?

image.png

链路费用变化:

  • 结点检测本地链路费用变化
  • 更新路由信息,重新计算距离向量
  • 如果DV改变,通告所有邻居

交换过程

  • t0 : y检测到链路费用改变 ,更新DV,通告其邻居.
  • t1 : z收到y的DV更新,更新其距离向量表,计算到达x的最新最小费用,更新其DV,并发送给其所有邻居.
  • t2 : y收到z的DV更新, 更新其距离向量表,重新计算y的DV,未发生改变,不再向z发送DV.

某一时刻,Y检测到它到X的链路费用由4减少为1,好消息当然要告诉大家了,于是它更新了自己的距离向量,并通知了Z。Z在收到Y的更新报文后,也更新了自己的距离向量(由5减为2),并向邻居们发送更新报文。而后,Y又收到了Z的更新报文,但它发现并没有改变自己的最低费用,于是保持不变。这样,仅仅经过了两次迭代网络就达到了静止。好消息通过网络得到了迅速传播。
“好消息传播快! ”

但是,当链路费用增加(甚至断开)时,就不会这么简单了。

“坏消息会怎么样呢? ”
如果是坏消息,很可能就会出现无穷计数的问题:

image.png

还是X、Y、Z三个节点。此时Y检测到它到X的路径费用由4增加到了60。此时节点Z的距离向量为:d(X) = 5, d(Y) = 1, d(Z) = 0。于是Y在更新向量时发现,咦,Z到X的距离只有5诶,那可以先到Z再到X,于是Y的距离向量更新为:d(x) = 5 + 1 = 6, d(Y) = 0, d(z) = 1。我们可以发现,这个逻辑显然是错误的,因为Z到X的距离为5的前提是要经过Y,但Y更新后的路径又要经过Z,这就形成了一个选路环路(routing-loop)问题。因为Y的距离向量更新了(虽然是错误的),但它还是向Z发送了更新报文。Z收到更新报文后,比较了下邻居们到X的距离,发现经过Y的路径距离为1 + 6 = 7,小于直接到X的距离,于是Z也更新的自己的距离向量,然后又将更新后的距离向量发给Y。Y收到后又更新向量为8,然后再发给Z。。。这样循环往复,更新报文在Y和Z之间传来传去,直到第44次迭代后,Z算出它经由Y的路径费用大于50为止。此时,Z最终确定到X的最短路径费用是直接到达X的费用50,而Y也得到了最短路径是经Z到X的费用51。
可以看出,虽然最后还是得到了正确的信息(最后的50和51是正确的!),但坏消息的传播与好消息相比实在是慢太多了!而且,如果X和Y之间的费用为10000,Z和X的费用是9999时,就会出现计数到无穷(count-to-infinity)的问题!

image.png

我们发现 坏消息传播慢!—“无穷计数(count to infinity)”问题!

无穷计数问题的解决方法

毒性逆转(poisoned reverse):

如果一个结点(e.g. Z)到达某目的(e.g.X)的最小费用路径是通过某个邻居(e.g.Y),则
通告给该邻居结点到达该目的的距离为无穷大。

它的基本思想是:如果Z的最短路径要通过邻居Y,那么它将告诉Y自己到目的节点的距离是∞。这样,Z向Y撒了一个善意的谎言,使得只要Z经过Y选路到X,它就会一直持续讲述这个谎言,这样Y也就永远不会尝试从Z选路到X了,也就避免了环路问题。(可见,有时善意的谎言也不是件坏事,也是为了你好啊T^T)
我们将毒性逆转技术应用于上例。Y在更新自己的距离向量时,发现Z到X的距离是∞,于是它将d(x)无奈地更新为60,并向Z发送了更新报文。Z收到报文后更新自己的d(X)为50(直接选路到X),并发给Y更新报文(此时因为Z不需要经过Y进行选路,因此将告诉Y自己到X的距离为50)。Y在接收到Z的报文后,重新将距离更新为1 + 50 = 51,并告诉Z自己到X的距离是∞(实际是51)。Z收到报文后,发现最低耗费并没有改变,因此算法进入静止状态。

image.png

毒性逆转能否彻底解决无穷计数问题?
显然是不行的,如果过于复杂的网络,我们发现毒性逆转也需要经过很多的步骤。

而且,当涉及3个或更多节点(而不仅仅是两个直接相连的邻居节点)的环路将不能被毒性逆转技术检测到,如下例:

当C和D之间的连接断开时,依次发生如下事件:
  1. A收到来自C的坏消息,然后将选择从B到达D
  2. A向C发送更新报文
  3. C向B发送更新报文
这种问题出现的原因是,A和B无法同时收到来自C的更新报文然后更新自己的距离向量。比如这里,B与A相比得到的更新报文时间要晚,这就给A造成了“错觉”,在A看来,虽然从C到不了D,但是选B也可以。然后它又把这个错误的好消息告诉了C,让C也以为自己又和D团聚了。最后,终于想到忽略了B,又发送了报文给B。这样,A、B、C都以为自己和D联系上了!但实际上D和它们已经隔离了。。。

定义最大度量(maximum metric)

定义一个最大的有效费用值,如15跳步, 16跳步表示∞

image.png

层次路由

我们前面的算法是将网络抽象成一张图,但实际上,网络都是很大的,节点数量远超过我们想象,如果我们单纯的使用以上的算法显然是不可行的。

将任意规模网络抽象为一个图计算路由-过于理想化

  • 标识所有路由器
  • “扁平”网络
    ——在实际网络(尤其是大规模网络)中, 不可行!

网络规模: 考虑6亿目的结点的网络

  • 路由表几乎无法存储!
  • 路由计算过程的信息( e.g. 链路状态分组、DV)交换量巨大,会淹没链路!

另一方面,就是网络管理自治的问题,不同的网络可以采取不同的方法进行路由。
管理自治:

  • 每个网络的管理可能都期望自主控制其网内的路由
  • 互联网(internet) = 网络之网络(network of networks)

层次路由就是解决这样的问题,和网络领域中的问题是一样,继续抽象出一层网络。
聚合路由器为一个区域:自治系统AS(autonomous systems)
然后再把自治系统看成节点进行路由,对于自治系统内就采取自己的路由方法。这就是抽象成了两层。

同一AS内的路由器运行相同的路由协议(算法)

  • 自治系统内部路由协议(“ intra-AS” routing protocol)
  • 不同自治系统内的路由器可以运行不同的AS内部路由协议

网关路由器(gateway router):

  • 位于AS“边缘”
  • 通过链路连接其他AS的网关路由器

image.png

转发表由AS内部路由算法与AS间路由算法共同配置

  • AS内部路由算法设置AS内部目的网络路由入口(entries)
  • AS内部路由算法与AS间路由算法共同设置AS外部目的网络路由入口

假设AS1内某路由器收到一个目的地址在AS1之外的数据报:
路由器应该将该数据报转发给哪个网关路由器呢?

AS1必须:
1.学习到哪些目的网络可以通过AS2到达,哪些可以通过AS3到达
2.将这些网络可达性信息传播给AS1内部路由器

以上这些都是
image.png

例: 路由器1d的转发表设置

image.png

假设AS1学习到(通过AS间路由协议):子网x可以通过AS3 (网关 1c)到达,但不能通过AS2到达,AS间路由协议向所有内部路由器传播该可达性信息

为了配置转发表,路由器1d必须确定应该将去往子网x的数据报转发给哪个网关?这个任务也是由AS间路由协议完成!

  • 假设AS1通过AS间路由协议学习到:子网x通过AS3和AS2均可到达
  • 为了配置转发表,路由器1d必须确定应该将去往子网x的数据报转发给哪个网关?
  • 这个任务也是由AS间路由协议完成!
  • 热土豆路由: 将分组发送给最近的网关路由器.

image.png

转载自:https://liuchi.coding.me/2017/06/05/TCP-IP%E4%B9%8B%E8%B7%AF%E7%94%B1%E7%AE%97%E6%B3%95/

以及:http://blog.csdn.net/candycat1992/article/details/8098650

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值