本次介绍OSPF邻居和邻接关系的建立过程。这个过程是OSPF协议交互的过程,包括Hello报文,邻居状态变换以及链路状态数据库同步等内容。
学习目标:
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
4.HCNP-R&S-IERN——建立OSPF邻居与邻接关系
原文地址:http://blog.csdn.net/wdkirchhoff/article/details/45103755