目录
动态路由协议OSPF
1.前言
OSPF属于链路状态路由协议,通过Dijkstra算法,以自身为根计算出该区域内无环的最短路径生成树,从而形成到达各个节点的最优路由信息,感知区域内的整体拓扑结构,包括链路信息与路由信息。
2.邻居发现
1)发现方式
所有运行了OSPF的路由器(节点)都会监听224.0.0.5组播地址,当接口运行OSPF以后,就向该组播地址发送Hello报文从而发现链路上存在的其他邻居节点。
2)发送间隔
在BM与P2P网络中,hello报文的发送间隔默认为10s,hello dead时间间隔默认为hello间隔的4倍即40s;
在NBMA与P2MP网络中,hello报文的发送间隔默认为30s,hello dead时间间隔默认为hello间隔的4倍即120s;
【PS:hello时间间隔与hello dead间隔可通过命令修改】
3)邻居建立
只有当双方OSPF的状态为2-way时,双方邻居关系才算建立成功,并开始同步LSDB数据库信息。
4)邻居建立失败的原因
要想了解邻居建立失败的原因得先知道双方交互的数据报文中都存在哪些字段并且哪些字段关系到邻居关系的建立过程。
-
ospf报文头部
Type字段:用于表明后续报文的类型【1-hello ;2-DBD ;3-LSR ;4-LSU ;5-LSACK】
Router ID字段:路由器标识
Area ID字段:OSPF所宣告的区域
AuType字段:表面认证类型【0-不认证;1-简单认证;2-MD5认证】
Authentication字段:认证数据【不验证-此字段未定义; 简单认证-此字段为密码信息; MD5 认证-此字段包括 Key ID、MD5 验证数 据长度和序列号的信息;(MD5 验证数据添加在 OSPF 报文后,不 包含在此字段中)】
-
hello报文
Network Mask字段:网络掩码,只有BM与NBMA网络中会检查此字段,P2P与P2MP网络中不涉及。
HelloInterval字段:hello报文的发送间隔
RouterDeadInterval字段:hello dead时间即路由器失效时间
-
邻居建立不成功的原因
1.网络掩码不一致【广播与NBMA】
2.hello间隔不一致
3.hello dead间隔不一致
4.区域ID不一致
5.区域类型不一致
6.认证类型不一致
7.认证数据不一致
8.Router ID一致
3.报文类型与格式
OSPF直接封装在IP报文中,协议号为89;多数情况下OSPF使用组播地址作为OSPF的目的IP地址。
224.0.0.5--------所有开启OSPF路由器均监听该地址
224.0.0.6--------OSPF中DR路由器监听该地址
- 报文类型
报文类型 | 描述 |
---|---|
Hello报文 | Hello报文用于邻居发现与邻居关系的建立以及保持 |
DBD报文 | DBD报文用于同步LSDB时主从角色的选举以及携带LSA头部目录信息使双方对比本地LSDB信息用于请求本地未存在的LSA信息 |
LSR报文 | 携带LSA摘要信息,用来向邻居请求该LSA的完整信息 |
LSU报文 | 携带LSA完整信息,用来向邻居同步所请求的LSA信息 |
LSACK报文 | 对收到的LSU报文进行确认 |
- Hello报文格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------+---------------+-------------------------------+
| Version | 1 | Packet length |
+---------------+---------------+-------------------------------+
| Router ID |
+---------------------------------------------------------------+
| Area ID |
+-------------------------------+-------------------------------+
| Checksum | AuType |
+-------------------------------+-------------------------------+
| Authentication |
+---------------------------------------------------------------+
| Authentication |
+---------------------------------------------------------------+
| Network Mask |
+-------------------------------+---------------+---------------+
| HelloInterval | Options | Rtr Pri |
+-------------------------------+---------------+---------------+
| RouterDeadInterval |
+---------------------------------------------------------------+
| Designated Router |
+---------------------------------------------------------------+
| Backup Designated Router |
+---------------------------------------------------------------+
| Neighbor |
+---------------------------------------------------------------+
| ... |
字段 | 长度 | 含义 |
---|---|---|
Version | 1字节 | 版本,OSPF的版本号。对于OSPFv2来说,其值为2。 |
Packet length | 2字节 | OSPF报文的总长度,包括报文头在内,单位为字节。 |
Router ID | 4字节 | 发送该报文的路由器标识。 |
Area ID | 4字节 | 发送该报文的所属区域。 |
Checksum | 2字节 | 校验和,包含除了认证字段的整个报文的校验和。 |
AuType | 2字节 | 验证类型,值有如下几种表示:0:不验证。1:简单认证。2:MD5认证。 |
Authentication | 8字节 | 鉴定字段,其数值根据验证类型而定:当验证类型为0时未作定义。类型为1时此字段为密码信息。类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。 |
Network Mask | 32比特 | 发送Hello报文的接口所在网络的掩码。 |
HelloInterval | 16比特 | 发送Hello报文的时间间隔。 |
Options | 8比特 | 可选项:E:允许Flood AS-External-LSAsMC:转发IP组播报文N/P:处理Type-7 LSAsDC:处理按需链路 |
Rtr Pri | 8比特 | DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。 |
RouterDeadInterval | 32比特 | 失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。 |
Designated Router | 32比特 | DR的接口地址。 |
Backup Designated Router | 32比特 | BDR的接口地址。 |
Neighbor | 32比特 | 邻居,以Router ID标识。 |
- DBD报文格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------+---------------+-------------------------------+
| Version = 2 | 2 | Packet length |
+---------------+---------------+-------------------------------+
| Router ID |
+---------------------------------------------------------------+
| Area ID |
+-------------------------------+-------------------------------+
| Checksum | AuType |
+-------------------------------+-------------------------------+
| Authentication |
+---------------------------------------------------------------+
| Authentication |
+-------------------------------+---------------+-+-+-+-+-+-+-+-+
| Interface MTU | Options |0|0|0|0|0|I|M|MS
+-------------------------------+---------------+-+-+-+-+-+-+-+-+
| DD sequence number |
+---------------------------------------------------------------+
| |
+- -+
| |
+- An LSA Header -+
| |
+- -+
| |
+- -+
| |
+---------------------------------------------------------------+
| ... |
字段 | 长度 | 含义 |
---|---|---|
Interface MTU | 16比特 | 在不分片的情况下,此接口最大可发出的IP报文长度。 |
Options | 8比特 | 可选项:E:允许Flood AS-External-LSAs;MC:转发IP组播报文;N/P:处理Type-7 LSAs;DC:处理按需链路。 |
I | 1比特 | 当发送连续多个DD报文时,如果这是第一个DD报文,则置为1,否则置为0。 |
M (More) | 1比特 | 当发送连续多个DD报文时,如果这是最后一个DD报文,则置为0。否则置为1,表示后面还有其他的DD报文。 |
MS (Master/Slave) | 1比特 | 当两台OSPF路由器交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master。 |
DD sequence number | 32比特 | DD报文序列号。主从双方利用序列号来保证DD报文传输的可靠性和完整性。 |
An LSA Header | 每个20字节 | 该DD报文中所包含的LSA的头部信息。 |
- LSR报文格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------+---------------+-------------------------------+
| Version | 3 | Packet length |
+---------------+---------------+-------------------------------+
| Router ID |
+---------------------------------------------------------------+
| Area ID |
+-------------------------------+-------------------------------+
| Checksum | AuType |
+-------------------------------+-------------------------------+
| Authentication |
+---------------------------------------------------------------+
| Authentication |
+---------------------------------------------------------------+
| LS type |
+---------------------------------------------------------------+
| Link State ID |
+---------------------------------------------------------------+
| Advertising Router |
+---------------------------------------------------------------+
| ... |
字段 | 长度 | 含义 |
---|---|---|
LS type | 32比特 | LSA的类型号。 |
Link State ID | 32比特 | 与LSA中的LS Type和Advertising Router一起在路由域中描述一个LSA。 |
Advertising Router | 32比特 | 产生此LSA的路由器的Router ID。 |
- LSU报文格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Version | 4 | Packet length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Router ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Area ID |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Checksum | AuType |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Authentication |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Number of LSAs |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+- +-+
| LSAs |
+- +-+
| ... |
字段 | 长度 | 含义 |
---|---|---|
Number of LSAs | 32比特 | LSA的数量。 |
LSAs | - | 常用的LSA共有5种,分别为:Router-LSA、Network-LSA、Network-summary-LSA、ASBR-summary-LSA和AS-External-LSA。 所有的LSA都有相同的报文头。不同的LSA类型有不同的格式: Type1:Router-LSA,每个路由器都会产生,描述了路由器的链路状态和花费,在所属的区域内传播。 Type2:Network-LSA,由广播网或NBMA网络中的DR产生,Network-LSA中记录了这一网络上所有路由器的Router ID,描述本网段的链路状态,在所属的区域内传播。 Type3:Network-summary-LSA,描述区域内所有网段的路由,并通告给其他相关区域。Type3和Type4的LSA有相同的格式,它们都是由ABR产生。 Type4:ASBR-summary-LSA,描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。Type3和Type4的LSA有相同的格式,它们都是由ABR产生。 Type5:AS-External-LSA,由ASBR产生,描述到AS外部的路由,这是五种LSA中,唯一一种通告到所有区域(除了Stub区域和NSSA区域)的LSA。Type5的LSA可以用来通告缺省路由,此时Link State ID和Network Mask都设置为0.0.0.0。 Type7:NSSA-LSA,由NSSA的ASBR产生,仅在本NSSA内传播。格式与Type5相同。 |
- LSACK报文格式
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+---------------+---------------+-------------------------------+
| Version | 5 | Packet length |
+---------------+---------------+-------------------------------+
| Router ID |
+---------------------------------------------------------------+
| Area ID |
+-------------------------------+-------------------------------+
| Checksum | AuType |
+-------------------------------+-------------------------------+
| Authentication |
+---------------------------------------------------------------+
| Authentication |
+---------------------------------------------------------------+
| |
+- -+
| |
+- An LSA Header -+
| |
+- -+
| |
+- -+
| |
+---------------------------------------------------------------+
| ... |
字段 | 长度 | 含义 |
---|---|---|
An LSA Header | 可变 | 通过LSA的头部信息确认收到该LSA。。 |
4.状态机
1)邻居关系状态机
- 示例说明
Down状态:路由器初始状态,路由器A与B还未出现在对方的邻居列表中,接口尚未收到Hello报文。
Init状态:路由器A收到路由器B发送的Hello报文,但Active Neighbor未存在自身的Router ID值,此时为Init状态。
2-way状态:当收到的hello报文中Active Neighbor中存在对方的Router ID值时为2-way状态,并且只有双方都达到2-way状态时邻居关系才算建立完成。
2)邻接关系状态机
ExStart状态:首先双方通过DD空报文进行主从协助、序列号确认、MTU值协商;Router ID值大的为主设备。
Exchange状态:主从设备确定好后,采用主设备的序列号进行报文交互,交换双方的LSA头部信息摘要。
Loading状态:LSA头部摘要信息同步完成后,双方通过LSR报文向对方请求本地LSDB中没有的LSA信息,LSU报文进行LSA更新,LSACK报文进行确认。
Full状态:双方的LSDB同步完成,达到邻接关系。
5.基础概念
1)广播网络中的DR与BDR
正常情况下,所有路由器都要建立全互联的邻接关系,维护邻接关系会占用设备的资源,同时网络中会泛洪大量的LSA报文,给网络中的链路带宽带来非常大的压力,当网络拓扑发生变动时OSPF协议报文充斥在网络中会出现导致正常业务流量拥塞的可能性。
在增加完DR与BDR的概念后,除DR与BDR外均为DRother,所有的DRother路由器均与DR与BDR进行全互联建立完整的邻接关系,与其他DRother路由器仅建立2-way关系,当网络拓扑发生变动后,由DR路由器通过LSA-2进行通告,为保证网络的可靠性BDR作为网络中DR设备的备份设备,当DR设备故障时接替DR设备工作,故BDR也需要与DR与其他的DRother路由器建立完整的邻接关系。
2)区域概念
OSPF的多区域概念可以让OSPF很好的进行网络规划,避免路由环路以及限制LSA的泛洪。
OSPF域中可以划分多个区域,但是一定要有区域0,区域0作为OSPF域中的骨干区域通过LSA-3进行区域间的路由信息交换,每个区域只需要维系自己本区域的拓扑结构即可,大大简化了网络拓扑的维护程度。
除骨干区域(区域0)外,其他区域均为非骨干区域,OSPF规定所有非骨干区域均要与骨干区域相连,从而保证整个OSPF域的健壮性。不同区域间的路由需要通过区域0进行转发,从而避免非骨干区域传递路由后造成路由环路的问题。
每个非骨干区域中与骨干区域相连的路由器为ABR路由器(区域边界路由器),所以ABR路由器中最少存在一个接口在骨干区域(区域0)中,即骨干区域中的包含所有的ABR路由器。
3)路由器角色
内部路由器(Internal Router ,IR): 所有接口都接入同一个OSPF区域的路由器。
区域边界路由器(Area Border Router,ABR): 接入多个区域的路由器,但必须至少有一个接口在Area 0中,同时还有其他接口处于其他区域。ABR负责在区域之间传递路由信息,因此ABR必须连接到Area 0,同时连接着其他区域。
骨干路由器(Backbone Router,BR): 接入Area 0的路由器,一台路由器所有接口均处于Area 0中那么该路由器就称作骨干路由器,同时ABR也是骨干路由器。
AS边界路由器(AS Boundary Router,ASBR): 工作在OSPF自治系统边界的路由器,ASBR将OSPF域外的路由引入本域,外部路由在整个OSPF域内传递。并并不是运行了多种路由协议的路由器就是ASBR,ASBR一定存在将外部路由重分发进OSPF的操作。