计算机网络路由讲解,计算机网络:路由算法详解(网络层)

路由算法

路由表对于路由器的重要性不言而喻,维护一个高效的路由表则是路由器提高性能的主要方式。

路由算法将网络抽象成一张无向带权图(数据结构概念),将路由器抽象为节点,路由器间的连接关系抽象为边。图的权则代表链路的费用(距离),可能是带宽的倒数,也可能全是1.具体的费用抽象策略需要根据具体需求设定(一般需要满足越好的路径权值越小)。

静态路由与动态路由对比:静态路由手工配置

优先级更高

更新麻烦,工作量大,更新慢

动态路由自动更新

更新速度快,能更好的应对网络拓扑的变化

全局信息和分散信息对比:全局信息所有路由器都需要掌握完整的网络拓扑和链路费用信息

代表算法:链路状态(LS)路由算法

分散信息路由器仅仅掌握物理上相连的邻居及链路的费用

邻居间通过信息交换,迭代运算来获得路径。

代表算法:距离向量(DV)路由算法

链路状态路由算法

从上面的对比我们知道,该算法属于掌握全局信息的路由算法,计算时需要掌握完整的网络拓扑和链路费用信息。所以该算法的前置问题就是:如何获取整个网络的拓扑信息和链路费用信息。

采用链路状态路由算法的路由器,会定期更新与自己直接相连的网络结点的拓扑和链路费用情况,并将这些信息通过“链路状态广播”广播给网络中的其他路由器。采用洪泛式来进行广播(每个收到信息的节点都会继续向自己周边的节点转发)。最终所有路由器都会得到整个网络的拓扑情况。

既然给网络拓扑抽象成图,就一定会用到图的最短路径算法来计算最短路径。链路状态路由算法选用的是迪杰斯特拉(Dijkstra)算法来计算最短路径。这里不介绍该算法,或许过两天我会写个专题介绍普里姆(Prim)和迪杰斯特拉。

注意:该算法存在震荡的可能,在该算法中,每隔一段时间就会重新更新拓扑情况

38b2ff3c53dcdb0f22fcd79b68d34abf.png

如上图的情况,C和B都走的同一条链路,在下一次更新拓扑信息的时候,B就会发现其实向C方向发送数据会更合适

2e19b24f0cdb8597eb60b97a5b313481.png

然后拓扑就会变成这样.然后再过一段时间,又会发现还是初始情况比较好.会一直周期性的改变路径.

d439c3e494e973b25c948d6ca4ecfd64.png

在这种特殊情况下,如果初始状态C要发送给A的数据在刚刚发送到B的时候路径改变了.B就会把C的数据再沿反方向发送给A,然后发送到中间某个节点的时候路径又变化,数据又会被反方向发回去.慢慢的TTL就被减到0,分组就被丢弃了.

所以目前采用链路状态路由算法的路由器都会采用某些机制避免该问题,例如随机延迟状态更新的方法.

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

该算法是一个分布式算法,每个节点只保存与自己物理相连节点的链路费用.以及相邻节点所发送过来的该节点的物理连接节点情况.通过Bellman-Ford方程(动态规划)逐步更新最短路径.

9bbcb39111160ff6102aeb4568d390d7.png

由于该算法并只掌握了网络的一个局部情况,所以不可能(也不需要)计算出完整的发送路径,关键在于获得最短路径的下一跳, 然后下一跳再推断相对于自己的最短路径的下一跳.以此类推最终就能按照最短路径到达目的地.

再算法最开始的时候,节点并不能掌握准确的dx(y),也就是x到y的最短路径的费用,而是使用Dx(y)表示一个估算的最小费用.在后期的迭代过程中,慢慢更新最终收敛到dx(y).

核心思想:每个节点不定时的将自身的DV(距离向量)估算值发送给邻居,邻居接收到后,根据Bellman-Ford方程更新距离向量估计:

1b92aa9d78c5da1ce6c5dcec9e0fe85d.png

如果在根据Bellman-Ford方程计算后更新了最短路径的信息,则需要把自己更新的信息再发给自己的邻居,直到接受到邻居的信息,并通过Bellman-Ford方程计算后没有发生变化的时候,结束迭代.

算法举例

c4c3c25618bebbd200f463e8a9330631.png最开始网络搭建的时候,每个节点都可以计算出自己到与自己物理直接连接的节点的费用信息.(对应上图第一列)

因为每个节点都发生了变化(从无到有),所以每个节点都把自己的DV发送给自己相邻的节点

每个节点收到自己相邻节点发来的DV之后,按照Bellman-Ford方程更新自己的DV,如果计算后自己的DV发生了变化,则继续发送给自己的邻居(如第二列的X和Z),如果没变化则不再发送(例如第二列的Y).

