OSPF(Open Shortest Path First,开放式最短路径优先):是一种典型的链路状态路由协议,有用于IPv4网络的OSPFv2版本和用于IPv6的OSPFv3版本。OSPF协议基于IP运行,协议的数据报文直接采用IP封装,在IP报文头部中对应的协议号为89。
224.0.0.5:该组播地址包含所有的OSPF路由器。
224.0.0.6:该组播地址包含所有的OSPF DR路由器。
Router-ID(Router Identification,路由器标识):是一个32bit长度的数值,通常使用点分十进制的形式表现。用于在OSPF域中唯一地标识一台OSPF路由器。OSPF要求路由器的Router-ID必须全域唯一。
OSPF域:一系列连续的OSPF路由器组成的网络成为OSPF域,这些路由器采用相同的OSPF策略。
度量值:cost开销。cost值越小,路径越优。
OSPF的三张表:“邻居表”“链路状态数据库(Link-State Database,LSDB)”“OSPF路由表”
邻居表:在OSPF交互链路状态通告之前,两台直连路由器需建立OSPF邻居关系。当邻居关系建立后,邻居的信息会被写入路由器的OSPF邻居表中,随后一个邻接关系的建立过程也开始了。
链路状态数据库:运行链路状态路由协议的路由器在网络中泛洪链路状态信息,在OSPF中,这些信息被称为LSA(Link-State Advertisement)链路状态通告,路由器将网络中的LSA搜集后装载到自己的LSDB中,因此LSDB可以当做是路由器对网络的完整认知。
OSPF路由表:OSPF根据LSDB中的数据,运行SPF算法并且得到一棵以自己为根的、无环的最短路径树,基于这棵树,OSPF能够发现到达网络中各个网段的最佳路径,从而得到路由信息并将其加载到OSPF路由表中。
工作原理:
运行链路状态路由协议的路由器知晓整个网络的拓扑结构,这使得路由更加不易发生环路。运行链路状态路由协议的路由器之间首先会建立邻接关系,之后开始交换链路状态信息,而不是直接交互路由。
OSPF定义了5种报文:“Hello”“DD”“LSR”“LSU”“LSAck”
类型1:Hello报文,用于发现直连链路上的OSPF邻居,以及维护OSPF邻居关系。
类型2:DD(Database Description,数据库描述)报文,用于描述LSDB,该报文中携带的是LSDB中LSA的头部数据。
类型3:LSR(Link State Request,链路状态请求)报文,用于向OSPF邻居请求LSA。
类型4:LSU(Link State Update,链路状态更新)报文,用于发送LSA,该报文中携带的是完整的LSA数据,LSA承载在LSU中进行泛洪。
类型5:LSAck(Link State Acknowledgment,链路状态确认)报文,设备收到LSU后,LSAck用于对接收的LSA进行确认。
所有的OSPF报文都有统一的头部:包含“版本”“类型”“报文长度”“路由器ID”“区域ID”“校验和”“认证类型”“认证数据”
报文长度:整个OSPF报文的长度(字节数)。
检验和:用于检验报文有效性的字段。
认证类型:指示该报文使用的认证类型
认证数据:用于报文认证的内容。
Hello报文:包含“网络掩码”“Hello间隔”“可选项”“路由器优先级”“路由器失效时间”“指定路由器”“备份指定路由器”“邻居”
网络掩码:一旦路由器的某个接口激活了OSPF,该接口即开始发送Hello报文,该字段填充的是该接口的网络掩码。
Hello间隔:接口周期性发送Hello报文的时间间隔。广播网络和P2P网络中间隔为10S。非广播和P2MP网络中间隔为30S。
可选项:长8bit,每个比特位都用于指示该路由器的某个特定的OSPF特性。
路由器优先级:也叫DR优先级,该字段用于DR、BDR的选举。
路由器失效时间:在邻居路由器被视为无效前,需等待的时长。缺省为4倍Hello间隔。
指定路由器:网络中DR的接口IP地址。如果该字段为0.0.0.0,则表示没有DR,或者DR尚未选举出来。
备份指定路由器:网络中BDR的接口IP地址。如果该字段为0.0.0.0,则表示没有BDR,或者BDR尚未选举出来。
邻居:在直连链路上发现的有效邻居,该字段填充的是邻居的Router-ID,如果有多个邻居,则包含多个邻居字段。
DD报文:包含“接口最大传输单元”“可选项”“I位”“M位置”“MS位”“DD序列号”“LAS头部”
在两台路由器开始使用DD报文描述自己的LSDB之前,双方需要协商Master/Slave。Master/Slave的协商也是通过交互DD报文完成的(Router ID更大的路由器成为Master路由器),但是这种DD报文中并不包含任何LSA的头部信息,可以理解为空的DD报文。
接口最大传输单元:接口的MTU,该字段值为0。
I位:初始化位,当该DD报文用于协商Master/Slave路由时,该比特位被置1,选举完成后,该比特位被置0。
M位:该比特位如果为1,则表示后面还有更多的DD报文;如果被置0,则表示这是最后一个DD报文。
MS位:Mster路由器在自己发送的DD报文中将该比特位设置为1,Slave路由器则将其设置为0。
DD序列号:在DD报文交互的过程中,DD序列号被逐次加1,用于确保DD报文传输的有序和可靠性。
LSA头部:当路由器使用DD报文来描述自己的LSDB时,LSA的头部信息被包含在此处。一个DD报文可能包含一条或多条LSA头部。
LSR报文:包含“链路状态类型”“链路状态标识”“通告路由器”
链路状态类型:指示本条LSA的类型。OSPF定义了多种类型的LSA。
链路状态标识:LSA的标识。不同的LSA类型,对该字段的定义是不同的。
通告路由器:产生该LSA的路由器的Router ID。
LSU报文:路由器收到邻居发过来的LSR后,会以LSU报文进行回应,在LSU报文中就包含了对方请求的LSA的完整信息,一个LSU报文可以包含多个LSA。当路由器感知到网络发生变化时,也可以触发LSU报文的泛洪,以便将改变化通知给网络中的其他OSPF路由器。在多路访问网络中,非DR、BDR路由器向244.0.0.6这个组播地址发送LSU报文,而DR和BDR会侦听这个组播地址,DR在接收LSU报文后向244.0.0.5发送LSU报文,从而将更新信息泛洪到整个OSPF区域。
LSAck报文:为了确保LSA能够可靠送达,当一台路由器接收到邻居发送过来的LSU报文时,需要对报文中包含的LSA进行确认,这个确认行为可以是回复一个LSAck报文。LSAck报文包含着路由器确认的LSA头部(每个LSA头部长度为20byte)。
邻居关系和邻接关系:
两台路由器通过网线直连,在双方互联的接口上激活OSPF,路由器的接口激活OSPF后开始发送及侦听Hello报文,在通过Hello报文发现彼此并确认双向通信后,这两者便形成了邻居关系。
形成邻居关系后,两台路由器会开始交互空的DD报文协商Master/Slave,再交互包含LSA头部的DD报文以便描述自己的SLDB,然后通过LSR及LSU报文交互双方的LSA。当两者的LSDB同步完成后,两台路由器形成了对网络拓扑的一致认知,并开始独立计算路由。此时,这两台路由器形成了邻接关系。
OSPF邻居状态:包含“DOWN”“Init”“Attempt”“2-Way”“ExStart”“Exchange”“Loading”“Full”
DOWN(失效):OSPF邻居状态切换的初始状态。在该状态下,OSPF接口尚未收到邻居发送的Hello报文。
Init(初始):当OSPF路由器收到直连链路上某个邻居发送过来的有效Hello报文,但并未在Hello报文的“邻居”字段中看到自己的Router ID时,它会将该邻居为置为Init状态。
Attempt(尝试):该状态只在NBMA类型的接口中出现。
2-Way(双向通信):当OSPF路由器收到直连链路上某个邻居发送过来的有效Hello报文并且在该报文的“邻居”字段中发现自己的Router ID时,它会将邻居置为2-Way,表明它与邻居确认了双向通信。
ExStart(交换初始):路由器发送空的DD报文用来协商Master/Slave,Router-ID最大的路由器会成为Master路由器,DD序列号就是由Master路由器决定的。
Exchange(交换):路由器向邻居发送描述自己的LSDB的DD报文,DD报文中包含LSA的头部。DD报文逐个发送,每个报文中包含着DD序列号,DD序列号由Master路由器决定,序列号在DD报文的交互过程中被递增,以确保DD报文交互过程中的有序性和可靠性。
Loading(加载):路由器向邻居发送LSR以便请求LSA的完整的数据。对方使用LSU报文进行回应。在收到LSU报文后,路由器需发送LSAck对其中的LSA进行确认。
Full(全毗邻):当接口上待请求的LSA列表为空时,表明路由器已经完成了与邻居的LSDB同步,此时邻居的状态被置为Full。
网络类型:“P2P”“BMA”“NBMA”“P2MP”
点对点类型(Point-to-Point,P2P):指一段链路上只能连接两台路由器的环境。
广播型多路访问类型(Broadcast Multi-Access,BMA):BMA是一个支持广播的网路环境,该网络罗允许多台路由器接入,任意两台路由器之间都能直接进行二层通信,一台路由器发送出去的广播数据会被所有其他的路由器接收到。
非广播型多路访问类型(Non-Broadcast Multi-Access,NBMA):NBMA网络允许多台路由器将接入,但是该网路不具备广播能力。
点对多点类型(Point-to-Multipoint,P2MP):与前面几种网络不同,P2MP并非路由器根据接口的数据链路层封装自动设置的,而是必须通过网络管理员手工指定的。P2MP有点类似于将多条P2P链路的一端进行捆绑得到的网络。
DR及BDR概念:
我们把既不是DR也不是BDR的路由器成为DROther,MA网络中所有的DROther都只和DR以及BDR建立OSPF邻接关系,BDR也与DR建立邻接关系,而DROther之间只停留在2-Way状态。DR负责在网络中侦听拓扑变更的信息并将变更信息通知给其他路由器。DR、BDR的选举是通过Hello报文来实现的,选举过程发生在2-Way状态之后。路由器将自接口的优先级填写在Hello报文的“DR优先级”字段之中。DR与BDR的角色具有不可抢占性。DR及BDR是一个接口级别的概念,即“某台路由器的某个接口在这个MA网络中是DR”。
区域的概念:
为了确保OSPF域中每台路由器都能够正确的计算路由,便要求所有的路由器拥有相同的LSDB,从而达到对整个OSPF网络的一致认知。当OSPF域的规模越来越大时,域中路由器维护的LSDB将变得臃肿,也会消耗更多资源。因此引入区域的概念。
域和区域的概念类似于城市与其下属行政区的关系。我们把其切割成多个区域,同一个区域的路由器维护一套相同的LSDB。每个区域都有一个编号,不同编号表示不同区域,区域编号也被称为区域ID(Area-ID)。对于OSPF而言,骨干区域为Area 0,OSPF要求域中所有的非骨干区域(区域ID不为0的区域)都必须与Area0相连。这样可以避免环路发生。
OSPF设计了多种区域类型,以便于满足多种业务需求。
1.骨干区域(Backbone Area):骨干区域是Area0,是整个OSPF域的中心枢纽。一个OSPF域有且只能拥有一个Area0,所有的区域间路由必须通过Area0中转。
2.常规区域(Normal Area):所有的区域缺省情况下都是常规区域,Area0是常规区域中比较特殊的一个。
3.末梢区域(Stub Area):也称为Stub区域,该区域禁止Type-5 LSA进入(禁止外部路由被发布到该区域),通过这种方式可以减少区域内泛洪的LSA的数量,同时该区域的ABR自动下发一条使用Type-3 LSA描述的默认路由,是的区域内的路由器能够通过这条默认路由到达域外。Area0不能被配置为Stub Area。
3-1.完全末梢区域(Totally Stub Area):在Stub区域的基础上进一步阻挡描述区域间路由的Type-3 LSA进入该区域。这个特殊区域内将只有Type-1 LSA、Type-2 LSA以及描述默认路由的Type-3 LSA存在。路由器的路由表被极大程度的精简。
4.非完全末梢区域(Not-So-Stubby Area):也称为NSSA区域,可以理解为Stub区域的变种,它拥有Stub区域的特点,同时允许引入少量外部路由进入OSPF。被引入的外部路由用Type-7 LSA描述,并且这些Type-7 LSA只能在NSSA区域内泛洪,不允许直接进入Area0.为了使这些被引入NSSA区域的外部路由能让OSPF域内其他区域学习到,NSSA的ABR会将Type-7 LSA转换成Type-5 LSA然后注入Area0,从而泛洪整个OSPF域。
4-1.完全非完全末梢区域(Totally NSSA):在NSSA的基础上进一步阻挡描述区域间路由的Type-3 LSA进入该区域。同时该区域的ABR自动下发一条使用Type-3 LSA描述的默认路由,通过这条默认路由访问OSPF域内其他区域以及域外的网络。
OSPF路由器的角色:包含“内部路由器”“区域边界路由器”“骨干路由器”“AS边界路由器”
内部路由器(Internal Router,IR):所有接口都接入同一个OSPF区域的路由器。
区域边界路由器(Area Border Router,ABR):接入多个区域的路由器。ABR必须至少有一个接口在Area0中激活,同时还有其他接口在其他区域激活。ABR负责在区域之间传递路由信息。
骨干路由器(Backbone Router,BR):所有接口都接入Area0的路由器。
AS边界路由器(AS Boundary Router,ASBR):工作在OSPF自治系统(Autonomous System,AS)边界的路由器。负责将OSPF域外的路由引入本域,使外部路由在整个OSPF域中传递。
常见的LSA类型:包含“Type-1 LSA”“Type-2 LSA”“Type-3 LSA”“Type-4 LSA”“Type-5 LSA”“Type-7 LSA”
Type-1 LSA即路由器LSA(Router LSA):每台路由器都会产生的LSA,描述了该路由器所有OSPF直连接口的状况和cost值,该LSA只能在接口所属区域内泛洪。
Type-2 LSA即网络LSA(Netowrk LSA):由DR产生,描述该DR所接入的MA网络中所有与之形成邻接关系的路由器,其中包括DR自身,该LSA只能在接口所属区域内泛洪。
Type-3 LSA即网络汇总LSA(Network Summary LSA):由ABR产生,描述了到达某个区域的目标网段的路由。该类LSA主要用于区域间路由传递。
Type-4 LSA即ASBR汇总LSA(ASBR Summary LSA):由ABR产生,用于描述ASBR。ASBR汇总LSA相当于一条到达ASBR的“主机路由”。
Type-5 LSA即AS外部LSA(AS External LSA):由ASBR产生用于描述AS之外的外部路由。
Type-7 LSA即非完全末梢区域LSA(NSSA LSA):由ASBR产生,用于描述本AS之外的外部路由。NSSA LSA仅仅在产生这个LSA的NSSA内泛洪,不能直接进入骨干区域。NSSA的ABR会将Type-7 LSA转换成Type-5 LSA注入到骨干区域。
LSA拥有相同的头部:包含“链路状态老化时间”“可选项”“链路状态类型”“链路状态ID”“通告路由器”“链路状态序列号”“链路状态校验和”“长度”共20byte。
链路状态老化时间(Link-State Age):指示该条LSA的老化时间,为16bit的整数。当一条LSA被始发路由器产生时,老化计时器开始计时,当老化时间增加到MaxAge时,该LSA将不再被用于路由计算。
可选项(Options):共8bit,每一个比特位都对应了OSPF所支持的某种特性。
链路状态类型(Link-State Type):指示本条LSA的类型。
链路状态ID(Link-State ID):LSA的标识。不同的LSA类型,对于该字段的定义是不同的。
通告路由器(Advertising Router):产生该LSA的路由器的Router-ID。
链路状态序列号(Link-State Sequence Number):该LSA的序列号,该字段用于判断LSA的新旧或是否存在重复。
链路状态校验和(Link-State Checksum):校验和。
长度(Length):LSA的总字节长度。
每个LSA头部中的“链路状态类型”“链路状态ID”“通告路由器”这三个字段唯一的标识了一个LSA。“链路状态老化时间”“链路状态序列号”“链路状态校验和”这三个字段可以判断实例的新旧。
Type-1 LSA:LSA头部中的“链路状态类型”字段值为1,“链路状态ID”字段的值是产生这个LSA的路由器的Router-ID。包含“V位”“E位”“B位”“链路数量”“链路类型”“链路ID”“链路数据”“度量值”字段。
V位(Virtual Link Endpoint Bit):如果该比特位被设置为1,则表示该路由器为Virtual Link的端点。
E位(External Bit):如果E比特位被设置为1,则表示该路由器为ASBR。
B位(Border Bit):如果B比特位被设置为1,则表示该路由器为两个区域的边界路由器。
链路数量(Links Number):该LSA所描述的Link(链路)的数量。每条链路都包含“链路类型”“链路ID”“链路数据”“度量值”这几个关键信息。
链路类型(Link Type):本条Link的类型值,该值与Link的类型相关。注意,OSPF的网络类型与链路类型是不同的概念。
链路ID(Link ID):Link的标识,不同的链路类型,对链路ID值得定义是不同的。
链路数据(Link Data):不同的链路类型对链路数据的定义是不同的。
度量值(Metric):Cost值。
各种链路类型及其描述:
类型1:点对点连接到另一台路由器;“链路ID”:邻居的Router-ID;“链路数据”:产生该LSA的路由器的接口IP地址。
类型2:连接到一个传输网络;“链路ID”:DR的接口IP地址;“链路数据”:产生该LSA的路由器的接口IP地址。
类型3:连接到一个末梢网络;“链路ID”:网络IP地址;“链路数据”:网络掩码。
类型4:虚链路;“链路ID”邻居的Router-ID;“链路数据”:产生该LSA的路由器的接口IP地址。
Type-2 LSA:LSA头部中的“链路状态类型”字段值为2,“链路状态ID”字段的值为产生这个LSA的DR的接口IP地址。包含“网络掩码”“相连的路由器的Router-ID”两个字段。
网络掩码(Network Mask):该MA网络的网络掩码。
相连的路由器(Attached Router)的Router-ID:连接到该MA网络的路由器的Router-ID,如果有多台路由器接入该MA网络,则使用多个字段描述。
Type-3 LSA:LSA头部中的“链路状态类型”字段值为3,“链路状态ID”字段的值为区域间路由的目的网络地址。包含“网络掩码”“度量值”两个字段。
网路掩码(Network Mask):区域间路由的目的网络掩码。
度量值(Metric):路由的Cost。
Type-4 LSA:LSA头部中的“链路状态类型”字段值为4,“链路状态ID”字段的值是ASBR的Router-ID。格式与Type-3 LSA完全一致。“网络掩码”字段值为全0,“度量值”字段填写的是该ABR自己到达ASBR的Cost值。
Type-5 LSA:LSA头部中的“链路状态类型”字段值为5,“链路状态ID”字段的值是外部路由的目的网络地址。包含“网路掩码”“E位”“度量值”“转发地址”“外部路由标记”字段。
网络掩码(Network Mask):外部路由的目的网络掩码。
E位:用于标识该外部路由使用的度量值类型。分别是Metric-Type-1和Metric-Type-2。
度量值(Metric):该外部路由的Cost。
转发地址(Forwarding Address,FA):当FA为0.0.0.0时,则到达该外部网段的流量会被发往引入这条外部路由的ASBR。而如果FA不为0.0.0.0,则流量被被发往这个转发地址。
外部路由标记(External Route Tag):这是一个只有外部路由才能携带的标记,常被用于不熟路由策略。
Type-7 LSA:LSA头部中的“链路状态类型”字段值为7,“链路状态ID”字段的值是外部路由的目的网络地址。与Type-5 LSA完全一致。只能在NSSA区域内泛洪,并且不能进入Area0。是一种特殊的LSA。
判断LSA的新旧:
OSPF以1800s为周期对LSA进行泛洪。采用更长的泛洪周期,可以避免网络中的OSPF流量过大,以免造成不必要的带宽消耗。另一方面,当网络拓扑发生变更时,OSPF也会执行LSA的触发更新,以便网络更快速地收敛。
OSPF使用“链路状态序列号”“老化时间”和“校验和”来判断一个LSA的新旧,过程如下:
1.拥有更高链路状态序列号的LSA实例被认为更新,因为路由器每次在刷新LSA的时候,会将LSA的链路状态序列号加1,链路状态序列号越大,则LSA越新。
2.如果LSA实例的链路状态序列号相同,那么拥有更大校验和的LSA实例被认为更新。
3.如果LSA实例的链路状态序列号和校验和都相同,且某个实例的老化时间被设置为MaxAge,则该实例被认为更新。
4.如果LSA实例的链路状态序列号和校验和都相同,且没有任何一个实例的老化时间被设置为MaxAge,那么当两个实例的老化时间相差超过MaxAgeDiff时,这两个实例被认为不同实例,且老化时间值越小的LSA被认为越新。
5.如果LSA实例的链路状态序列号和校验和都相同,且没有任何一个实例的老化时间被设置为MaxAge,并且两个实例的老化时间相差不,超过MaxAgeDiff时,则认为是相同的实例。
MaxAgeDiff是OSPF的一个常量,它描述的是一个LSA实例从其始发设备出发,直至被泛洪到整个AS边界所需的最长时间。默认为15min。
OSPF协议的特性:
路由汇总
Virtual Link虚链路
默认路由
报文认证
转发地址
OSPF防环机制:
1.OSPF要求所有的非骨干区域都必须与Area0直接相连,区域间路由需经由Area0中转。
2.ABR从非骨干区域收到的Type-3 LSA不能用于区域间路由的计算。
3.ABR只能将自己到达所连接区域的区域内部路由注入到骨干区域(区域间路由则不被允许),另外,可以将其到达所连接区域的区域内部路由及到达其他区域的区域间路由注入非骨干区域。
4.ABR不会将描述到达某个区域内网段路由的Type-3 LSA再注入回该区域。
5.Type-3 LSA还设计了Down-Bit(一个特殊比特位),用于在MPLS VPN环境下进行路由防环。
OSPF路由类型及优先级:顺序从上至下
1.区域内路由(Intra Area Route):指路由器根据区域内泛洪的Type-1 LSA和Type-2 LSA计算得到的路由。
2.区域间路由(Inter Area Route):指路由器根据Type-3 LSA计算得到的路由。
3.Type1外部路由(Metric-Type-1 External Router):类型为1的外部路由。
4.Type2外部路由(Metric-Type-2 External Router):类型为2的外部路由。