OSPF邻居关系、邻接关系的建立

286 阅读6分钟

工作过程概览

  1. <---------通过Hello报文发现直连链路上的邻居---------> 邻居关系
  2. <---------协商主/从(master/slave)--------->
  3. <---------相互描述各自的LSDB(摘要信息)--------->
  4. <---------更新LSA,同步双方LSDB---------> 邻接关系
  5. <---------计算路由--------->

两个路由器要建立邻居关系的前提:Hello Interval要相同,RouterDeadInterval要相同,两边接口配置的区域要相同,Router ID不能相同,认证要相同,接口MTU值要相同(默认未开启MTU检查)

邻居关系

  • OSPF使用Hello报文发现和建立邻居关系
  • 在以太网链路上,缺省时,OSPF采用组播的形式发送Hello报文(目的地址224.0.0.5)
  • OSPF Hello报文中包含了路由器的Router ID,邻居列表等信息
  • DR和BDR给DRother发送消息使用的是组播224.0.0.5
  • DRother给DR和BDR发送消息使用的是组播224.0.0.6。
建立过程

R2(10.0.2.2)<------------------> R1(10.0.1.1)Down

R2(10.0.2.2)<---------Hello(Router ID:10.0.1.1 neighbor:null)--------- R1(10.0.1.1)Init

R2(10.0.2.2)---------Hello(Router ID:10.0.2.2 neighbor:null)---------> R1(10.0.1.1)Init

R2(10.0.2.2)<---------Hello(Router ID:10.0.1.1 neighbor:10.0.2.2)--------- R1(10.0.1.1)2-way

R2(10.0.2.2)---------Hello(Router ID:10.0.2.2 neighbor:10.0.1.1)---------> R1(10.0.1.1)2-way

邻居状态:Down->Init->2-way

Down:这是邻居的初始状态,表示没有从邻居收到任何信息

Init:在此状态下,路由器已经从邻居收到了Hello报文,但是自己的Router ID不在所收到的Hello报文的邻居列表中

2-way:在此状态下,路由器发现自己的Router ID存在于收到的Hello报文的邻居列表中

邻接关系

建立过程

R2(10.0.2.2)<------------------> R1(10.0.1.1)2-way

R2(10.0.2.2)<---------DD(Seq=X,I=1,M=1,MS=1)--------- R1(10.0.1.1)ExStart

R2(10.0.2.2)---------DD(Seq=Y,I=1,M=1,MS=1)---------> R1(10.0.1.1)ExStart

R2(10.0.2.2)<---------DD(Seq=Y,LSDB摘要)--------- R1(10.0.1.1)Exchange

R2(10.0.2.2)---------DD(Seq=Y+1,LSDB摘要,MS=1)---------> R1(10.0.1.1)Exchange

R2(10.0.2.2)<---------LSR--------- R1(10.0.1.1)Loading

R2(10.0.2.2)---------LSU---------> R1(10.0.1.1)Loading

R2(10.0.2.2)<---------LSAck--------- R1(10.0.1.1)Full

邻居状态:2-way->ExStart->Exchange->Loading

ExStart:邻居状态变成此状态以后,路由器开始向邻居发送DD报文。在此状态下发送的DD报文不包含链路状态描述

Exchange:在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文

Loading:在此状态下,路由器与邻居之间相互发送LSR报文,LSU报文,LSAck报文

Full:路由器已完成了与邻居的LSDB同步

DR与BDR选举

  • DR负责MA网络建立和维护邻接关系并负责LSA的同步
  • DR与其他所有路由器形成邻接关系并交换链路状态信息,其他路由器之间不直接交换链路状态信息
  • 为了规避单点故障风险,通过选举BDR,在DR失效时快速接管DR的工作
  • 接口优先级数字越大越优先(0-255,0 优先级不能参与 DR、BDR 选举)
  • Router ID越大越优先

为什么DR不可以抢占?

因为在MA网络中所有DRothers是和DR建立邻居的,如果新加入的路由器抢占DR位置,会导致其他所有路由器断掉现在的邻居,和新加入的路由器建立邻居,由于需要重新选举DR、建立邻居、传递更新计算路由,会导致短时间的断网现象,会导致网络的不稳定。

报文类型

  • OSPF一共定义了5种类型的报文,不同类型的OSPF报文有相同的头部格式
  • OSPF报文直接采用IP封装,在报文的IP头部中,协议号为89
Type报文名称报文功能
1Hello发现和维护邻居关系
2Database Description交互链路状态数据库摘要
3Link State Request请求特定的链路状态信息
4Link State Update发送详细的链路状态信息
5Link State Ack确认LSA
IP Packet header(协议号89)OSPF Packet headerOSPF Packet data
OSPF Packet header
VersionTypePacket Length(OSPF头部长度)
Router ID
Area ID
ChecksumAuth Type
Authentication
Hello报文
Network Mask
Hello IntervalOptionsRouter Priority
RouterDeadInterval
Designated Router
Backup Designated Router
Neighbor
...

Hello报文字段解释:

  • Network Mask:发送Hello报文的接口的网络掩码
  • Hello Interval:发送Hello报文的时间间隔,通常为10s
  • Options:
    • E:是否支持外部路由
    • MC:是否支持转发组播数据包
    • N/P:是否为NSSA区域
  • Router Priority:DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举
  • RouterDeadInterval:失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效,通常是Hello Interval的四倍,40s
  • Designated Router:DR的接口地址
  • Backup Designated Router:BDR的接口地址
  • Neighbor:邻居列表,以Router ID标识
DD报文
Interface MTUOptions0 0 0 0 0 I M MS
DD sequence number
LSA Header

DD报文字段解释:

  • Interface MTU:指示在不分片的情况下,此接口最大可发出的IP报文长度。在两个邻居发送DD报文中包含MTU参数,如果收到的DD报文中MTU和本端的MTU不相等,就丢弃该DD报文,缺省情况下,华为设备未开启MTU检查
  • Options:字段同Hello报文
  • I:当发送连续多个DD报文时,如果这是第一个DD报文,则置为1,否则为0
  • M(more):当发送连续多个DD报文时,如果这是最后一个DD报文,则置为0;否则置为1,表示后面还有其他的DD报文
  • MS(master/slave):当两台OSPF路由器交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为master,当值为1时表示发送方为master
  • DD sequence number:DD报文序列号,主从双方利用序列号来保证DD报文传输的可靠性和完整性

不同网络类型中DR与BDR的选举操作

OSPF网络类型常见链路层协议是否选举DR是否和邻居建立邻接关系Hello IntervalRouterDeadInterval
Point-To-PointPPP链路:HDLC链路10s40s
Broadcast以太网链路DR与BDR、DRother建立邻接关系;BDR与DR、DRother建立邻接关系;DRother之间只建立邻居关系10s40s
NBMA帧中继网络DR与BDR、DRother建立邻接关系;BDR与DR、DRother建立邻接关系;DRother之间只建立邻居关系30s120s
P2MP需手工指定30s120s

相关配置命令

display ospf peer brief//查看ospf邻居的相关信息
ospf 1 router-id x.x.x.x//启动ospf进程,编号1,同时设置routerid为x.x.x.x
display router id//查看全局routerid
reset ospf process//重启ospf进程
bandwidth-reference ?//修改参考带宽值
ospf cost ?//修改接口cost值
ospf dr-priority ?//修改dr优先级