再一次次的迭代之后,最终每个节点都会获得自己的DV和邻居DV的副本.在发送数据时就可以根据本地的信息选择转发的对象.

每个节点都会周期性的检查自己周边的链路和节点的变化,如果发现变化也会及时的更新自己的CV并将自己变更后CV的副本发送给与自己相连的节点.

链路费用变化的若干问题

前文提到了,链路发生变化的时候最先发现的节点会更新CV并发送副本给自己的邻居.这个过程看似简单,实际上链路的费用降低与费用增长有着很多的不同.

链路费用降低

在链路费用降低时,传播速度会比链路费用上涨时传播的更快.

661e36f98368a0f30b5fa633393d2b9d.png

链路费用上涨

费用上涨的问题会复杂很多,会导致很多问题.首先就是无穷计数问题.

badd65fc41a0969034abd8a42da0f72c.png

上图清晰的描数了链路费用上涨时的费用更新情况.在T0时间,dy(x) = 6 ,dz(x) = 5. t1时段Y发现了y-->x这个链路的费用上涨,进而更新了自己的CV.

式子: dy(x) = max{cy(x),cy(z)+dz(x) } = {60,1+5} = 6

所以 dy(x)变成了6 ,这显然是不对的.

因为dz(x) 的值是基于dy(x)获得的,在dy(x) 发生变化的时候dz(x)的值就应该失效了.也因为这一问题,导致了无穷计数的问题

针对图上的情况,只有在dy(x)>50 的时候dz(x) 才会选择 z-->x 这条路径,完成更新.

想象另一种情况,如果x与z没有直接链路,上边的更新就会无穷无尽,彻底导致无穷计数

无穷计数问题的解决方案

毒性逆转(Poisoned reverse)

deb8780a5552bfb3edc7c5199d0c25ac.png

毒性逆转就是针对上面提到的问题,如果一个节点的某一直接链路发生了变化导致CV更新,则新的CV不可以根据另一个邻居基于自己被更新路径的费用所计算的CV来计算.

定义最大度量(maximum metric)

定义一个最大的有效值,超过该值的值就认为是不可达,不再更新.这就相当于为死循环增加了一个结束条件.

be37b0cd5764ce6bd7defca33b70d0ae.png

上述两种路由算法存在的问题要把整个网络抽象成一张图,在图更新的情况下会占用大量带宽.

对图进行计算,在网络规模很大的情况下计算量过于庞大.

需要占用巨大的存储空间,过大的网络规模根本无法存储.

两种协议之间无法互通, 无法实现各个网络的自治

只适合用于小规模网络

综上所述,两种算法都过于理想化,在实际应用中不可行

层次化路由策略(Internet采用的策略)

该策略就是为了解决上述算法存在的问题而诞生的, 通过多层次抽象,把许多运行同一路由协议算法的网络聚合为一个区域: 自治系统AS(autonomous systems).不同的自制系统内部可以选择不同的路由协议.这种抽象思维在计算机中到处可见.

自治系统内统一了路由算法, 自治系统外也同样要统一算法,层次化路由策略使用一个网关路由器(gateway router)来交换自治系统外的路由信息.这样实现了跨自治系统信息交换.

33a1e0f876fc578f7786ce9cf2ec3133.png

网络内部的主机间互通,仅需要通过AS内部的路由算法来决定传输路径, 如果要与网络外部的主机互通,则需要AS内外部路由算法共同工作.

6314bfcc642a415a6e73b2ca7896b2d2.png

如果一个数据报要发给自治系统外的网络,首先就要明确,哪个出口可以到达目的网络,这是由自治系统间的路由协议完成的,获取到这些信息之后,同时要在自治系统内部公布该信息,同时规划好路由(应该由哪个路由器作为出口发出),到达出口路由的路径由自治系统内路由协议规划.

如果有多个自治系统都可以到达该目的网络,则选择离当前数据报所在节点最近的路由出口进行发出.完成该功能会用到 热土豆路由协议 将分组发送给最近的网关路由器.再由网关路由器根据转发表转发给最小费用的网关接口.

RIP协议(Routing Information Protocol,路由信息协议)

RIP协议是一个经典的自治系统内的路由协议,1982年随BSD-UNIX操作系统发布.以跳步数来作为链路费用的计算依据.

RIP协议所用的技术路由算法: 距离向量路由算法跳步数: 最多15跳,每跳链路算1个跳步. 采用这种设定可以抑制无穷计数问题.但是这个设定也限制该协议无法应用于较大的网络(因为跳步数太小,距离太大的地方会因为这个设定无法到达)

每隔30秒邻居间就要交换一次CV. 称为通告(advertisement).这个设定可以用来判定链路的有效性,如果这条链路对应的节点在180秒内都没有发来通告,则认为该链路不可达,进而更新CV.

