OSPF动态路由协议笔记之(二) : 基本工作原理(下)
OSPF动态路由协议笔记之(二) : 基本原理(下)
本笔记承接上一节,继续对OSPF报文的报文头部和报文类型进行详尽的介绍,接着介绍OSPF建立邻接关系的过程(即LSDB同步的过程),最后补充上一节笔记中提及的DR和BDR选举的过程。
OSPF报文类型及作用
(1)OSPF协议报文头部
RIP路由器之间是基于UDP 520的报文进行通信,OSPF也有其规定的通信标准。OSPF使用IP承载其报文,IP报文头部协议号为89。
在OSPF Packet部分,所有的OSPF报文均使用相同的OSPF报文头部。报文头部各字段含义如下:
① Version(1个字节):版本。对于当前所使用的OSPFv2,该字段的值为2。
② Type(1个字节):类型。OSPF报文类型。其值分别代表以下几种报文类型:
l 1:Hello报文;
l 2:DD报文;
l 3:LSR报文;
l 4:LSU报文;
l 5:LSAck报文。
③ Packet length(2个字节):数据包长度。表示整个OSPF报文的长度,单位是字节。
④ Router ID(4个字节):发送该报文的路由器标识。表示生成此报文的路由器的Router ID。
⑤ Area ID(4个字节):发送该报文的所属区域。表示此报文需要被通告到的区域。
⑥ Checksum(2个字节):校验和。用于校验报文的完整性,其校验的范围是整个OSPF报文,包括OSPF报文头部。
⑦ Auth Type(2个字节):验证类型。
为0时表示不认证;为1时表示简单的明文密码认证;为2时表示加密(MD5)认证。
⑧ Authentication(8个字节):鉴定字段。认证所需的信息,该字段的内容随AuType(验证类型)的值不同而不同。
当验证类型为0时未作定义;类型为1时此字段为密码信息;类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息,MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。
(2)OSPF报文类型
OSPF的报文头部定义了OSPF路由器之间的通信的标准与规则,基于这个标准OSPF报文需要实现什么功能呢?
Type=1为Hello报文,用来建立和维护邻居关系,邻居关系建立之前,路由器之间需要进行参数协商。
Type=2为数据库描述报文(DD),用来向邻居路由器描述本地链路状态数据库,使得邻居路由器识别出数据库中的LSA是否完整。
Type=3为链路状态请求报文(LSR),路由器根据邻居的DD报文,判断本地数据库是否完整,如不完整,路由器把这些LSA记录进链路状态请求列表中,然后发送一个LSR给邻居路由器。
Type=4为链路状态更新报文(LSU),用于响应邻居路由器发来的LSR,根据LSR中的请求列表,发送对应LSA给邻居路由器,真正实现LSA的泛洪与同步。
Type=5为链路状态确认报文(LSAck),用来对收到的LSA进行确认,保证同步过程的可靠性。
DD、LSR、LSU、LSAck与LSA的关系:
DD报文中包含LSA头部信息,包括LS Type、LS ID、Advertising Router 、LS Sequence Number、LS Checksum。
LSR中包含LS Type 、LS ID和Advertising Router 。
LSU中包含完整的LSA信息。
LSAck中包含LSA头部信息,包括LS Type、LS ID、Advertising Router、LS Sequence Number、LS Checksum。
五种报文可以高效地完成LSA的同步,那么实际的报文交互过程是什么呢?
(3)OSPF报文功能需求
Hello机制动态发现并维护邻居前文已介绍,不再赘述。
RIP设置了Request和Response两种报文来完成路由信息的同步,OSPF路由器之间为了完成LSA的同步,可以直接把本地所有LSA发给邻居路由器,但是邻居路由器直接同步LSA并不是最好的方式。
更快速、更高效的方式是先在邻居路由器之间传送关键信息,路由器基于这些关键信息识别出哪些LSA是没有的、哪些是需要更新的,然后向邻居路由器请求详细的LSA内容。对于OSPF来说,需要有比RIP更高效、更可靠的方式来完成路由器之间的信息同步。
OSPF建立邻接关系
OSPF协议主要分为建立邻居关系和邻接关系两个步骤。在上一节笔记中,已经介绍了OSPF在两台路由器中进行完两次Hello报文交互之后,建立邻居关系的过程,其中经历从Down状态到2-way状态的过程。接下来将会继续介绍建立邻接关系的详细过程。
建立邻接关系,指在两台路由器中进行完链路状态数据库(LSDB)同步之后,建立起来的最终状态。其中经历了从ExStart状态到Full状态的过程,最终同步显示的状态是Full。
建立邻接关系的状态含义:
Ⅰ ExStart:邻居状态变成此状态以后,路由器开始向邻居发送DD报文。Master/Slave关系是在此状态下形成的,初始DD序列号也是在此状态下确定的。在此状态下发送的DD报文不包含链路状态描述。
Ⅱ Exchange:在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文
Ⅲ Loading:在此状态下,路由器与邻居之间相互发送LSR报文、LSU报文、LSAck报文。
Ⅳ Full:LSDB同步过程完成,路由器与邻居之间形成了完全的邻接关系。
LSDB同步过程如下:
Step 1:RTA和RTB的Router ID分别为1.1.1.1和2.2.2.2并且二者已建立了邻居关系,两者的状态均为2-way状态。当RTA的邻居状态变为ExStart后,RTA会发送第一个DD报文。
此报文中,DD序列号(Seq)被随机设置为X,I-bit设置为1,表示这是第一个DD报文,M-bit设置为1,表示后续还有DD报文要发送,MS-bit设置为1,表示RTA宣告自己为Master(主)。
Step 2:当RTB的邻居状态变为ExStart后,RTB会发送第一个DD报文。收到该DD报文后,RTA会产生一个Negotiation-Done事件,并将邻居状态从ExStart变为Exchange。
此报文中,DD序列号(Seq)被随机设置为Y(I-bit=1,M-bit=1,MS-bit=1,含义同上)。由于RTB的Router ID较大,所以RTB将成为真正的Master(主)。
Step 3:当RTA的邻居状态变为Exchange后,RTA会发送一个新的DD报文,此报文中包含了LSDB的摘要信息,收到此DD报文后,RTB会产生一个Negotiation-Done事件,并将邻居状态从ExStart变为Exchange。
此报文中,DD序列号(Seq)设置为RTB在步骤2中使用的序列号Y,I-bit=0,表示这不是第一个DD报文,M-bit=0,表示这是最后一个包含LSDB摘要信息的DD报文,MS-bit=0,表示RTA宣告自己为Slave(从)。
Step 4:当RTB的邻居状态变为Exchange后,RTB会发送一个新的DD报文,此报文包含了LSDB的摘要信息。
此报文中,DD序列号(Seq)设置为Y+1, MS-bit=1,表示RTB宣告自己为Master(主)。
Step 5:虽然RTA不需要发送新的包含LSDB摘要信息的DD报文,但是作为Slave,RTA需要对Master发送的每一个DD报文进行确认。所以,RTA向RTB发送一个新的DD报文。发送完此报文后,RTA产生一个Exchange-Done事件,将邻居状态变为Loading。
此报文中,DD序列号(Seq)设置为Y+1,该报文内容为空。
Step 6:RTB收到此报文后,假设在RTB的LSDB是最新最全的,不需要向RTA请求更新的情况下,会直接将邻居状态变为Full。
LSDB同步过程
当RTA作为Slave(从),当发现从Master(主)路由器发过来的DD报文中,包含了本地LSDB不存在的链路状态信息摘要,那么RTA需要向RTB请求更新。此时过程又是如何呢?
Step 1:RTA开始向RTB发送LSR(Link State Request)报文,请求那些在Exchange状态下通过DD报文发现的、并且在本地LSDB中没有的链路状态信息。
Step 2:RTB向RTA发送LSU(Link State Update)报文,LSU报文中包含了那些被请求的链路状态的详细信息。RTA在完成LSU报文的接收之后,会将邻居状态从Loading变为Full。
Step 3:RTA向RTB发送LSAck(Link State Acknowledge)报文,作为对LSU报文的确认。RTB收到LSAck报文后,双方便建立起了完全的邻接关系。
OSPF邻居状态机
从建立邻居关系到同步LSDB的过程较为复杂,错误的配置或设备链路故障都会导致无法完成LSDB同步。为了快速排障,最关键的是要理解不同状态之间切换的触发原因。
这是形成邻居关系的过程和相关邻居状态的变换过程。
① Down:这是邻居的初始状态,表示没有从邻居收到任何信息。在NBMA网络上,此状态下仍然可以向静态配置的邻居发送Hello报文,发送间隔为PollInterval,通常和Router DeadInterval间隔相同。
② Attempt:此状态只在NBMA网络上存在,表示没有收到邻居的任何信息,但是已经周期性的向邻居发送报文,发送间隔为HelloInterval。如果Router DeadInterval间隔内未收到邻居的Hello报文,则转为Down状态。
③ Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。在此状态下的邻居要被包含在自己所发送的Hello报文的邻居列表中。
④ 2-Way Received:此事件表示路由器发现与邻居的双向通信已经开始(发现自己在邻居发送的Hello报文的邻居列表中)。Init状态下产生此事件之后,如果需要和邻居建立邻接关系则进入ExStart状态,开始数据库同步过程,如果不能与邻居建立邻接关系则进入2-Way。
⑤ 2-Way:在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建立邻接关系以前的最高级状态。
⑥ 1-Way Received:此事件表示路由器发现自己没有在邻居发送Hello报文的邻居列表中,通常是由于对端邻居重启造成的。
⑦ ExStart:这是形成邻接关系的第一个步骤,邻居状态变成此状态以后,路由器开始向邻居发送DD报文。主从关系是在此状态下形成的;初始DD序列号是在此状态下决定的。在此状态下发送的DD报文不包含链路状态描述。
⑧ Exchange:此状态下路由器相互发送包含链路状态信息摘要的DD报文,描述本地LSDB的内容。
⑨ Loading:相互发送LS Request报文请求LSA,发送LS Update通告LSA。
⑩ Full:两台路由器的LSDB已经同步。
LSA(链路状态信息通告)头部
LSA(Link State Advertisement)是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位,也就是说LSDB由一条条LSA构成的。
所有的LSA都拥有相同的头部,关键字段的含义如下:
① LS age(2个字节):此字段表示LSA已经生存的时间,单位是秒。
② LS type(1个字节):此字段标识了LSA的格式和功能。常用的LSA类型有五种。
③ Link State ID(4个字节):此字段是该LSA所描述的那部分链路的标识,例如Router ID等。
④ Advertising Router(4个字节):此字段是产生此LSA的路由器的Router ID。
⑤ LS sequence number(4个字节):此字段用于检测旧的和重复的LSA。
LS type,Link State ID和Advertising Router的组合共同标识一条LSA。
LSDB中除了自己生成的LSA,另一部分是从邻居路由器接收的。邻居路由器之间相互更新LSA必然需要一个“通道”。
DR与BDR的选举及作用
在运行OSPF的MA网络包括广播型和NBMA网络,会存在两个问题:
① 在一个有n个路由器的网络,会形成(n×(n−1))/2 个邻接关系。管理复杂。
② 邻居间LSA的泛洪扩散混乱,相同的LSA会被复制多份。如RTA向其邻居RTB、RTC、RTD分别发送一份自己的LSA,同样其他路由器也会分别向网络内所有邻居发送一份LSA。重复的LSA泛洪,造成资源浪费。
这样的工作效率显然是很低的,消耗资源的。最为高级的路由协议,OSPF是怎样解决这些问题的呢?
(1)DR和BDR的作用
DR(Designated Router)即指定路由器,其负责在MA网络建立和维护邻接关系并负责LSA的同步。
DR与其他所有路由器形成邻接关系并交换链路状态信息,其他路由器之间不直接交换链路状态信息。这样就大大减少了MA网络中的邻接关系数量及交换链路状态信息消耗的资源。
DR一旦出现故障,其与其他路由器之间的邻接关系将全部失效,链路状态数据库也无法同步。此时就需要重新选举DR,再与非DR路由器建立邻接关系,完成LSA的同步。为了规避单点故障风险,通过选举备份指定路由器BDR(Backup Designated Router),在DR失效时快速接管DR的工作。
伪节点是一个虚拟设备节点,其功能需要某台路由器来承载,下面将介绍DR/BDR的选举规则。
(2)DR和BDR的选举
选举规则:DR/BDR的选举是基于接口的。
Step 1:接口的DR优先级越大越优先。
Step 2:接口的DR优先级相等时,Router ID越大越优先。
Tips:DRother不参与选举,可通过命令进行指定路由器为DRother。
1、下列哪些选项属于OSPF报文类型?
A)Hello
B)Database Description
C)Link State Request
D)Link State DD
E)Link State Advertisement
答:ABC
2、OSPF的网络类型包括( )?
答:P2P,P2MP,NBMA,BMA