OSPF基本.docx
《OSPF基本.docx》由会员分享,可在线阅读,更多相关《OSPF基本.docx(28页珍藏版)》请在冰点文库上搜索。
OSPF基本
【概念】:
自治系统(AutonomousSystem)在相同的路由协议下的一组交换路由信息的路由器的称呼,缩写为AS。
路由器ID(RouterID)运行OSPF协议的路由器的一个32位的标识符。
在自治系统内这个值唯一标识一个路由器。
多路访问网络(Multi-accessnetworks)这些物理网络支持连接到多个路由器(超过两个),连接在一块的每对路由都可以支持通信(不含多点网络)。
邻居路由器(Neighboringrouters)两个路由器的接口在同一个网络内。
在多路访问网络中,邻居路由是通过Hello协议动态发现的。
邻接(Adjacency)对邻居关系的提升,在邻接关系上路由器之间将进行链路状态数据库的同步。
并不是每对邻居的路由器都可以成为邻接。
链路状态通告(Linkstateadvertisement)提交的本地网络或路由器的状态,包含路由器的接口及邻接的状态。
每个连接状态公告将传播到整个路由范围内。
从所有路由器和网络得到的连接状态公告形成协议的拓朴数据库。
Hello协议(Helloprotocol)是OSPF协议的一部分,用来建立和管理主要的邻近关系。
在多路访问网络中,Hello协议可动态地发现邻近路由器。
链路状态扩散(Flooding)在OSPF路由器之间同步和分布链路状态数据库的过程
指定路由器(DesignatedRouter)在多路访问网络中存在至少两个路由器时,其中有一个是指定路由器。
指定路由器负责在多路访问网络中生成描述本网络的连接状态公告的特殊责任,它与所有本网段的OSPF路由器邻接。
指定路由器由Hello协议选出,指定路由器的概述可在多路访问网络中减少邻接请求的数量,同时也就减少了大量的路由协议传递和拓朴数据库的尺寸。
【正文】:
链路状态路由协议OSPF基于SPF(Dijkstra的ShortestPathFirst)算法进行路由计算,较之距离矢量路由协议的优点有收敛速度快,可以运行于大型网络,不易受错误路由信息的影响等。
另外通过区域的划分,可以将路由状态信息的交换和路由计算分布到各个区域中,从而减少了协议信息的交互量,减少了运行协议的CPU及内存使用量;支持变长子网掩码,有效的管理IP地址;可实现等路径开销下的负载分担;支持认证。
OSPF的运行过程可以概括为以下几个方面:
1.运行OSPF协议的路由器通过其使能了OSPF协议的接口向外发送Hello报文。
共享相同链路的两个路由器如果就特定的OSPF参数达成一致后便建立了邻居关系;
2.通过在邻居之间建立邻接关系,OSPF邻居实现状态信息的交互和数据库的同步,邻接关系的建立决定于不同的网络类型和路由器类型以及Hello报文的交互方式;
3.OSPF定义了多种LinkStateAdvertisement(LSA),它用于在建立了邻接关系的路由器之间相互通告各自的链路状态信息,当接收到邻居发来的LSA后路由器进行记录并向其它有邻接关系的邻居进行转发;
4.通过向整个区域传播链路状态信息LSA,所有路由器将建立描述区域内链路状态的统一的数据库;
5.完成链路状态信息的交互后,所有路由器将利用SPF算法计算以自己为根的最短路径树,并根据SPF树计算出自己的路由表。
下面就以下问题进行说明,主要是有关OSPF的一些基本内容:
邻居和邻接、域(AREA)、链路状态数据库(LinkStateDatabase)、路由表、OSPF报文格式
邻居和邻接
【Hello报文】
在OSPF路由器之间进行交互之前首先要在他们之间建立邻居关系,这通过Hello报文的交互实现。
一个单独的OSPF路由器可能会有很多邻居,由于在OSPF数据库同步和链路状态维护的过程中将会有协议报文以及LSAs的传播,为了减少用于协议运行的网络流量,路由器只和所有邻居之中的个别路由器建立一种邻接关系,而数据库同步和链路状态维护的协议报文也只在邻接关系上发生。
因此OSPF运行的第一步就是发现邻居。
像其它很多协议一样OSPF定义了自己的Hello报文。
Hello携带重要参数在相邻的路由器之间进行信息的交互,用以发现和维护邻居关系,确认路由器之间的双向通信,通过它在广播和非广播多路访问的网络上OSPF选举指定路由器DesignatedRouter(DRs)和备份的指定路由器BackupDesignatedRouter(BDRs)。
DR即是要和所有邻居建立邻接关系的那个路由器,BDR是作为其备份的,同样要和其邻居邻接。
路由器从使能了OSPF的接口以一定的时间间隔发送Hello报文,这一间隔体现为一个可以设置的参数HelloInterval,以接口为单位进行设置,港湾交换机的实现符合Cisco的标准为10秒。
另外如果路由器在一定的时间间隔(RouterDeadInterval)内没有收到邻居发来的Hello报文,则可以宣称邻居已经死掉了,这一时间一般为4倍的HelloInterval。
Hello报文包含以下信息:
。
发送Hello报文的RouterID
。
发出报文的接口所在的AreaID
。
发出报文的接口的网络地址掩码
。
接口认证模式以及认证信息
。
接口的HelloInterval
。
接口的RouterDeadInterval
。
路由器的优先级
。
DR和BDR
。
5位的标志位,标识路由器的可选功能
。
路由器所有邻居的RouterID。
这包括了所有在上一个RouterDeadInterval时间内收到了其Hello报文的路由器的标识
当路由器从邻居那里收到了Hello报文,它将对AreaID、Authentication、NetworkMask、HelloInterval、RouterDeadInterval以及选项标志位等参数进行校验,若与接收接口相关参数一致,则可以建立紧居关系并有可能进行更进一步的操作;如果校验失败则报文被丢弃,不会建立邻居和邻接关系。
由于路由器在发送Hello报文时总是把在链路上所有的邻居都列在其中,因此当路由器接收到一个有效的Hello报文后,若发现在对方列举的邻居中自己也榜上有名的话则说明在他和对方之间已经建立起了双向的通信,这是进一步建立邻接关系的基础。
另外连接两台路由器的网络类型决定了邻接关系的建立和OSPF报文的发送。
【网络类型】
OSPF定义了五种网络类型:
1.点到点网络
2.广播网络
3.非广播多路访问网络(NBMA)
4.点到多点网络
5.虚链路
点到点网络上的两台路由器总是会建立邻接关系,其OSPF报文的目的地址也始终为
D类多播保留地址224.0.0.5,被称之为AllSPFRouters。
广播网络中可能会有很多路由器成为邻居,在这些路由器之间将选出DR和BDR。
DR和BDR以多播地址224.0.0.5为目的地址发送协议报文,目的MAC为01005e000005。
所有其它的路由器在发送LinkStateUpdate报文和LinkStateAcknowledgment报文时使用多播地址224.0.0.6,这被成为AllDRouters,目的MAC为01005e000006。
NBMA网络也可以接入多个路由器,但是没有广播的能力,在这样的网络上同样要选出DR和BDR,且所有报文都是单播的。
点到多点网络是一种特殊的配置,在这里没有DR和BDR,协议报文是多播的。
虚链路是类似点到点的网络类型,后面会提到,它是为了连接某个非0域与0域所配置的链路,或者为了防止0域由于某种原因被分割而在0域的ABR上之间配置的冗余链路。
所有5种网络类型又可以归结为两种更为基本的类型:
通过型(Transit):
包含两个以上的路由器,可承载穿过网络的流量,即既不是本网内产生的也不是以本网内设备为目的地的数据流量;
Stub型:
仅包含唯一的路由器,数据均源于本网且以本网为目的。
OSPF将主机路由作为Stub型的网络进行通告,环回接口也被认为是Stub网络并以主机路由的方式通告。
【DR和BDR】
如前所述为了尽可能的减少路由器之间协议报文的交互,邻居之间只有DR和BDR和所有邻居建立邻接关系,这已足够完成链路状态信息在整个网络中的扩散而无需形成全网状的邻接关系,显然那将很占用资源而且是没有必要的。
前面也曾提到DR和BDR只在多路访问的广播网络和非广播多路访问的网络上存在。
DR的职责在于:
。
对外(互联的所有网络)代表多路访问网络以及网络所连接的所有路由器,这表现在它要产生并发布代表网络的NetworkLSAs;
。
掌管多路访问网络上的扩散(Flooding)进程。
只有DR负责向互联的网络的其它部分通告LSAs。
而且DR的概念是和接口相联系的
并不是整个路由器的属性。
这说明一台路由器在某个接口上可能是接口所连接网络上的DR,但在其它接口所连接的网络上则不一定。
另外当DR失效后引发的一个问题是要选出新的DR,并且要重新建立所有的邻接关系,在这个过程中网络的通信要中断。
为了解决这一问题,在选出DR的同时还要选出BDR作为其备份,在BDR和所有其它邻居之间也要建立邻接关系,DR和BDR之间也不例外,这样在DR失效后,BDR很快就能成为DR,而且邻接关系早已建立,这样就缩短了网络失效的时间。
DR和BDR的选举过程:
(以一台路由器A上的选举过程为例)
1.当邻居之间建立了双向(2-way)的通信后,路由器A在收到的所有邻居的Hello报文中检查其中的参数:
Priority、DR、BDR。
找出所有符合选举条件的路由器(RouterPriority必须大于0,而且邻居状态至少是2-way);若路由器本身也符合条件则也在候选之列;
2.找出所有没有宣称自己是DR的路由器(自身接口地址没有出现在Hello报文的DR字段的路由器)归为一个集合;
3.如果在上面的集合中有宣称自己是BDR的路由器(自身接口地址出现在Hello报文的BDR字段的路由器),则优先级大的被选为BDR,若优先级相同则RouterID大者选为BDR;
4.若集合中没有路由器宣称自己为BDR,最大优先级者或最大RouterID者选为BDR;
5.在所有宣称自己是DR的路由器中选出优先级最大者或RouterID最大者为DR;
6.若没有路由器宣称自己是DR则新选出的BDR成为DR;
7.若路由器A在选举后成为DR或BDR,或者A不再是DR或BDR则重复步骤2-6。
需要注意的是RouterPriority在选举中起到决定作用,但是当网络中已经存在DR或BDR
的情况下,大优先级的路由器也不能强占他们的位置。
当DR和BDR被选出后网络上所有其它的路由器DRothers将和他俩儿建立邻接关系,所有路由器继续通过多播地址AllSPFRouters224.0.0.5发送Hello报文以维护邻居关系,DRothers将通过AllDRouters多播地址224.0.0.6通告LinkStateUpdates报文,只有DR和BDR会倾听此地址;同时DR也利用224.0.0.5来向DRothers扩散Updates包文。
还有两种情况:
网络中只有一台符合选举条件的路由器,那么网络中将只有DR而没有BDR,所有DRothers和DR邻接;网络中没有符合选举条件的路由器,则网络中没有DR和BDR也没有邻接关系,所有路由器之间保持2-way状态。
【OSPF接口及其数据结构】
链路状态协议所关心的是链路及链路的状态,而路由器是通过接口来描述链路的。
对于使能OSPF的接口,将建立相应的数据结构,包括以下一些内容:
IP地址和掩码
接口所配置的IP地址和相应的网络掩码,协议报文将以此为源IP;
AreaID
接口及接口所连接网络所属的区域标识,这将作为它发送协议报文所使用AreaID字段的值;
RouterID
NetworkType
路由器接口所连接网络的类型,包含上述5种网络;
Cost
数据从接口发出时的路径开销;
InfTransDelay
当LSAs从接口发出时的传输时延,LSAs的age将增加的相等的值;
State
接口所处的状态
RouterPriority
8比特无符号整数,范围从0到255,用于DR和BDR的选举;
DesignatedRouter
接口所连接网络上的DR的RouterID,以及DR的接口IP;
BackupDesignatedRouter
接口所连接网络上的BDR的RouterID以及Bdr的接口IP;
HelloInterval
Hello报文的发送间隔;
RouterDeadInterval
宣布邻居死掉的最大时延,一般为4被的HelloInterval;
WaitTimer
当路由器首次加入网络时将在此时间内等待从DR和BDR发来的Hello报文,以便
设置DR和BDR参数。
此时间间隔和RouterDeadInterval相同;
RxmtInterval
路由器在发出OSPF报文后若在此时间段内没有收到确认报文则进行重发;
HelloTimer
发送Hello报文的定时器;
NeighboringRouters
所有有效的邻居的列表;
AuType
认证类型,有不认证、简单密码及加密(MD)等类型;
AuthenticationKey
简单密码和MD类型所使用的密码,64bit;
【接口状态机】
OSPF接口在完全运转之前要经过一系列的状态:
Down
Down状态为初始状态,在这个状态下接口的所有参数设置为初始值,接口上没有任何协议数据的交互;
Loopback
在这个状态下接口处于环回状态,可以是硬件环回或软件环回,在此状态下接口通过RouterLSAs以主机路由的方式被通告出去,目的地址是接口IP。
Waiting
在等待状态的路由器正试图通过检查接收到的Hello报文发现网络上已经存在的DR和BDR,只有当路由器跳出该状态后才能够参加DR和BDR的选举。
Point-to-Point
接口处于此状态说明接口连接的是点到点网络或者虚链路,路由器试图和邻居建立邻接关系。
DROther
路由器接口连接的是广播网络或NBMA,并且网络上已经有了DR但不是路由器本身,而且路由器也没有被选举为BDR,路由器将和DR和BDR建立邻接关系。
Backup
路由器在接口所连接的网络上是BDR,并随时准备在DR死掉后充当DR,它将和所有其它路由器建立邻接关系。
DR
路由器在接口所连接的网络上是DR,并与其它所有路由器邻接,并产生为网络产生NetworkLSA,其中包含所有连接到该网络的接口链路信息。
下面的图反映了接口状态在事件驱动下的转换过程:
【OSPF邻居及其数据结构】
前面已经提到,路由器通过Hello报文的交互建立邻居关系,进而建立邻接关系并进行链路状态数据库的同步和维护。
具体概括为第一步发现邻居;第二步建立双向的通信;第三步进行数据库同步,这个过程包含DDP(DatabaseDescriptionpacket)报文的交互,用于交换两个邻接路由器的数据库概括信息,随后根据信息交换的情况各取所需,发送链路状态请求(LinkStateRequest)并接收更新报文(LinkStateUpdate)然后在收到更新报文后进行确认(Acknowledgement),另外在DDP报文交互的过程开始阶段将在两台路由器之间选出Master和Slave,由Master来控制整个同步过程来确保同步的正确性;第四步建立完全的邻接关系。
因此路由器将建立邻居的相关数据结构,用以实时的描述邻居的状态,并在适当的时候进行适当的操作。
下面先介绍有关数据结构:
State
邻居的状态,共8种后面具体介绍;
InactivityTimer
该定时器用于检测邻居是否在RouterDeadInterval内没有发送Hello报文;
Master/Slave
当试图建立邻接关系的路由器进行数据库同步时,他们将建立Master/Slave关系,Master发送第一个DDP报文,并且控制整个DDP交互过程,也只有Master可以进行DDP重传;
DDSequenceNumber
目前发送的DDP报文顺序号;
LastreceivedDatabaseDescriptionPacket
其中记录了最后收到的邻居发来的DDP报文的I、M、MS比特,选项字段,DDP顺序号,用以区分不同的DDP报文,防止重复报文的接收;
NeighborID
邻居路由器的RouterID
NeighborPriority
邻居路由器的优先级,由接收到的Hello报文中得到;
NeighborIPAddress
这里是邻居的接口IP
NeighborOptions
邻居可以提供的OSPF选项功能,可以通过Hello报文得到或者在数据库交换过程中学习到;
Neighbor’sDesignatedRouter
Neighbor所认为的DR;
Neighbor’sBackupDesignatedRouter
Neighbor所认为的BDR;
LinkStateRetransmissionList
所有已通过该邻接关系进行Flooding但还没有得到确认的LSA,这些LSA将在一定时间间隔后在没有收到确认的情况下重传,或者在邻接关系不存在后删除;
DatabaseSummaryList
本地LinkStateDatabase的所有LSA的摘要信息列表,将在DatabaseExchange状态下发送给邻居;
LinkStateRequestList
为了同步两台路由器之间的链路状态数据库,需要向邻居请求的所有LSA的列表,这些LSA已存在于邻居的链路状态数据库中,但是在本地是没有的。
这个列表是在接收到邻居发来的DDP报文后通过比照本地数据库而建立的,并通过LinkStateRequest报文发给邻居,并在收到相应的LinkStateUpdate报文后进行删除。
【OSPF邻居状态机】
OSPF定义了邻居的8种状态,在完全邻接之前路由器将根据事件机制使本地的邻居状态机遍历这些状态,并执行相关操作,最终完成完全邻接的建立。
下面是邻居的8种状态:
Down
还没有收到任何来自邻居的OSPF协议信息,邻居处在初始状态;
Attempt
只在NBMA网络有此状态,路由器将发送Hello报文并试图联络到邻居;
Init
表明已经在RouterDeadInterval时间内收到了邻居发来的Hello报文,但是和邻居之间的双向通信还没有建立起来。
处于此状态的所有邻居将被列在Hello报文的邻居字段中发出;
2-way
两台交换机已经通过Hello报文的交互建立了双向的连接,BDR已经可以在此时进行选举了;
ExStart
这个状态是建立邻接关系的第一步,在这一步决定邻接关系中谁作为Master,并且来协商DDP报文的初始顺序号,邻居之间处于ExStart或更高状态即被称为邻接;
Exchange
路由器将通过DDP报文摘要性的描述其整个LinkStateDatabase并发送给邻居,每个DDP报文有顺序号,需要进行直接确认,确认后下一个DDP才能发送。
同时在这个状态还可以发送LinkStateRequest请求邻居的LSA。
Loading
路由器向邻居发送LinkStateRequest报文请求其最新的LSA;
Full
完全邻接关系已经建立,并且可以在RouterLSA和NetworkLSA中体现出来;
下图显示了邻居状态在时间驱动下的迁移过程:
【OSPF邻接关系的建立】
在5种网络类型中,点到点,点到多点和虚链路网络上的邻居之间总是要建立邻接关系的,在广播和非广播多路访问的网络上,邻接关系只在DR、BDR与DRother之间建立,所有DRother路由器之间不建立邻接关系。
在邻接关系建立的过程中使用三种报文:
1.DatabaseDescriptionPackets(Type2)
2.LinkStateRequestPackets(Type3)
3.LinkStateUpdatePackets(Type4)
DDP报文的交互是两台交换机互相通告自己链路状态数据库摘要信息的过程,DDP报文中并不携带完整的LSA,而只是足以区分每个LSA的LSA头部,另外在DDP报文中的标志位很重要:
1.I比特位,初始化比特,发送第一个DDP报文时设置;
2.M比特位,设置后表明这不是最后一个DDP报文;
3.MS比特位,设置后表明该DDP报文是有Master发出来的;
当两台路由器处在ExStart状态开始协商主从关系时,都会发送MS位置1的DDP报文,同时发送自己的顺序号,之后RouterID小的路由器会变为Slave并回应一条DDP报文,MS位置0且顺序号与Master的顺序号一致,并且携带了LSA头,这也是第一个带有摘要信息的DDP报。
当以上的协商过程完成后,邻居状态变为Exchange。
在Exchange状态中,邻居互发DDP通告自己的链路状态数据库信息,如果路由器看到对方有本地没有的LSA或着本地虽然有但是对方的LSA更新一些,那么路由器会将这些LSA放到自己的LinkStateRequestList中,随后发送LinkStateRequest报文请求这些LSA的完整版。
对方会回以LinkStateUpdate报文,其中包含了被请求的LSA,当收到这些回复后相应的LinkStateRequestList中的LSA会被删除。
每个在LinkStateUpdate报文中的LSA必须被单独确认,因此这些被通过LinkStateUpdate报文传送的LSA都会被放到LinkStateRetransmissionList中,在收到确认后不再重传并从LinkStateRetransmissionList中删除。
LSA的确认方式有显式和隐式两种,收到LinkStateAcknowledgement数据报属显式确认;收到LinkStateUpdate报文中包含准备发送的LSA,而且这两个LSA新旧程度相同。
整个Exchange过程中由Master来控制同步过程,保证每次的DDP发送和确认,当Slave收到Master发来的DDP报文会回以相同顺序号的DDP报文作为确认,若Master在接口的RxmtInterval时间间隔内没有收到确认则重传该DDP报文;Slave的行为只是不停的回应Master,如果发来的DDP报文包含新的顺序号,则Slave发送新的DDP报文并包含相同的顺序号,若收到的顺序号是原来的值,则重传DDP进行确认。
在整个DDP交互过程中,只要Master和Slave有一方发送的DDP报文中的M位不为0,交互过程就一直要继续,这保证双发都能将自己数据库的完整信息发给对方。
当Master发送了M位为0的DDP报文,且此时Slave也没有可发的DDP报时,Slave发M位为0的DDP报文进行回应,Master收到这个报文后就知道同步已经结束了。
由于在DDP报文交互的过程中可以同时进行LinkStateRequest和LinkStateUpdate的交互,因此在同步结束后可能出现两种情况:
1.LinkStateRequestList中有条目,则邻居状态变为Loading,继续进行LSA的请求和更新;
2.LinkStateRequestList中已空,