路由选择可分为静态路由选择和动态路由选择两类。
静态路由选择:
由人工配置的网络路由、默认路由、特定主机路由、黑洞路由等都属于静态路由;
这种人工配置方式简单、开销小。但不能及时适应网络状态(流量、拓扑等)的变化;
一般只在小规模网络中使用。
动态路由选择:
路由器通过路由选择协议自动获取路由信息;
比较复杂、开销比较大,能较好地适应网络状态的变化;
适用于大规模网络。
因特网是全球最大的互联网络,它所采用的路由选择协议的主要有以下3个特点:
(1)自适应:因特网采用的是动态路由选择,能较好地适应网络状态的变化;
(2)分布式:因特网中的各路由器通过相互间的信息交互共同完成路由信息的获取和更新;
(3)分层次:将整个因特网划分为许多较小的自治系统AS(Autonomous System)。如一个较大的因特网服务提供商就可划分为一个自治系统。在自治系统内部和自治系统外部采用不同类别的路由选择协议,分别进行路由选择。
举例说明因特网采用分层次的路由选择协议:
如图所示为因特网中很小的一部分,将这些网络和路由器分别划归到两个自治系统AS。自治系统之间的路由选择简称为域间路由选择,自治系统内部的路由选择简称为域内路由选择。域间路由选择使用外部网关协议EGP这个类别的路由选择协议。域内路由选择使用内部网关协议IGP这个类别的路由选择协议。
外部网关协议EGP和内部网关协议IGP只是路由选择协议的分类名称,而不是具体的路由选择协议。外部网关协议EGP可改称为外部路由协议ERP,内部网关协议IGP可改称为内部路由协议IRP(这是因为早期的RFC文档并没有使用“路由器”这一名词,新版的RFC文档中将“网关”改用为“路由器”)。
在一个自治系统内部使用的具体的内部网关协议与因特网中其他自治系统选用何种内部网关协议无关。如本例中的两个自治系统内部使用的内部网关协议分别为RIP协议和开放式最短路径优先OSPF协议。自治系统之间的使用的外部网关协议为边界网关协议BGP。
常见的路由选择协议如下图所示:
路由选择协议是在路由器上运行的,路由器的基本结构如下:
路由器是一个具有多个输入端口和输出端口的专用计算机,其任务是转发分组。整个路由器结构可划分为两大部分:路由选择部分和分组转发部分。
路由选择部分的核心构件是路由选择处理机。它的任务是根据所使用的路由选择协议周期性地与其他路由器进行路由信息的交互来更新路由表。
分组转发部分由三部分构成:交换结构、一组输入端口和一组输出端口。
信号从某个输入端口进入路由器,物理层将信号转换成比特流送交给数据链路层处理。数据链路层从比特流中识别出帧,去掉帧头和帧尾后送交网络层处理。
(1)如果送交网络层的分组是普通待转发的数据分组,则根据分组首部中的目的地址进行查表转发。若找不到匹配的转发条目,则丢弃该分组;否则,按照匹配条目中所指示的端口进行转发。
网络层更新数据分组首部中某些字段的值,例如将数据分组的生存时间减1。然后送交数据链路层进行封装。数据链路层将数据分组封装成帧,送交物理层处理。物理层将帧看作是比特流,将其变换成相应的电信号进行发送。
(2)如果送交网络层的分组是路由器之间交换路由信息的路由报文,则把这种分组送交路由选择处理机。路由选择处理机根据分组的内容来更新自己的路由表。路由表一般仅包含从目的网络到下一跳的映射;路由表需要对网络拓扑变化的计算最优化;而转发表是从路由表得出的;转发表的结构应当使查找过程最优化。
路由选择处理机除了处理收到的路由报文外,还会周期性的给其他路由器发送自己所知道的路由信息。路由器的各端口还应具有输入缓冲区和输出缓冲区。输入缓冲区用来暂存新进入路由器但还来不及处理的分组。输出缓冲区用来暂存已经处理完毕但还来不及发送的分组。
路由信息协议RIP(Routing Information Protocol)是内部网关协议IGP中最先得到广泛使用的协议之一,其相关标准文档为RFC 1058,有些厂商的路由器并没有按照RIP标准文档规定来实现RIP,但这并不影响RIP的正常运行;
RIP要求自治系统AS内的每一个路由器都要维护从他自己到AS内其他每一个网络的距离记录。这是一组距离,称为“距离向量D-V(Distance-Vector)”;
RIP使用跳数(Hop count)作为度量(Metric)来衡量到达目的网络的距离:
RIP将路由器直连网络的距离定义为1;
RIP将路由器到非直连网络的距离定义为所经过的路由器数加1;
RIP允许一条路径最多只能包含15个路由器。“距离”等于16时相当于不可达。因此RIP只适用于小型互联网。
RIP认为好的路由就是“距离短”的路由,也就是所通过路由器数量最少的路由;
当到达同一目的网络有多条“距离相等”的路由时,RIP可以进行等价负载均衡也就是将通信量均衡的分布到多条等价的路由上;
RIP包含以下三个要点:
(1)和谁交换信息——仅和相邻路由器(两个路由器直连而没有通过其他路由器的一组路由器为相邻路由器)交换信息;
(2)交换什么信息——自己的路由表;
(3)何时交换信息——周期性交换(例如每30s发送一次RIP更新报文。
如图所示,路由器刚开始工作时,只知道自己到直连网络的距离为1;
每个路由器仅和相邻路由器周期性的交换并更新路由信息;
若干次交换和更新后,每个路由器都知道到达本AS内各网络的最短距离和下一跳地址,这称为收敛。
路由器C和D互为相邻路由器,他们之间周期性的交换并更新路由信息。路由器C的路由表中到达各目的网络的下一跳都记为问号,可以理解为路由器D并不需要关心路由器C的这些内容。假设路由器C的RIP更新报文发送周期到了,则路由器C将自己路由表中的相关路由信息封装到RIP更新报文中发送给路由器D。可以简单地理解为路由器C将自己的路由表发送给了路由器D。路由器D收到后对其进行改造,将到达目的网络的下一跳都改为C,距离都增加1。然后根据改造好的路由表来更新自己之前的路由表。
更新后:
如图所示:假设R1检测到到达其直连网络N1的链路出现故障时,会将到达N1的路由条目中距离修改为16,表示网络N1不可达。等待RIP更新周期到时后,发送该路由信息给R2。而此时R2的路由表中关于N1的路由条目仍然是先前通过RIP协议获取到的,也就是到达N1的距离为2,下一跳通过R1转发。假设R2的RIP更新周期先到时,当R1收到R2的RIP更新报文后,就会被该谣言误导,认为可以通过R2到达N1,距离为3。并在自己的RIP更新到时后将这条路由信息发送给R2。
当R2收到该信息后,被该信息误导,认为可以通过R1到达N1,距离为4。并在自己的RIP更新周期到时后,将该路由信息发送给R1。R1、R2就这样一直反复被误导,知道R1和R2的路由表中到达N1的距离都到达16时他们才知道N1不可达(此时才收敛)。在这个过程中,R1和R2之间会出现长达数分钟的路由环路
"坏消息传播的慢"又称路由环路或距离无穷计数问题,这是距离向量算法的一个固有问题。可以采取多种措施减少(只能减少而不能避免)出现该问题的概率或减小该问题带来的危害:
限制最大路径距离为15(16表示不可达);
当路由表发生变化时就立刻发送更新报文(即“触发更新”),而不仅是周期性发送;
让路由器记录收到某特定路由信息的接口,而不让同一路由信息再通过此接口向反方向传送(即“水平分割”)。
开放最短路径优先OSPF(Open Shortest Path First)是为了克服RIP的缺点在1989年开发出来的。
“开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的;
“最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。
OSPF是基于数据链路状态的,而不像RIP那样是基于距离向量的。
OSPF采用SPF算法计算路由,从算法上保证了不会产生路由环路。
OSPF不限制网络规模,更新效率高,收敛速度快。
链路状态是指本路由都和哪些路由相邻,以及相应链路的“代价(cost)”。
“代价”用来表示费用、距离、时延、贷款等。这些都由网络管理人员来决定。
如思科路由器中OSPF计算代价的方法:1000Mbps/链路带宽
,计算结果小于1的值仍记为1;大于1的数舍去小数。
问候分组Hello
OSPF相邻路由器之间通过问候(Hello)分组,建立和维护邻居关系。
问候分组封装在IP数据报中,发往组播地址224.0.0.5,IP数据报首部中的协议字段取值应为89,来表明数据报的数据载荷为OSPF分组。
问候分组的发送周期为10s。若40s未收到来自邻居路由器的Hello分组,则认为该邻居路由器不可达。因此,每个路由器都会建立一张邻居表:
若“死亡”倒计时到达0之前再次收到了来自R2的问候分组,则重新启动针对该邻居条目的40秒“死亡”倒计时。否则,当“死亡”倒计时为0时,则判定该邻居路由器不可达。
链路状态通告LSA
使用OSPF的每个路由器都会产生链路状态通告LSA(Link State Advertisement)。LSA中包含以下内容:
直连网络的链路状态信息;
邻居路由器的链路状态信息。
LSA被封装在链路状态更新分组LSU中,采用洪泛法发送。收到链路状态更新分组的路由器,将从自己其他所有接口转发该分组,也就是进行洪泛转发。这样,自治系统中每个路由器所发送的封装有链路状态通告的链路状态更新分组,会传递给系统中其他所有路由器。
链路状态数据库LSDB
使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA。
通过各路由器洪泛发送封装有自己LSA的LSU分组,个路由器的LSDB最终将达到一致。
使用OSPF的各路由器基于LSDB进行最短路径优先SPF计算,构建出各自到达其他各路由器的最短路径,即构建各自的路由表。
OSPF有以下五种分组类型:
(1)问候(Hello)分组——用来发现和维护邻居路由器的可达性;
(2)数据库描述(Database Description)分组——向邻居路由器给出自己的链路状态数据库中的所有链路状态项目的摘要信息;
(3)链路状态请求(Link State Request)分组——向邻居路由器请求发送某些链路状态项目的详细信息;
(4)链路状态更新(Link State Update)分组——路由器使用这种分组将其链路状态进行洪泛发送,即用洪泛法对全网更新链路状态;
(5)链路状态确认(Link State Acknowledgment)分组——这是对链路状态更新分组的确认分组。
OSPF协议的基本工作过程
当OSPF在多点接入网络中建立路由器的邻居关系时,如果不采用其他机制,将会产生大量的多播分组。
为了减少所发送分组的数量,OSPF采用选举制定路由器DR(Designated Router)和备用的指定路由器BDR(Backup Designated Router)的方法;
所有的非DR/BDR只与DR/BDR建立邻居关系;
非DR/BDR之间通过DR/BDR交换信息;
若DR出现问题,则由BDR顶替DR
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若干个更小的范围,叫做区域(Area)
采用分层次划分区域的方法虽然使交换信息的种类增多了,同时也使OSPF协议更加复杂了。但是把利用洪泛法交换链路状态信息的范围局限于每一个区域而不是整个自治系统,这样就使整个网络上的通信量大大减小,因而使OSPF协议能够用于规模很大的自治系统中。
我们已经知道,因特网采用分层次的路由选择协议
内部网关协议IGP(如路由信息协议RIP和开放最短路径优先OSPF):
设法使分组在一个自治系统内尽可能有效的从源网络传输到目的网络;
无需考虑自治系统外部其他方面的策略;。
外部网关协议EGP(如边界网关协议BGP):
在不同自治系统内,度量路由的“代价”(距离,带宽,费用等)可能不同。因此,对于自治系统之间的路由选择,使用“代价”作为度量来寻找最佳路由是不可行的。如:
自治系统之间的路由选择必须考虑相关策略(政治,经济,安全等)。如:
BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。
在配置BGP时,每个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人”;
不同自治系统的BGP发言人要交换路由信息,首先必须建立TCP连接,端口号为179:
在此TCP连接上交换BGP报文以建立BGP会话;
使用BGP会话交换路由信息(如增加新的路由,撤销过时的路由以及报告出错的情况等);
使用TCP连接交换路由信息的两个BGP发言人,批次成为对方的邻站或对等站。
BGP发言人除了运行BGP外,还必须运行自己所在自治系统所使用的内部网关协议IGP,如OSPF或RIP。
BGP发言人交换网络可达性的信息(要到达某个网络所要经过的一系列自治系统);
当BGP发言人互换了网络可达性的信息后,各BGP发言人就根据所采用的策略从收到的路由信息中找出到达各自治系统的较好的路由。也就是构造出树形结构、不存在回路的自治系统连通图。
BGP适用于多几结构的因特网
BGP-4有以下4种报文:
OPEN(打开)报文:用来与相邻的另一个BGP发言人建立关系,是通信初始化;
UPDATE(更新)报文:用来通告某一路由的信息,以及列出要撤销的多条路由;
KEEPALIVE(保活)报文:用来周期性的证实邻站的连通性;
NOTIFICATION(通知)报文:用来发送检测到的差错。
在BGP协议刚刚运行时,BGP的邻站交换整个BGP路由表。但以后只需要在发生变化时更新有变化的部分,这样做对节省网络带宽和减少路由器的处理开销都有好处。