如果本文对你有帮助,欢迎关注、讨论、点赞、收藏、转发给朋友,让我有持续创作的动力,让我们一起相互学习共同进步 原创弗克斯网络技术平台 大家好,我是小弗。上篇《图解OSPF》,只是描述了协议的完整过程,并解释了文中出现的专用名词,看完能对OSPF有一个全流程的了解。OSPF的专用名词也比较多,这次索性把常见的名词整理出来,以供大家(也包括我自己)学习和参考。按照惯例,先来一张全景图,一眼就能看完文章的主要内容,方便阅读和查找。 RouterID RouterID用于标识OSPF路由器,是一个32位的数值,跟IPv4地址格式一样,比如:192。168。100。1。连续的OSPF路由器组成的网络叫做OSPF域,域内RouterID必须唯一,也就是在同一个域内不允许出现两台相同RouterID的路由器。RouterID可以手动设置,也可以自动生成,常见的做法是把设备的RouterID指定为设备的Loopback接口的IP地址。 Loopback接口 Loopback接口也就是本地回环接口,是一种软件的、逻辑的接口,不只网络设备支持Loopback接口,Windows主机或Linux主机也支持。根据业务需求,在网络设备上创建Loopback接口,并配置IP地址。Loopback接口非常稳定,除非手动进行关闭或删除,否则是永远不会失效的。正因如此,Loopback接口常用于设备网管、网络测试、网络协议应用等。 OSPF三张表 OSPF使用三种表格确保能正常运行。邻居表(PeerTable) 在OSPF交互LSA之前,两台直连路由器需要建立OSPF邻居关系。当一个接口激活OSPF后,就会周期性地发送OSPFHello报文,同时侦听Hello报文从而发现直连链路上的邻居。在接口上发现邻居后,邻居的信息会写入路由器的OSPF邻居表,随后一个邻接关系的建立过程也开始了。 链路状态数据库(LinkStateDatabase,LSDB) OSPF路由器在网络中泛洪的链路状态信息,叫做LSA(LinkStateAdvertisement,链路状态通告)。路由器搜集LSA并添加到自己的LSDB中,路由器通过LSDB获取网络的完整信息。OSPF定义了多种类型的LSA,这些LSA各有用途,最终目的是让路由器知道网络的拓扑结构以及网段信息,并计算出最短路径数,从而发现到达全网各个网段的路由。 OSPF路由表(RoutingTable) OSPF根据LSDB中的数据,运行SPF算法,得到一棵以自己为根、无环的最短路径树,基于这棵树,OSPF能够发现到达网络中各个网段的最佳路径,从而得到路由信息,并添加到OSPF路由表中。当然,这些OSPF路由表中的路由最终是否被添加到全局路由器,还需要经过比较路由优先级等过程。 度量值 每种路由协议对度量值的定义是不同的,OSPF使用Cost(开销)作为路由度量值,Cost值越小,则路径(路由)越优。每一个激活OSPF的接口都有一个接口的Cost值,值等于100接口带宽Mbits,计算结果取整数部分,当结果小于1时,值取1。这个值也可以人为修改,修改值会直接影响Cost值得计算,从而影响网络中OSPF路由的选择。 报文类型及格式 OSPF协议的报文直接使用IP封装,在IP报文头部对应的协议号是89。通常OSPF的协议报文使用组播地址作为目的IP地址,有两个主播IP地址是OSPF专用。 224。0。0。5:这个组播IP地址是指所有的OSPF路由器。 224。0。0。6:这个组播IP地址是指所有的OSPFDR路由器。 OSPF一共定义了五种报文,各有各的用途。 路由器的接口一旦激活OSPF,就会开始发送Hello报文。Hello报文的一个重要功能就是发现直连链路上的OSPF邻居。发现邻居后,就开始邻里关系的建立。这个过程中,DD报文用于发送LSA的头部摘要。通过DD报文的交互,路由器知道了对方所有的LSA,而LSR向对方请求完整的LSA。LSU对LSR进行回应,或者主动更新LSA,LSU包含完整的LSA数据。LSAck保证OSPF更新机制的可靠性。此外,Hello报文负责OSPF邻居关系的维护,两台直连路由器形成邻接关系后,双方仍然周期性的发送Hello报文,告知对方自己是在线状态。 所有OSPF报文是相同的头部,这个头部的长度是24字节。 版本(Version):OSPFv2的值为2。类型(Type):表示OSPF报文的类型。值与报文类型对应关系是:1Hello;2DD;3LSR;4LSU;5LSAck。报文长度(PacketLength):整个OSPF报文的长度,单位是字节。路由器ID(RouterIdentification):路由器的OSPFRouterID。区域ID(AreaIdentification):表示所属的区域ID,是一个4字节的数值。校验和(Checksum):用来校验报文有效性。认证类型(AuthenticationType):表示报文使用的认证类型。认证数据(AuthenticationData):用于报文认证的内容。Hello报文 Hello报文用于发现直连链路上的邻居,以及维护邻居关系。Hello报文携带邻居关系建立的各项参数,建立邻居关系的过程中,会检查这些参数,只有参数匹配,才能正确建立邻居关系。 网络掩码(NetworkMask):这个字段表示接口的网络掩码。如果两台路由器是通过以太网接口连接,那么直连的两个接口必须配置相同的网络掩码。如果收到的Hello报文中网络掩码字段与自己接口的不同,就忽略这个Hello报文,不会建立邻居关系。Hello间隔(HelloInterval):接口周期性发送Hello报文的时间间隔,单位是秒。两台路由器要建立邻居关系,需要接口的HelloInterval相同,否则邻居关系无法建立。默认情况下,OSPF路由器在P2P或Broadcast类型的接口上,Hello间隔是10秒,在NBMA及P2MP类型的接口上,Hello间隔是30秒。选项(Options):这个字段一共8比特,每个比特位都表示路由器的某个特性。路由器通过设置相应的Options比特位来通告自己支持某种特性或拥有某种能力。路由器优先级(RouterPriority):路由器优先级,也叫做DR优先级,用于DR和BDR的选举。默认情况下,OSPF接口的DR优先级是1,这个值也可以通过命令进行修改。路由器失效时间(RouterDeadInterval):路由器等待对方发送Hello报文的时间,超过这个时间就认为是路由器已离线。路由器建立邻居关系,也需要双方接口的RouterDeadInterval相同。默认情况下,RouterDeadInterval是HelloInterval的4倍。指定路由器(DesignatedRouter):网络中DR的接口IP地址。如果值为0。0。0。0,表示没有DR,或DR还未选举出来。备份指定路由器(BackupDesignatedRouter):网络中BDR的接口IP地址。如果值为0。0。0。0,表示没有BDR,或BDR还未选举出来。邻居(Neighbor):表示邻居的RouterID,是在直连链路上发现的有效邻居,如果发现多个邻居,就包含多个邻居字段。DD报文 DD报文用于描述LSDB,这个报文携带的是LSDB中LSA的头部数据,并非完整的LSA内容。互为邻居的路由器使用空的DD报文来协商主从(MasterSlave),空的DD报文不包含任何LSA头部信息。RouterID更大的路由器成为Master路由器。 MasterSlave确定后,双方开始使用DD报文描述各自的LSDB,这时的DD报文包含LSDB里的LSA头部信息。路由器可以使用多个DD报文来描述LSDB,为了确保DD报文传输的有序和可靠,Master路由器使用DDSequenceNumber(DD序列号)字段主导整个LSDB交互过程。比如:Master路由器发送一个DD序列号是100的DD报文给Slave路由器,Slave收到这个报文后,才发送自己的DD报文,而DD序列号也使用100。Master路由器发送下一个DD报文(DD序列号是101),Slave路由器才会发送DD报文。这个过程一直持续,直到LSDB同步完成。 接口最大传输单元(InterfaceMaximumTransmissionUnit):接口的MTU。默认情况下,接口发送的DD报文中,无论接口实际的MTU值是多少,值都为0。选项(Options):路由器支持的OSPF可选项。I位(InitialBit):初始化位,协商MasterSlave路由器时,值为1,MasterSlave选举完成后,值为0。M位(MoreBit):如果值为1,表示后续还有DD报文;如果值为0,表示这是最后一个DD报文。MS位(MasterBit):Master路由器发送的DD报文中,值为1,Slave路由器则值为0。DD序列号(DDSequenceNumber):DD报文的序列号,在DD报文交互过程中,逐次加1,确保传输的有序和可靠。DD序列号必须由Master路由器决定,而Slave路由器只能使用Master路由器发送的DD序列号来发送自己的DD报文。LSA头部(LSAHeader):当路由器使用DD报文描述自己的LSDB时,LSA头部信息就在这里。一个DD报文可能包含一条或多条LSA头部信息。LSR报文 在与OSPF邻居交换DD报文后,路由器就知道了邻居的LSDB摘要,向邻居发送LSR报文请求所需LSA的完整数据。LSR报文的链路状态类型(LinkStateType)、链路状态ID(LinkStateID)、通告路由器(AdvertisingRouter)三个字段表示路由器请求的LSA。如果请求多个LSA,那么LSR可能包含多个三元组。 链路状态类型(LinkStateType):表示LSA类型。OSPF有多种LSA类型,每种LSA描述OSPF网络的某个部分,使用不同的类型编号。常见的LSA类型值和LSA名称是:1RouterLSA,2NetworkLSA,3NetworkSummaryLSA,4ASBRSummaryLSA,5ASExternalLSA。链路状态标识(LinkStateID):LSA的标识。不同的LSA类型,字段的定义不同。通告路由器(AdvertisingRouter):生成这条LSA的路由器的RouterID。LSU报文 路由器收到邻居发送的LSR后,会使用LSU报文进行回应,在LSU报文中包含请求LSA的完整信息,一个LSU报文可以包含多个LSA。另外,当路由器感知到网络发生变化时,也会触发LSU报文的泛洪,及时把网络变化通告给其它路由器。在BMA网络中,非DR、BDR路由器向组播地址224。0。0。6发送LSU报文,而DR和BDR会侦听这个组播地址,DR在接收LSU报文后向224。0。0。5发送LSU报文,从而将更新信息泛洪到整个OSPF区域,所有的OSPF路由器都会侦听224。0。0。5这个组播地址。 LSAck报文 当一台路由器收到邻居发送的LSU报文时,为了确认LSA已经送达,需要对报文中的LSA进行确认,就是回复一个LSAck报文。LSAck报文包含路由器确认的LSA头部信息。 邻接关系 OSPF有两个概念:邻居关系和邻接关系。假如两台路由器通过网线直连,在双方互联的接口上激活OSPF,路由器接口开始发送和侦听Hello报文,通过Hello报文发现彼此,并确认双向通信后,就形成了邻居关系。 之后,两台路由器会开始交互空的DD报文协商MasterSlave,再交互包含LSA头部信息的DD报文,以便同步自己的LSDB,然后通过LSR和LSU报文交互双方的LSA。当两者的LSDB同步完成后,两台路由器形成对网络拓扑的一致认知,并开始独立计算路由。这时,两台路由器形成了邻接关系。 网络类型 OSPF的许多功能或特性都是基于接口实现的,当一个接口激活OSPF后,这个接口会维护很多OSPF变量,比如:接入的区域ID、接口Cost值、DR优先级、邻居列表、认证类型等,其中接口的网络类型(NetworkType)是非常重要的一个变量。OSPF接口的网络类型跟接口的数据链路层封装有关,在不同网络类型的接口上,OSPF的操作有所不同。1、点对点类型(PointtoPoint,P2P) P2P网络是在一条链路上只能连接两台路由器的环境。典型的例子就是PPP链路,当两台路由器通过PPP链路直连时,接口的封装协议就是PPP,接口激活OSPF后,网络类型就是P2P。OSPF在P2P网络类型中,接口以组播方式发送协议报文,组播地址是224。0。0。5,报文类型包括Hello报文、DD报文、LSR报文、LSU报文和LSAck报文。默认情况下,P2P类型接口的Hello报文发送间隔是10秒。P2P类型的网络中,不会选举DR和BDR。 2、广播型多路访问类型(BroadcastMultiAccess,BMA) BMA网络中可以多台路由器接入,任意两台路由器之间都能进行二层通信,一台路由器发送出去的广播数据,其它所有路由器都能收到,是一个支持广播的网络环境。以太网就是典型的BMA网络。当多台路由器接入到BMA网络时,比如多台路由器连接在同一台二层交换机上,这些路由器的接口激活OSPF就会开始发送组播的Hello报文,从而发现网络中的其它路由器。BMA网络中,会选举DR和BDR,所有非DR、BDR路由器仅与DR和BDR建立邻接关系。 OSPF在BMA网络中,接口以组播方式发送Hello报文、LSU报文以及LSAck报文,单播方式发送DD报文及LSR报文。当路由器需要向DR和BDR发送OSPF报文时,使用224。0。0。6这个组播地址作为目的IP地址;当需要向所有的OSPF路由器发送报文时,使用224。0。0。5。默认情况下,广播类型接口的Hello报文发送间隔是10秒。3、非广播型多路访问类型(NonBroadcastMultiAccess,NBMA) NBMA网络也允许多台路由器接入,但是不具备广播能力,这时组播发送的Hello报文在NBMA网络中可能会有问题。为了让OSPF路由器之间能够顺利发现彼此,并正确建立邻接关系,还需要手动配置,比如使用单播方式发送OSPF报文等。帧中继、X。25就是NBMA网络,不过现在已经几乎看不到这类型网络了。NBMA网络中,也会进行DR和BDR选举。默认情况下,NBMA类型接口的Hello报文发送间隔是30秒。4、点对多点类型(PointtoMultipoint,P2MP) P2MP网络中,路由器接口的数据链路层封装不会自动设置,必须手动指定。P2MP类似将多条P2P链路的一头进行捆绑的网络。在P2MP网络中无需选举DR、BDR。OSPF在P2MP类型的接口上以组播方式发送Hello报文,以单播方式发送其它报文。默认情况下,Hello报文发送间隔是30秒。 了解了这么多的网络类型,即使两个路由器的直连接口的网络类型不同,也能建立OSPF邻接关系,但是OSPF路由计算容易出现问题,因为网络类型会影响LSA对接口的描述,关系到路由器对网络拓扑的理解和路由计算。因此,OSPF邻接的路由器,互联接口的网络类型必须一致。 即使在以太网中只有两台路由器,OSPF也会选举DR和BDR,实际上没必要且浪费时间,因为从逻辑上看是点对点的连接,选举DR和BDR实在是画蛇添足。因此,为了提高OSPF的效率,加快邻接关系的建立过程,可以把互联接口的网络类型修改为P2P。 DR和BDR 多路访问(MA)网络是指在同一个共享介质中连接着多个设备的网络,在这个网络中,任意两台设备之间都能够进行二层通信。MA网络有两种:一种是BMA网络,另一种是NBMA网络。典型的BMA网络是一台交换机连接多台路由器,如果有一个广播数据发出来,那么整个网络中的路由器都会收到。 在MA网络中,n台路由器都两两建立邻接关系,那么就有n(n1)2个邻接关系,会消耗大量的路由器资源,增加网络中LSA的泛洪数量。为了优化邻接关系数量,减少不必要的协议流量,OSPF会在每一个MA网络中选举一个DR(指定路由器)和一个BDR(备用指定路由器)。 既不是DR也不是BDR的路由器叫做DROther,MA网络中所有DROther只和DR及BDR建立OSPF邻接关系,BDR也和DR建立邻接关系,DROther之间只停留在2Way状态。这样,只有2(n2)1个邻接关系,数量得到优化。 DR在LSDB同步方面有关键性的作用,会侦听网络中的拓扑变化信息,并将变更信息通知给其它路由器。DR会生成一种Type2LSA,这个LSA包含个MA网络中所有OSPF路由器的RouterID,也包括DR自己的。BDR会监控DR状态,当DR发生故障时就接替它的工作。 DR、BDR的选举通过Hello报文实现,发生在2Way状态之后。Hello报文有路由器接口的DR优先级,取值范围是0255,默认值为1,DR优先级为0的接口没有DR和BDR的选举资格。当接口激活OSPF后,它会查看网络中是否存在DR,如果有就使用已经存在的DR,也就是DR不可抢占,否则选择最高优先级的路由器成为DR,当优先级相等时,选择RouterID最大的路由器成为DR。之后还会进行BDR的选举,选举过程与DR类似。 需要注意的是,DR和BDR是一个接口级别的概念。某台路由器是DR,这种说法不准确,严谨的说法是:某台路由器的某个接口在这个MA网络中是DR。在一个MA网络中,DR确保接入到网络中的所有OSPF路由器拥有相同的LSDB,也就是确保这些LSDB的同步。DR使用组播地址224。0。0。5向网络中发送LSU报文,所有的OSPF路由器会侦听这个目的地址,并与DR同步LSDB。而DROther感知到拓扑变化时,向224。0。0。6发送LSU报文通告这个变化,DR和BDR会侦听这个组播地址。 区域和多区域 连续的OSPF路由器组成的网络叫做OSPF域(Domain),为了保证每台路由器都能正常的计算路由,就要求域内所有的路由器同步LSDB,才能达到对整个OSPF网络的一致认知。当网络规模越来越大时,每台路由器维护的LSDB变得臃肿,计算庞大的LSDB需要消耗更多的设备资源,加重设备的负担。另外,网络拓扑的变化,引起所有域内的路由器重新计算,而域内路由无法进行汇总,每台路由器需要维护的路由表也越来越大,又是一个不能忽略的资源消耗。 因此,OSPF引入了区域(Area)的概念。在一个大规模的网络中,会把OSPF域分成多个区域。某些LSA的泛洪只在单个区域内部,同一个区域内的路由器维护一套相同的LSDB,对区域内的网络有一致的认知。每个区域独立进行SPF计算,区域内的拓扑结构对区域外是不可见的,而且区域内部的拓扑变化通知被限制在区域内,避免对区域外部造成影响。如果一台路由器的多个接口分别接入多个不同的区域,那么它会为每个区域分别维护一套LSDB。多区域的设计极大程度的限制了LSA的泛洪,有效的把拓扑变化的影响控制在区域内,另外在区域边界路由器上可以进行路由汇总,减少网络中的路由条目数量。 OSPF的每一个区域都由一个编号,不同的编号表示不同的区域,这个区域编号也叫做区域ID(AreaID)。区域ID是一个32位二进制数,与IPv4地址的格式一样,比如Area0。0。0。1,为了方便起见,也会用十进制数表示,Area0。0。0。1简化成Area1,Area0。0。0。255简化成Area255,Area0。0。1。0简化成Area256。 一个OSPF域中,允许存在多个区域,其中有一个中心区域,也就是骨干区域Area0(或Area0。0。0。0)。OSPF要求域内的所有非骨干区域(区域ID不是0的区域)必须与Area0相连。如果一个域内有多个区域,那么有且只有一个Area0,Area0负责在区域之间发布区域间的路由。因此,所有的ABR(AreaBorderRouter,区域边界路由器)至少有一个接口属于Area0,所以Area0包含所有的ABR。有点类似星型结构,骨干区域在中间,每个非骨干区域是分支。 任何一个非骨干区域都必须与Area0相连,当网络中某个区域没有与Area0相连时,这个区域的路由计算就会出问题。OSPF的区域间路由都由Area0中转,任何两个非骨干区域之间是不能直接交互路由的。 解决方法是修改OSPF的网络设计,与Area0直接相连。如果不能改或改动成本大等问题,可以考虑使用OSPF虚链路(VirtualLink)。VirtualLink是一种逻辑的链路,不是一条真实的链路。通过搭建一条VirtualLink,可以把原来没有与骨干区域直连的区域给连接起来。 另一个可能的问题是,骨干区域不连续或被分隔开。非骨干区域交互区域路由时,容易引发路由环路。因此,OSPF要求ABR只能将自己直连的区域内部路由通告给Area0,而不能将自己到达其它区域的域间路由通告给Area0。另外,ABR可以将自己直连区域的内部路由和到达其它区域的域间路由通告给非骨干区域。这样就能规避网络规划不合理导致的路由环路。解决问题最好的办法是修改OSPF的规划,当然建立VirtualLink也可以临时解决这个问题。 实际部署中,VirtualLink并不是一种常规的技术,而是一种临时方案,合理的OSPF网络规划依然是一个最佳的选择。OSPF路由器角色 在OSPF中,有多种路由器角色,在OSPF网络中都发挥着不同的作用。实际上,OSPF不仅在路由器上使用,许多交换机、防火墙,甚至Linux主机都能实现。这里说的OSPF路由器,实际上是以路由器为代表。 内部路由器(InternalRouter,IR):所有接口都在同一个OSPF区域内的路由器。图中R1、R4、R5是IR。区域边界路由器(AreaBorderRouter,ABR):接入多个区域的路由器,并非所有接入多个区域的路由器都是ABR。它至少有一个接口在Area0中,同时还有其它接口在其它区域中。ABR负责在区域之间传递路由信息,因此必须连接到Area0,同时连接着其它区域。图中R2、R3是ABR。骨干路由器(BackboneRouter,BR):至少有一个接口接入Area0的路由器,那它就是一台骨干路由器,另外ABR也是骨干路由器。图中R1、R2、R3、R6是BR。AS边界路由器(ASBoundaryRouter,ASBR):工作在OSPF自治系统(AutonomousSystem,AS)边界的路由器。ASBR将OSPF域外的路由引入到本域,外部路由在整个OSPF域内传递。并不是同时运行多种路由协议的路由器就一定是ASBR,ASBR一定是将外部路由重分发到OSPF,或者执行了路由重分发操作的路由器。图中R6是ASBR。结束语