每次通告会通知给最近的25个子网(IP地址形式,CIDR) . 通告的内容包括从自身出发到达某子网的跳步数,同时也会附带到目标子网下一跳的信息,这样也就变相的实现了毒性逆转.

RIP路由表的处理

RIP路由表是由一个称作 route-d(daemon)的 应用层 进程进行管理的.通告报文也是通过UDP数据报发送的.

a452d80de6d2b6d3c8c529403d880c22.png

OSPF(Open Shortest Path First)开放最短路径优先协议

OSPF所采用的技术采用链路状态(LS)路由算法

OSPF通告中会包含自己的每一个邻居

OSPF通告采用泛洪的方式 在自治系统内扩散

OSPF的通告(报文)直接封装到IP数据报中发送(不采用RIP的应用层实现方式)

对比RIP的优点安全: OSPF的报文可以认证来源, 不容易被伪造,能预防网络攻击

允许多条费用相同的路径(RIP只能保存单条)

对于每条链路,可以针对不同的TOS(忘记的话可以看IP数据报的头部格式)设置不同的费用. (通过设置不同的费用可以实现分流)

集成单拨路由与多播路由两种罗友使用同样的网络拓扑数据,所以能够直接融合

OSPF支持对大规模自治系统进一步分层可以降低路由所维护拓扑图的大小,提高计算效率

每个局部区域需要有一个区边界路由器(图上局部区与主干区交界处的路由),这个路由器需要计算去往其他网络的最短路径(但不需要知道对方网络的具体拓扑情况).

区边界路由器也需要汇总到达所在区网络的距离,通告给其他区的边界路由器.

主干区内的普通路由器,称为主干路由器,在主干区内运行OSPF算法

区边界路由器负责连接其他自治系统,可有多个

998343f65b9b9d2a76386ac7aaba5ae7.png

BGP协议(Border Gateway Protocol, 边界网关协议)

该协议已经成为了事实上的标准域间路由协议,使用该协议可以把一个个自治系统连接起来组成一个整体(Internet).

BGP协议的两种数据传播形式:eBGP(外部会话): 自治系统邻居间获取子网可达性信息所用的方式

iBGP(内部会话): 自治系统的边界路由向内部路由器传播其他子网可达性信息时使用的方式

基于上述两种手段,就可以获取一条合适的路径,并且一个新的自治系统也可以通过eBGP的方式向其他邻居告知自己的存在和自己可达的子网路径等信息.

BGP的会话(Session)

两个BGP路由器会以平等(Peers)的身份交换BGP报文(不区分客户机服务器的关系,类似p2p). 会通过报文来通告对方自己可以去往的目的前缀(SIDR的表示方式,方便后期做路由聚合),发送的信息包括到达目标的具体路径(AS-PATH){形如:AS1,AS3,AS8 . . .}以及下一跳(NEXT-HOP):指向一个自治区域, 该属性以接收报文的自治区域为源点, 所以存储的是BGP报文发送方网关路由器的IP地址.

如果一个自治系统有多个边缘路由都同时向同一个自治系统通告了自己所能到达的路径(这个路径显然是相同的) . 这样接收方就有了两个可选的出口,会采用前文所述的热土豆路由协议选择最近的进行发出.

2c92df1acd62ae1184382227a7fc7ee4.png

BGP通过TCP连接的方式,使用报文交换传输

BGP的报文OPEN : 建立TCP连接,并认证发送方

UPDATE:通告新的路径,或者撤销原有路径

KEEPALIVE: 保活连接,也用于对OPEN请求的确认

NOTIFICATION: 报告发送方报文的差错,也用于关闭TCP连接

BGP路由选择策略

网关路由器收到路由通告之后,会利用其输入策略来判断是否接受该路由,策略可能是 : 不将流量路由到指定 AS(自治区域) , 可能考虑到目标区域的网络质量差或者转发效率低, 又或者涉及到数据保密问题不将信息发送到该区域防止信息泄露.

所以BGP路由又被称为基于策略路由

路由器可能可以获得到多条到达同一目的地的路由,这时会根据如下几个维度进行选取:本地偏好:根据本地配置的策略来选取

最短AS-PATH

最近的NEXT-HOP(下一跳)路由器: 热土豆路由

附加准则

案例:

befb7f3215065aebadfe66ef989bb09d.png

采用不同的AS内与AS间路由的原因策略Inter-AS : 期望能够管理流量的路由规则,可以控制由谁路由,经过的路线等

Intra-AS: 单一管理,不需要策略

规模使用层次路由可以降低路由表大小,降低路由更新流量

更加适合大规模互联网

性能Inter-AS : 侧重于路由策略

Intra-AS: 侧重于性能

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值