文章目录
CCNP4:OSPF的【数据包、状态机、工作过程、接口网络类型、建立邻接关系的条件】
OSPF:开放式最短路径最短优先协议
OSPF | 开放式最短路径最短优先协议 |
---|---|
① | 无类别链路状态路由协议。 |
② | 组播更新,组播更新地址224.0.0.5、224.0.0.6 点到点网络中: 使用224.0.0.5进行更新 MA网络中: DR、BDR使用224.0.0.5进行发送,使用224.0.0.6进行监听 DRother使用224.0.0.6进行发送,使用224.0.0.5进行监听 |
③ | 管理距离110 |
④ | 存在触发更新,周期更新(30min) |
⑤ | 跨层封装至3层,协议号89。 |
⑥ | 基于拓扑型协议,选择路径佳 |
⑦ | 默认值:hello time 10s,dead time 40s NBMA 网络:hello time 30s,dead time 120s |
OSPF基于LSA更新,这就导致更新量很大。由于它需要为中大型网络服务,因此它需要结构化部署(区域划分、地址规划)
结构化部署:
(1)区域划分(在一个单区域内部传拓扑,两个拓扑之间传路由。两个区域拓扑计算所得结果进行共享,也就是路由)
(2)地址规划
一、数据包:
数据包 | 全名 | 特点 |
---|---|---|
Hello | Hello包 | 邻居的发现、建立、保活 |
DBD | 数据库描述包 | 数据库目录信息 |
LSR | 链路状态请求 | 用于请求未知的LSA |
LSU | 链路状态更新 | 携带各种LSA |
LSack | 链路状态确认 | 用于确认LSR、LSU |
OSPF报头格式:上面的包会被放在IP报头之后的OSPF Packet Types 这部分。
OSPF Packet | 注解 |
---|---|
Version Number | 版本号2(IPv4)、3(IPv6) |
Type | 编号代表包的类型: |
Packet Length | 包长度 |
Router ID | 每台设备唯一的名字 |
Area ID | 区域ID |
Check-sum | 校验和 |
Authentication-Type | 认证类型(空、明文、密文) |
Authentication | 携带明文或密文密码 |
Data | 携带Hello、DBD、LSR、LSU或LSack的数据 |
1、Hello包:
Hello包所独有的是:
Data | 注解 |
---|---|
Hello and dead intervals | 生成、死亡时间 |
Neighbors | 当图中的A发出Hello包的时候,包中就会携带BCED的RouterID |
Router priority | 路由器的优先级 |
DR IP address | DR的IP地址 |
BDR IP address | BDR的IP地址 |
Stub area flag | 区域末梢标记 |
我们观察到Hello包中有几项数据是被标记为*
的,这表明邻居间Hello包中这4个参数完成一致,否则无法建立邻居关系。
①Hello、dead time
②区域ID
③认证字段
④末梢区域标记
2、DBD包:
R1#debug ip ospf adj 查看OSPF建邻过程
R1#clear ip ospf process 重启ospf进程,可以查看建邻过程
R1#un all 关闭Debug
它出现在exstart、exchange均出现,exstart状态时,没有携带目录信息,仅用于主从关系选举。
(1) DBD包中携带MTU,强制要求邻接间MTU值必须一致。否则将卡在 exstart、exchange状态。如果不一致,导致数据包被多次的分段,占用的资源将会更多。
(2) 在exstart状态的DBD时,使用的隐形确认(基于序列号),该包基于序列号,从使用主的DBD序号来确认主的信息。
打开OSPF重建邻居的Debug,然后重建邻居关系,之后关闭Debug。下图就是紧邻过程的部分截取,通过使用主的序列号用来确认主的信息。
(3)标记位:
下图是我抓取的OSPF的一个DBD包:
标记位 | 注解 |
---|---|
I | 为1标识本地发出的第一个DBD包 |
M | 为0标识本地发出的最后一个DBD包 |
MS | 为1标识主,为0标识从 |
一般情况下:
而图中显示的是第二次已经是最后一次发出的DBD包了。之后的0x0都只是作为应答,表示其接收到了来自主的DBD。
二、OSPF的状态机:
状态机 | 意义 |
---|---|
Down | 一旦本地发出hello包就进入下一个状态 |
Init (初始化) | 本地接收到的hello包中,若存在本地RID,那么进入下一状态 |
2way (双向通信) | 邻居关系建立的标志 |
条件匹配:点到点网络直接进入下一状态,MA网络中将进行DR/BDR选举(40s)非DR/BDR间不得进入下一状态
Exstart (预启动) | 类hello的DBD,进行主从关系选举,RID数字为大者为主,优先进入下一状态,该阶段进行的主从关系选举主要解决谁先发消息谁后发消息,该阶段还会协商MTU。 |
---|---|
Exchange (准交换) | 使用真正的DBD包,进行数据库目录的共享,需要ACK确认,用于发现自己缺少的LSA信息 |
Loading (加载) | 使用LSR/LSU/LSack来获取未知的LSA信息 |
Full (转发) | 邻接关系建立的标志 |
除上述状态机外,还存在一个Attempt:
Attempt:这种状态仅仅适用于NBMA网络上的邻居,表示最近没有从邻居收到信息,但仍需作出进一步的尝试,用以与邻居联系。这时按Hello time的间隔向邻居发送Hello包
总结一下就是:
①该状态只有NBMA网络中才会出现,
②该状态为了建立邻居关系会按hello time的间隔向邻居发送Hello包
三、OSPF的工作过程:
序号 | 注解 |
---|---|
1 | 启动配置完成后,本地使用组播(224.0.0.5、224.0.0.6)发送hello包到所有邻居处,若收集到其他邻居的hello包,那么建立邻居关系,生成邻居表 |
2 | 紧接着和所有邻居间进行 条件匹配 : ①若失败将停留于邻居关系,仅hello包周期保活即可。 ②若匹配成功,将建立邻接(毗邻)关系(需要DBD共享数据库目录),邻接关系将使用DBD/LSR/LSU/LSack来获取未知的LSA信息,当收集齐所有的LSA信息后,本地生成LSDB(链路状态数据库也就是数据库表) |
3 | 之后在本地基于LSDB计算到达所有未知网段的最佳路径,然后将其加载到路由表。 |
4 | 收敛完成后,hello包周期保活邻居、邻接关系;每过30min周期性的使用DBD比对数据库。 |
5 | 若结构突变: ①新增、断开网段时,直连新增或断开的设备使用DBD告知邻居,邻居再使用LSR、LSU、LSack获取 ②设备断电无法沟通,dead time到时后断开邻居关系。 |
名词注解:
LSA:链路状态通告,或者说是拓扑或路由。
LSDB:链路状态数据库,用于存放所有的LSA集合。
OSPF协议的收敛被称作LSA洪泛、LSDB同步
1、状态排错:
首先,上面也说过Hello包中必须匹配的有四个参数:Hello和dead time、区域ID、认证类型和秘钥、特殊区域标记,除此之外RID不能一致。
所卡状态 | 状态分析 | 卡住原因 |
---|---|---|
init | hello包出现问题 | 网络拥塞,或者Hello包协商失败 |
two-way | 邻居关系正常 | 邻接关系若卡在该状态,可能因为优先级为0,没有DR |
exstart | 双方MTU不匹配 | |
loading | LSU更新数据丢失 | ①LSDB总数超量(最大10000条LSA) ②设置了LSA最大接收数量,导致卡住 |
attempt | NBMA网络中指定错误的邻居地址 |
2、OSPF邻居关系建立的条件:
序号 | 条件 |
---|---|
① | hello time、dead time 一致 |
② | mtu 一致 |
③ | 认证类型、认证数据相同 |
④ | 具有相同的 区域ID |
⑤ | 特殊区域标识(末梢、nssa)相同 |
⑥ | 双方网络掩码一致(MA网络可以不一致) |
⑦ | RID不同 |
补充:
(1)若MA网络中仅存在DR或BDR,其余路由器的接口优先级均为0,那么重启OSPF进程之后,则依然可以建立邻居关系。
(2)若MA网络中所有路由器的接口优先级均为0,它们均会卡在Two-way状态
(3)若A、B、C三台路由器连成线,它们的RID均配置为相同的RID,那么它们的邻居表将不会有任何邻居显示。
(4)若R1、R2、R3三台路由器连成线,R1与R3的RID配置为一样,那么B可以在邻居表中看到两个邻居,虽然能够正常建立邻居关系,但是邻居关系及其不稳定,R2只能ping通一边的环回,之后便中断了,之后又能够ping 通了。(我这里用的是WebIOU模拟器,之后有机会我会拿真机去测试)
(5)如下配置:
测试结果 |
---|
R1 ping 不通 3.3.3.3,其余均可ping 通 |
R3 ping 只能ping通 本地环回3.3.3.3 |
R2 ping 不通 1.1.1.1,3.3.3.3,但有时能 ping 通 4.4.4.4,有时不能 |
R4 同R2 |
3、SPF算法:
OSPF算法使用的是迪杰斯卡拉算法,这里不具体说。只说下它大概过程,这个算法可以算出最短的路径,最后成树状结构。接口开销值越小,则路径越优。
整个OPSF的收敛过程总共使用了两次SPF算法,第一次生成树状结构,然后第二次检索出每个节点的最短路径。
根据建邻,收集的信息完闭之后会生成LSDB,然后运行SPF算法,从而生成最短路径树状图,树状图具备无环,然后到达其它节点也是最短路径。
之后第二次检索到达每个路由器网段的路径,这个路径一定是最短路径,之后就可以生成路由信息了。
四、OSPF的配置:
1、启动、宣告:
接下来的配置我会以下图为例,IP如下,宣告省略:
R1(config)#router ospf 1 启动时需要配置进程号,仅具有本地意义
R1(config-router)#router-id 1.1.1.1
router-id全网唯一,优先级从高到底按下面排列:
手工配置 > 环回接口上最大数值的IP地址 > 物理接口最大数值 > 无进程
宣告的作用:①激活接口 ②传递拓扑 ③区域划分
R1(config-router)#network 1.1.1.1 0.0.0.0 area 0
R1(config-router)#network 12.1.1.1 0.0.0.0 area 0
OSPF在宣告时,必须携带反掩码。
区域划分规则:
1、星型结构:所有非骨干必须直连到骨干区域,区域0为骨干,大于0为非骨干。
2、ABR:区域边界路由器,一台设备同时工作在两个区域之间,用于实现路由的共享。
2、邻居表:
表中包含了邻居ID、优先级、状态机、死亡时间、邻居的IP、出接口
3、数据库表:
查看OSPF的数据库表(目录),关于目录的详细信息我会在下一次讲。
R2#show ip ospf database 查看数据库的目录
R2#show ip ospf database router 1.1.1.1 具体查看某条LSA
(router 为类别,1.1.1.1 为番号)
4、路由表:
ABR:区域边界路由器,它位于OSPF区域边界上,将OSPF的非骨干区域连接到了OSPF的骨干区域。
ASBR:自治系统边界路由器,它位于OSPF自主系统和非OSPF网络之间,ASBR可以同时运行着多种协议。
标识 | 注解 |
---|---|
O | 标识OSPF本区域内通过拓扑计算所得路由。 |
O IA | 标识其它区域路由器通过ABR导入所得 |
O E1/2 | 标识其它协议或其它进程产生后,通过ASBR重发布进入 |
O N1/2 | 标识其它协议或其它进程产生后,通过ASBR重发布进入,同时本地处于NSSA特殊区域。 |
管理距离为110,度量为cost开销值:
注意:当接口带宽大于参考带宽时,度量为1,可能导致选路不佳,因此可以修改默认的参考带宽,但要求整个网络所有设备参考带宽需一致。
R1(config-router)#router ospf 1
R1(config-router)#auto-cost reference-bandwidth 1000
注意:它的单位是Mbits
五、OSPF的邻居建立成为邻接关系的条件:
1、基于网络类型:
(1)点到点 :
在点到点网络中,邻居关系必须成为邻接关系,否则无法正常收敛。
(2)MA多路访问:
在MA网络若全网均为邻接关系,那么将可能出现大量重复性的LSA洪泛。为避免该现象,将进行DR/BDR的选举,所有的非DR/BDR间不得建立成为邻接关系。
2、选举规则:
(1)先比较接口优先级:默认为1,数值越大越优选,0标识不参选,点到点接口默认为0。
(2)优先级相同,比较设备的RID,数值越大越优选。
3、干涉选举的方法:
(1)修改DR最大优先级,BDR次大。
R1(config)#interface fastEthernet 0/0
R1(config-if)#ip ospf priority 3
注意:DR选举为非抢占,故修改优先级后必须重启设备的OSPF进程,必须在40s之内修改完成。
R1#clear ip ospf process
Reset ALL OSPF processes? [no]: yes
(2)修改DR最大优先级,BDR次大,剩余所有设备优先级修改为0。
这种方式不需要重启设备的进程,切记不得将所有设备优先级修改为0,至少必须存在DR。
六、OSPF的接口网络类型:
OSPF的接口网络类型:指OSPF协议在不同网络类型下的接口上,不同的工作方式。
网络类型 | 名称 | 特点 | 其它 |
---|---|---|---|
环回 | Loopback | 无Hello包 | 以32位主机掩码发送路由 |
点到点 (HDLC、PPP) | point_to_point | hello time 10s | 不选DR |
BMA 以太网 | Broadcast | hello time 10s | 选DR |
NBMA (帧中继、MGRE) | point_to_point | hello time 10s | 不选DR |
除上述4种网络类型外,OSPF还存在点到多点模式,这个本文最后将会提到,还存在虚链路,这个我会在下一节讲。
注:点到点的工作方式,仅适用于一个网段两个节点的网络。
因此:在MGRE环境下若适用tunnel口默认的工作方式,那么一个网段内若存在两个以上节点将出现邻居关系翻滚。
想了解MGRE可以看我这篇博客:CCNP2:二层技术、PPP、HDLC、GRE(Tunnel)、MGRE技术
如果需要解决邻居关系的翻滚,可以使用以下方法:
1、所有节点修改网络类型尾以太网类型Broadcast
R1(config)#interface tunnel 0
R1(config-if)#ip ospf network broadcast
注:
①若MGRE环境下,不同接口处于不同的网络类型,若hello time 一致将建立邻居关系,但工作机制的不同,导致LSA更新出现问题,因此必须所有节点处于相同的工作方式。
②在MGRE环境下,若构建的OSPF工作环境不是一个全连结构(网段内所有设备间均建立邻居关系),那么一旦使用Broadcast工作方式,就必须将DR固定在中心站点的位置,否则导致DR位置混乱,网络将无法正常收敛。
2、所有节点修改为点到多点模式
点到多点是Cisco为OSPF协议额外设置的工作方式,处在MGRE下的所有邻居之间都应该修改为相同的网络类型。
R1(config)#interface tunnel 0
R1(config-if)#ip ospf network point-to-multipoint
点到多点的工作:hello time 30s,无DR选举,生成访问各个节点的精确路由。