1 路由协议
1.1 路由表
路由器转发分组的关键是路由表。每个路由器中都保存着一张路由表,表中每一条路由项都指明了分组到某个子网或主机应通过路由器的哪个物理接口发送,然后就可到达该路径的下一个路由器,或者不再经过别的路由器而传送到直接相连的网络中的目的主机。
根据来源不同,路由表中的路由通常分为以下三类:
1.链路层协议发现路由(接口路由或直连路由);
2.由网络管理员手工配置的静态路由;
3.动态路由协议发现的路由。
(Tips:Cisco路由器中,不同路由标识:C-connected,S-Static,I-IGRP,R-RIP,M-mobile,B-BGP,D-EIGRP,EX-EIGRP external,O-OSPF,IA-OSPF inter area,N1-OSPF NSSA external type 1,N2-OSPF NSSA external type 2,E1-OSPF external type 1,E2-OSPF external type 2,E-EGP,i-IS-IS,L1-IS-IS level-1,L2-IS-IS level-2,ia-IS-IS inter area。)
1.2 距离矢量算法和链路状态算法
动态路由协议有很多种,根据算法的不同来划分,主要有:距离矢量路由协议(Distance-Vector,如RIP、BGP)和链路状态路由协议(Link-State,如OSPF、IS-IS)。
1.2.1 距离矢量算法
距离矢量协议也称为Bellman-Ford协议,网络中路由器向相邻的路由器发送它们的整个路由表。路由器在从相邻路由器接收到的信息基础之上建立自己的路由表,然后,将信息传递到它的相邻路由器。这样一级级的传递下去以达到全网同步。也就是说,距离矢量路由表中的某些路由项有可能是建立在第二手信息的基础之上的,每个路由器都不了解整个网络的拓扑结,它们只知道与自己直接相连的网络情况,并根据从邻居得来的路由信息更新自己的路由表,进行矢量行叠加后转发给其它邻居。
距离矢量路由算法存在一个重要的问题:会产生路由环路。路由环路问题产生的原因和距离矢量算法的原理有关。针对路由环路的问题,路由矢量协议也进行了改进,主要有以下几种方法:
定义最大路由权值法
水平分割法
毒性逆转法
路由保持法
触发更新法
1.2.2 链路状态算法
链路状态是一个层次式的,执行该算法的路由器不是简单的从相邻的路由器学习路由,而是把路由器分成区域,收集区域内所有路由器的链路状态信息,根据链路状态信息生成网络拓扑结构,每一个路由器再根据拓扑结构图计算出路由。需要注意的是:
网络中的设备并不向邻居传递“路由信息”,而是通告给邻居一些链路状态(链路状态数据表)。
网络中的设备最终都会得到网络拓扑中各个路由节点信息,只是详细程度不一样;
每个设备以自身为“树根”,根据LSDB中的数据计算得到各个网段的“最短生成树”;
由于每个设备有义务将网络拓扑信息向下传递,而具体的路由信息又是各设备自己计算所得,因此链路状态协议中,对是否“发出路由”不能进行控制,但可以控制路由的某些属性。
1.2.3 距离矢量路由算法和链路状态算法比较
2 OSPF协议
2.1 OSPF概述
2.1.1 简介
OSPF(Open Shortest Path First,开放最短路由优先协议)是目前Internet广域网和Intranet企业网采用最多、应用最为广泛的路由协议之一。它是IETF(Internet Engineering Task Force)组织开发的一个基于链路状态的内部网管协议,为TCP/IP网络而设计,包括明确的支持CIDR和标记来源于外部的路由信息。OSPF也提供给了对路由更新的验证,并在发送/接收更新时使用IP多播(224.0.0.5)。此外,针对如何通过很少的路由流量快速响应拓扑改变做了很多改进。目前针对IPv4协议使用的是OSPF Verion 2(RFC2328)。
OSPF使用链路状态算法来计算每个区域中到所有目的地最短路径,当一个路由器首先开始工作,或者任意一个路由发生变化,路由器会将这个变化通过LSA(Link State Advertisement,链路状态宣告数据包)扩散到同一级区域内的所有路由器,这些LSA包含这个路由器的链接状态和它与邻居路由器联系的信息,从这些LSA收集的信息组成了链路状态数据库,在这个区域中所有路由器都有一个特定的数据库来描述这个区域的拓扑结构。
在OSPF中,可以通过划分区域来分割整个自制系统,每一个区域都有着该区域独立的网络拓扑数据库及网络拓扑图。对于每一个区域来说,其网络拓扑结构在区域外是不可见的。同样,在每一个区域中的路由器对其域外的网络结构也不了解。这意味着OSPF路由域中的网络链路状态数据广播被区域的边界挡住了,这样做有利于减少网络中链路状态数据包在全网范围内广播,同时提高网络的恢复收敛速度。这也是OSPF将自治系统划分成很多区域的重要原因。
OSPF的数据直接封装成IP包,仅通过在IP包头中的目标地址来转发IP包。OSPF是一种动态路由协议,可以快速探知AS中拓扑改变(如路由器接口的失效),并在一段时间的收敛后计算出无环路的新路径。而且收敛时间很短,使用的路由流量很少。
2.1.2 OSPF特点
适应范围广。OSPF支持各种规模的网络,最多可支持几百台路由器。
收敛速度快。如果网络的拓扑结构发生变化,OSPF立即发送更新报文LSA,使这一变化在AS(自制系统)中同步。
无自环产生。由于OSPF使用最短路径树算法对收集到的链路状态信息进行处理,计算路由,算法本身就保证了不会产生自环路由。
支持子网掩码(VLSM)。OSPF在描述路由信息时携带网段掩码信息,所以OSPF协议不受自然掩码的限制,对VLSM有很好的支持。
区域划分。OSPF协议允许自治系统的网络被划分成区域来管理,区域间传送路由信息被进一步抽象,从而减少了网络带宽的占用。
等值路由。OSPF支持到同一目的地址的多条等值路由,即到达统一目的地有多个下一跳,这些等值路由会被同时发现和使用,同时也可以用来做负载平衡和链路冗余。
路由分级。OSPF使用4类不同的路由,按优先级顺序来说分别是:区域内路由、区域间路由、第一类外部路由、第二类外部路由。
支持验证。支持基于接口的报文验证以保证路由计算的安全性。
组播发送。OSPF在有组播发送能力的链路层上以组播地址(0100.5E00.0005)发送协议报文,不仅达到了广播作用,而且最大程度减少了对其他网络设备的干扰(设备需要启用组播协议)。
2.1.3 Router ID
OSPF使用一个被称为Router ID的32位无符号整数来唯一标识一台路由器。基于这一个目的,每一台运行OSPF的路由器都需要一个Router ID。这个Router ID一般需要手工配置,可将其设置为给路由器的某个接口的IP地址。
由于IP地址是唯一的,所以这样就很容易保证Router ID的唯一性。如果未对其进行配置,路由器支持自动从当前所有接口的IP地址中自动选举一个IP地址作为Router ID。选取规则如下:
首先选择最大的lookback环回接口地址作为Router ID;
如果没有配置环回接口,那么就选取最大的物理接口地址;
可以通过命令强制改变Router ID,VRP平台视图下:router id
如果一台路由器的Router ID在运行中被改变,则必须重启OSPF协议或重启路由器才能使能新的Router ID生效。
VRP3.4平台的OSPF支持多进程,在同一台路由器上可以运行多个不同的OSPF进程,它们之间互不影响,彼此独立。OSPF进程号是本地概念,不影响与其它路由器之间的报文交换。因此,不同的路由器之间,及时进程号不同也可以进行报文交换。不同的OSPF进程之间的路由交换相当于不同路由协议之间的路由交互。路由器的一个接口只能属于某一个OSPF进程。
2.1.4 SPF算法
SPF算法也称为Dijkstra算法,这是因为最短路径优先算法SPF是Dijkstra发明的。SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的路由器的距离,每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图,该结构图类似于一棵树,在SPF算法中,被称为最短路径树。
2.1.5 COST算法
在OSPF协议中,最短路径树的树干长度,即OSPF路由器至每一个目的路由器的距离,成为OSPF的COST。COST值应用于每一个启动了OSPF的链路,它是一个16bit的正数,范围是1~65535。COST值越小,说明路径越好。OSPF选择路径是依靠整个链路COST值的总和。
COST值的计算方法是用108b/s(100Mb/s)链路带宽作为参考带宽,使用100Mb/s除以实际链路链路带宽,得出的结果取整(对于小于0的结果,取1),就是链路OSPF度量值。例如:串行链路带宽为1.544M,快速以太网带宽是100M,其COST为
串行链路OSPF COST = 100M/1.544≈ 64 (取整,不进行四舍五入)
2.1.6 OSPF路由计算过程
OSPF是基于链路状态算法的路由协议,所有对路由信息的描述都是封装在LSA中发送出去。LSA(Link StateAdvertisement)用来描述路由器的本地状态,LSA包括的信息是关于路由器接口的状态和所形成的邻接状态。
每台OSPF路由器都会收集其他路由器发来的LSA,所有的LSA放在一起便组成了链路状态数据库LSDB(Link State Database)。LSDB则是对整个自治系统的网络拓扑结构的描述。到达某个目的网段的最短路径,可通过这些信息计算出来。
如下图所示的网络中,由4台运行OSPF的路由器组成,连线旁边的数字表示从一台路由器到另一台路由器所需要的花费。为简化问题,我们假定两台路由器相互之间发送报文所需要的花费是相同的。
1.每台路由器都是根据自己周围的网络拓扑结构生成一条LSA(Link State Advertisement),并通过相互之间发送协议报文将这条LSA发送给网络中其它所有的路由器。这样每台路由器都收到了其它路由器的LSA,所有的LSA放在一起称作LSDB(链路状态数据库)。显然,4台路由器的LSDB都是相同的。
2.由于一条LSA是对一台路由器周围网络拓扑结构的描述,那么LSDB则是对整个网络的拓扑结构的描述。路由器很容易将LSDB转换成一张带权的有向图,这张图便是对整个网络拓扑结构的真实反映。显然,4台路由器得到的是一张完全相同的拓扑图。
3.接下来每台路由器在图中以自己为根节点,使用SPF算法计算出一棵最短路径树,由这棵树得到了网络中各个节点的路由表。
2.2 OSPF报文
2.2.1 基本结构
OSPF协议用IP报文直接进行封装,协议号为89
| 数据链路层头部 | IP报头部 | OSPF报头部| OSPF报数据 |
数据链路层头部:以太网协议(EthernetII)中源MAC地址是发送路由器接口MAC地址,目的MAC地址是0100.5E00.0005/6(组播MAC地址)。
IP包头部:协议号89,源IP为路由器接口IP,目的IP为224.0.0.5/6(组播IP地址,任何启用了组播协议的设备均可以接收,与广播方式性能有所提升)。通常OSPF的协议报文是被转发的,只能传递一跳,即TTL为1。
OSPF报头部:下面图中所示内容为截获的OSPF Hello完整报文。
Type:OSPF报文类型。数值从1到5,分别对应Hello、DD、LSR、LSU和LSAck报文。
Packet Length:OSPF报文的总长度(字节为单位),包括报文头在内。
Router ID:报文起源的ID。
Area ID:32位数字,标识报文所属的区域,所有的OSPF报文只属于单个区域,且只有一跳。当报文在虚连接上承载时,会打开骨干区域0.0.0.0的标签。
CheckSum:OSPF报文的校验,从OSPF报文头部开始,但是除了64位的认证字段。
AuType:认证类型,包括四种:0(无需认证)、1(明文认证)、2(密文认证)和其他类型(IANA保留)。当不需要认证时,只是通过CheckSum检验数据的完整性;当使用明文认证时,64位的认证字段被设置成为64位明文密码;当使用密文认证时,对于每一个OSPF报文,共享密钥都会产生一个“消息位”加在OSPF报文的后面,由于在网络上从来不以明文的方式发送密钥,所以提高了网络安全性。
Authentication:其数值根据验证类型而定。当验证类型为0时未作定义,为1时此字段为密码信息,类型为2时此字段包括KeyID、MD5验证数据长度和序列号的信息(MD5验证数据添加在OSPF报文后面,不包含在Authentication字段中国)。
2.2.2 HELLO报文
Hello Packet最常用的一种报文,周期性的发给本路由器的邻居,使用组播地址224.0.0.5。DR和BDR发送和接收报文使用的组播地址是224.0.0.6。
HELLO报文内容包括一些定时器的数值、DR、BDR以及自己的已知邻居信息。如图中所示,
HELLO INTERVAL:HELLO报文自动发送时间间隔,一般为10s。可以通过以下命令进行修改:
Router(config)# interface s 0/0
Router(config-if)# ip ospf hello-interval 5
ROUTER DEAD INTERVAL:HELLO报文死亡时间间隔。一般为HELLO INTERVAL的4倍。可以通过以下命令进行修改:
Router(config)# interface s 0/0
Router(config-if)# ip ospf dead-interval 5
RP:路由器优先级,默认为1,在选举DR(Designated Router)和DBR(Backup Designated Router)时候参考,优先级最高路由器被选为DR,次之为DBR。
DESIGNATED ROUTER:指定路由器IP地址。当OSPF链路被连接到多路访问的网络中时,需要选择一台指定路由器(DR),每台路由器(Others)都把拓扑变化发给DR和BDR,然后由DR负责通知给该多路访问网络中的其他路由器。这样就可以减少很多不必要的通信流量。
BACKUP DESIGNATED ROUTER:备份指定路由器IP地址。当DR发生故障的时候,BDR转变成DR就,接替DR工作。
NEIGHBOR COUNT:1。
NEIGHBOR:邻居路由器信息。
2.2.3 DD报文
DD报文(DataBase Description Packet),数据库描述报文,是发送端路由器对自己链路状态数据库的一个简短描述,接收端路由器根据接收的DD对比自己的链路状态数据库,检测发送端和接收端的链路状态数据库是否同步。此报文只在形成邻接关系的路由器间传递。
首先,它们之间互发DD(Database Description)报文,告之对方自己所拥有的路由信息,内容包括LSDB中每一条LSA的摘要(摘要是LSA HEAD,通过该HEAD可以唯一标识一条LSA)。
这样做是为了减少路由器之间的信息传递量,因为LSA的HEAD只占一条LSA的整个数据量的一小部分,根据HEAD,对端路由器就可以判断出是否已经有了这条LSA。
DD报文有两种:一种是空DD报文,用来确定Master/Slave关系(避免DD报文的无序发送)。确定Master/Slave关系后,才发送包含路由信息的报文。
收到含有路由信息的DD报文后,路由器比较自己的数据库,发现对方的数据库中有自己需要的数据,则向对方发送LSR(Link State Request)报文,请求对方给自己发送的数据。
2.2.4 LSR报文
Link StateRequest,链路状态请求报文。两台路由器相互交换DD报文后,知道对端路由有哪些LSA是本地LSDB所缺少的或是对端路由器更新的LSA,这时需要发送LSR报文向对方请求所需的LSA。内容包括所需的LSA的摘要。
3.2.5 LSU报文
Link StateUpdate,链路状态更新报文。用来向对端路由器发送所需要的LSA,内容是多条LSA(全部内容)的集合。
3.2.6 LSAck报文
Link StateAcknowledgment,链路状态应答报文。由于没有可靠的TCP协议,但是OSPF报文又要求可靠的传输,因此就有了LSAck报文的出现。它主要用来对接收到LSU报文进行确认。内容是需要确认的LSA的HEAD(一个报文可对多个LSA进行确认)。
DD、LSR和LSU报文发出后,在没有得到对方应有的LSR、LSU、LSAck报文会自动进行重发。同步后数据改变,则只向形成Adjacency关系的路由器发送LSU报文。
3.2.7 LSA头格式
LSA头部都是20字节,它包含了足够的信息来唯一标识一条LSA(LS type,Link State ID, andAdvertising Router)。LSA 头部还包括LS老化、LS序列号和LS校验和等字段。
LS age:用来标识LS产生的时间。生成LSA的路由器将LS时域初始化为0,在泛洪过程中,每经过一个路由器,要按InfTransDelay的量增加,这个量表示传输LSA到下一跳所需要的时间。当该时间达到所设定的MaxAge参数时,要撤销该LSA。
3.3 OSPF流程分析
3.2.1 邻居关系建立
Down:OSPF初始状态。还没有开始交换信息。
Init:交换信息初期。表示已经收到了邻居的Hello报文,但是报文中没有列出本路由的RID(Hello报文中NEIGHBOR字段),也就说对方还没有收到本路由发出的Hello报文。
Two-Way:双向阶段。双方都收到了对方的Hello报文,也就说在收到的报文中含有NEIGHBOR字段,并且为本路由的Router ID,此时建立了邻居关系。在多路访问的网络中,两个接口状态是DR Other的路由器之间将停留在此状态,其他情况将继续转入高级状态。在此状态下的路由器是不能共享路由信息的,想要共享路由信息,必须建立邻接关系(注意邻居关系和邻接关系的区别)。
Exstart:准备开始交换阶段。双方通过Hello报文决定主从关系,最高Router ID的路由将成为主路由,并最先发起交换。主从关系确立后进入下一个阶段。(提示:这个阶段也是DR和BDR选举阶段,主要是在多路访问的网路中,减少相互间建立邻接关系的通信流量,后面章节会详细介绍)。
Exchange:开始交换阶段。路由器将本地“路由状态数据库(LSDB)”用“数据库描述(DBD)”报文来描述,然后发给邻路由。如果这个阶段中的路由收到不在其数据库中有关链路的信息,那么在下一个阶段中将通过“链路状态请求(LSR)”报文,来请求对方发送该路由条目的完成信息。
Loading:加载阶段。路由器通过发送“链路状态请求(LSR)”报文,来向邻居请求一些路由条目的详细信息。邻居则会使用“链路状态更新(LSU)”报文来回复LSR请求,收到邻居返回的LSU后,再返回LSAck向发送LSU的路由进行确认。
FULL:完全邻接状态。Loading结束后,路由器之间就成了“Full Adjacency”状态。
3.2.2 DR和BDR选举
如图所示,在多路访问网络中,如果没有选举DR和BDR,为了交换路由信息,每台路由器都需要和其他路由建立邻接关系,就会有10个邻接关系,如果其中一台路由离开,要和所有的路由断开邻接关系,新的路由加入,也需要和所有的路由建立关系,这样在网络中就会产生大量的通信流量,网络的收敛速度也就很慢。
如果选举了DR和BDR,那么所有的DR Other路由器只需要和DR以及BDR建立邻接关系即可,DR Other之间的关系停留在Tow-Way状态即可。如果网络上有路由条目更新,DR Other只需要发送组播地址为224.0.0.6的组播报文(224.0.0.6是DR和BDR的组播地址),DR接收到这个更新后,再用224.0.0.5组播地址向其他的DR Other发送LSA。这样不仅可以加快网络收敛速度,也节约了网络带宽的占用。
在多路访问网络中需要选举DR和BDR,比如广播型多路访问的网络以太网、令牌环网、FDDI;非广播型多路访问的网络帧中继、X.25、SMDS。点对点或点对多点网络则不需要选举,比如PPP或HDLC封装的点对点线路。
DR和BDR选举规则:
1.OSPF路由器选择网络接口中优先级最高的路由器为DR,接口优先级次高的为BDR,以太网接口默认的优先级都为1;
2.如果优先级相同,将使用RID最高的为DR,次高的为BDR。
考虑到网络的稳定性,DR和DBR的选举并没有使用抢占机制,也就说DR和DBR一经确定就不会再变,即使新加入一台优先级更高的路由器,除非DR和DBR主动退出才会重新进行选举。假设网络中有3台路由器R1、R2和R3,默认优先级都为1,RID依次变大,三台路由器同时启动,因为优先级(RP)都为1,所以按照RID,R3选举为DR,R2选举为BDR,R1为DROther。如果此时R3 OSPF进程重新启动,相当于DR离开网络,此时R2接管失效DR升级为DR,R1升级为DBR,R3成为DBOther。如果此时R2也重启了OSPF进程,那么身为BDR的R1升级为DR,R3从DBOther升级为BDR,R2成为DBOther。