OSPF 路由协议与邻接关系
1 ospf 基础:
OSPF路由器根据在AS 中的不同位置,可以分为以下四类:
1. 区域内路由器(Internal Routers) 该类路由器的所有接口都属于同一个OSPF 区域。
2. 区域边界路由器ABR(Area Border Routers) 该类路由器可以同时属于两个以上的区域,但其中一个必须是骨干区域。ABR 用来连接骨干区域和非骨干区域,它与骨干区域之间既可以是物理连接,也可以是逻辑上的连接。
3. 骨干路由器(Backbone Routers) 该类路由器至少有一个接口属于骨干区域。因此,所有的ABR 和位于Area0 的内部路由器都是骨干路由器。
4. 自治系统边界路由器ASBR(AS Boundary Routers) 与其他AS 交换路由信息的路由器称为ASBR。ASBR 并不一定位于AS 的边界,它可能是区域内路由器,也可能是ABR。只要一台OSPF 路由器引入了外部路由的信息,它就成为ASBR。
2ospf的邻接关系与邻居关系
OSPF链路类型:
· 有3种:点到点,广播型,NBMA p2mp。在3种链路类型上扩展出5种网络类型:点到点,广播,NBMA,点到多点,虚链路。其中虚链路较为特殊,不针对具体链路,而NBMA链路对应NBMA和点到多点两种网络类型。
点到点网络:即Point-to-point(P2P)型网络,是指该接口通过点到点的方式与一台路由器相连。此类型网络不需要进行OSPF的DR、BDR选举。
当链路层协议是PPP或HDLC时,OSPF缺省认为网络类型是P2P。在此类型的网络中,OSPF以组播方式(224.0.0.5)发送协议报文。
· 广播型多路访问网络:即Broadcast型网络,网络本身支持广播功能。当链路层协议是Ethernet、FDDI时,OSPF缺省认为网络类型是广播型。此类型网络需要进行OSPF的DR、BDR选举。在该类型的网络中,OSPF通常以组播方式(224.0.0.5和224.0.0.6)发送协议报文。
· 非广播型多路访问网络:即NBMA(Non-Broadcast Multiple Access)型网络,虽然从一个接口可以到达多个目的节点,但是网络本身不支持广播功能,当链路层协议是帧中继、ATM或X.25时,OSPF缺省认为网络类型是NBMA。此时OSPF的邻居需要管理员手工指定。在该类型的网络中,以单播方式发送协议报文。
· 点到多点网络:即Point-to-multipoint(P2MP)型网络,是指该接口通过点到多点的网络与多台路由器相连。
P2MP型网络比较特殊,没有一种链路层协议会被缺省地认为是点到多点类型。点到多点必须是由其他网络类型强制更改而来。常用做法是将NBMA改为点到多点的网络。在该类型的网络中,缺省情况下以组播方式(224.0.0.5)发送协议报文,也可以根据用户需要,以单播形式发送协议报文。
OSPF 报文:
1 HELLO报文(hello packet) 周期性的发送给本路由器的邻居,使用的组播地址224.0.0.5. BR和BDR发送和接受报文使用的组播地址是224.0.0.6。HELLO PACKET内容包括一些定时器数值、DR、BDR、以及自己已经知道的邻居。 HELLO 时钟的值与路由收敛速度、网络负荷大小成正比。 缺省情况下,PTP、BROADCAST类型接口发送HELLO报文的时间间隔的值为10秒;PTMP、NBMA类型接口发送HELLO PACKET时间间隔为30秒;
2 DD报文(Database description packet) 相邻路由器直间互发DD报文,
报告对方自己所拥有的路由信息内容包括LSDB中每一条LSA摘要(摘要是指LSA的HEAD,通过改HEAD可以唯一标识一条LSA),这样做的目的是为了减少路由器之间传递信息的量,因为LSA的HEAD只占一条LSA的整个数据量的一小部分。根据HEAD,对端路由器就可以判断出是否已经有了这条LSA。 DATABASE DESCRIPTION PACKET 有两种 (1)空 DD 报文,用来确定MASTER/SLAVE关系。确定MASTER/SLAVE关系后,才发送有路由信息的DD报文 (2)带有路由信息的DD报文,收到有路由信息的DD报文后,路由器比较自己的数据库,发现对方的数据库中有自己需要的数据,则向对方发送LSR(LINK STATE REQUEST)
3 LSR报文(LINK STATE REQUEST PACKET) 两台路由器之间互相交换DD报文后,知道对端的路由器有那些LSA是本地LSDB所缺少的或者对端更新的LSA,这时需要发送LSR报文向对方请求所需的LSA。内容包括所需要的LSA摘要。
4 LSU报文(LINK STATE UPDATE PACKET) 用来向对端路由器发送所需要的LSA,内容是多条LSA的集合
5 LSACK报文(LINK STATE ACKNOWLEDGMENT PACKET) 由于没有使用可靠的TCP协议,但是OSPF包又要求可靠的传输,所以就有了LSACK包。它用来对接收到的LSU报文进行确认。内容是需要确认的LSA的HEAD.
ospf的邻接关系与邻居关系建立过程:
学习目标: 1. 理解Hello报文的作用
2. 理解OSPF邻居状态变换
3. 理解邻居关系和邻接关系的建立过程
4. 理解LSDB同步过程
字段的解释:
Network Mask:顾名思义是发送Hello报文的接口的网络掩码
HelloInterval:发送Hello报文的时间间隔,单位是秒 Options:标识发送此报
文的OSPF路由器所支持的可选功能。
Rtr Pri:发送Hello报文的接口的Router
Priority,用于选举DR和BDR。
RouterDeadInterval:宣告邻居路由器不继续在该网段上运行OSPF的时间间隔,单
位为秒,通常为四倍HelloInterval。
Designed Router:发送Hello报文的路由器所选举出的DR的IP地址。如果设置为
0.0.0.0,表示未选举DR路由器。
Backup Designed Router:发送Hello报文的路由器所选举出的BDR的IP地址。如果
设置为0.0.0.0,表示未选举BDR路由器。
Neighbor:邻居路由器的Router ID列表。表示本路由器已经从该邻居收到合法的
Hello报文。
验证一个Hello报文是否合法之前首先需要验证一个OSPF报文是否合法。 验证一
个接收到的Hello报文是否合法包括:
1. 如果接收端口的网络类型是广播型,点到多点或者NBMA,所接收的Hello报文中
Network Mask字段必须和接收端口的网络掩码一致,如果接收端口的网络类型为点
到点类型或者虚连接,则不检查Network Mask字段。
2. 所接收的Hello报文中的HelloInterval字段必须和接收端口的配置保持一致。
3. 所接收的Hello报文中的RouterDeadInterval字段必须和接收端口的配置保持一
致。
4. 所接收的Hello报文中的Options字段中的E-bit(表示是否接收外部路由信息)
必须和相关区域的配置保持一致。关于此比特的具体意义将在《OSPF特殊区域》中
详细解释。
如果路由器发现所接收的合法Hello报文的邻居列表中有自己的Router ID,则认为
已经和邻居建立了双向连接,表示邻居关系已经建立。 这是形成邻居关系的过
程和相关邻居状态的变化过程。
Down:这是邻居的初始状态,表示没有从邻居收到任何信息。在NBMA网络上,此状
态下仍然可以向静态配置的邻居发送Hello报文,发送间隔为PollInterval,通常
和RouterDeadInterval间隔相同。
Attempt:这个状态只在NBMA网络中存在,表示没有收到邻居的任何信息,但是已
经周期性的向邻居发送报文,发送间隔为HelloInterval。如果RouterDeaInterval
间隔内未收到邻居的hello报文,则转为Down状态。
Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己不再所收到的
Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。在此状态下的邻居
要被包含在自己所发送的Hello报文的邻居列表中。
2-WayReceived:此事件表示路由器发现与邻居的双向通信已经开始(发现自己在
邻居发送的Hello报文的邻居列表中)。Init状态下产生此事件之后,如果需要和
邻居建立邻接关系则进入ExStart状态,开始数据库的同步过程,如果不能与邻居
建立邻接关系则进入2-way。
2-way:在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建
立邻接关系以前的最高级状态。
1-wayReceived:此事件表示路由器发现自己没有邻居发送Hello报文的邻居列表
中,通常是由于对端邻居重启造成的。
DD序列号:每个DD报文都有一个DD序列号,用于DD报文的确认机制。DD序列号是
一个两字节的值。 主从关系:当两个路由器之间通过DD报文交换数据库信息的时
候,首先形成一个主从关系,Router ID大的优先为主,确认主从关系之后,主路
由器发送DD报文,从路由器不能主动发送DD报文,只能回应主路由器发送的DD报文
,回应的时候使用的DD报文的序列号必须和所回应的主路由器发送的DD报文的序列
号一致。 相关的状态解释:
ExStart:形成邻接关系的第一个步骤,邻居状态变成此状态以后,路由器开始向
邻居发送DD报文。主从关系是在此状态下形成的;初始DD序列号是在此状态下决定
的。在此状态下发送的DD报文不包含链路状态描述。
Exchange:此状态下路由器相互发送包含链路状态信息摘要的DD报文,描述本地
LSDB的内容。
Loading:相互发送LS Request报文请求LSA,发送LS Update通告LSA。
Full:两个路由器的LSDB已经同步。
1. 邻居状态机变为ExStart以后,RTA向RTB发送第一个DD报文,在这个报文中,DD
序列号被设置为552A(假设的值,实际中可能不一样),Initial比特置为1表示这
个是第一个DD报文,More比特为1表示后续还有DD报文要发送,Master比特为1表示
RTA宣告自己为主路由器。
2. 邻居状态及变为ExStart以后,RTB向RTA发送第一个DD报文,知识序列号被置为
5528(也是假设的值)。由于RTB的Router ID比RTA的大,所以RTB应当为主路由器
,Router ID比较结束后,RTA会产生一个NegotiationDone事件,所以RTA将状态机
从ExStart改变为Exchang状态
3. 邻居状态机变为Exchange以后,RTA发送一个新的DD报文,在这个新的报文中包
含LSDB的摘要信息,序列号设置为RTB在步骤2里使用的序列号,More比特为0表示
不需要另外的DD报文描述LSDB,Master比特为0表示RTA宣告自己为从路由器,收到
这样的一个报文后,RTB会产生一个NegotiationDone的事件,因此RTB将邻居状态
改变为Exchange。
4. 邻居状态变为Exchange以后,RTB发送一个新的DD报文,该报文中包含LSDB的描
述信息, DD序列号设为5529(上次使用的序列号加1)。
5. 即使RTA不需要新的DD报文描述自己的LSDB,但是作为从路由器,RTA需要对主
路由器RTB发送的每一个DD报文进行确认。所以,RTA向RTB发送一个新的DD报文,
序列号为5529,该报文内容为空。 发送完最后一个DD报文之后,RTA产生一个
ExchangeDone事件,将邻居状态改变为Loading;RTB收到最后一个DD报文之后,改
变状态为Full(假设RTB的LSDB是最新最全的,不需要向RTA请求更新)。 1.
邻居状态变为Loading之后,RTA开始向RTB发送LS request报文,请求那些在
Exchange状态下通过DD报文发现的,而且在本地LSDB中没有的链路状态信息。 2.
RTB收到LS request报文之后,向RTA发送LS update报文,在LS update报文中,包
含了那些被请求的链路状态的详细信息。RTA收到LS update 报文之后,将邻居状
态从loading改变为full。
3. RTA向RTB发送LS Ack报文,确保信息传输的可靠性。
LS ack报文用于泛洪对已接收LSA的确认。 邻居状态变成Full,表示达到完全邻
接状态。 当有新的LSA生成或收到时,这条新的LSA应当被泛洪。 泛洪新
的LSA时,只需要使用LS update报文和LS ack报文。 1. 当RTA有新的LSA要泛红
时,RTA向RTB发送一个LS update报文,在这个报文里包含这条LSA。 2. 收到新
的LSA以后,RTB向RTA泛红一个LS ack报文进行确认。 当在两个处于完全邻接状
态(邻居状态为Full)的路由器之间泛洪新的LSA时,邻居状态不受影响。
广播型网段上,DR和BDR发送LS update报文和LS ACk报文的目的地址是224.0.0.5,
其余路由器发送LS update报文和LS ack报文的目的地址是224.0.0.6 224.0.0.6
指代一个多路访问网络中DR和BDR的组播接收地址, 224.0.0.5指代在任意网络中
所有运行OSPF进程的接口都属于该组,于是接收所有224.0.0.5的组播数据包。
重点理解好 属于某一组 和 接收怎样的组播数据包,
比如 DR/BDR属于组播地址为224.0.0.6的组(Group),因此它接收目的地址为
224.0.0.6的组播数据包,也就可以理解为何多路访问通过设置DR/BDR可以防止信
息过多处理(因为属于某组的接收者(指OSPF接口),只会剥离到二层,而不会进
一步处理,也就省去了很多资源浪费)。
问题:
1. 如何验证一个Hello报文是否合法?
2. 邻居状态变换分为几个阶段?
3. 不能建立邻接关系的情况下,邻居稳定工作状态是什么?
4. 可以建立邻接关系的情况下,邻居稳定工作状态是什么?
答: 1. 检查Network Mask,HelloInterval,RouterDeadInterval以及Options
字段中的E-bit。
2. 两个阶段:邻居,邻接
3. 2 way 4
. full