目录
[第六章 OSPF基础](#第六章 OSPF基础)
[6.3 链路状态路由协议工作过程](#6.3 链路状态路由协议工作过程)
[6.4 概念](#6.4 概念)
[6.4.1 区域](#6.4.1 区域)
[6.4.2 Router ID](#6.4.2 Router ID)
[6.4.3 OSPF进程](#6.4.3 OSPF进程)
[6.4.4 OSPF 开销值](#6.4.4 OSPF 开销值)
[6.4.4 防环原则](#6.4.4 防环原则)
[6.5 OSPF报文的种类](#6.5 OSPF报文的种类)
[6.6 Hello报文](#6.6 Hello报文)
[6.6.1 Hello报文参数](#6.6.1 Hello报文参数)
[6.6.2 影响邻居关系建立的因素](#6.6.2 影响邻居关系建立的因素)
[6.7 OSPF的三张表](#6.7 OSPF的三张表)
[6.7.1 邻居表](#6.7.1 邻居表)
[6.7.2 LSDB表](#6.7.2 LSDB表)
[6.7.3 OSPF协议路由表](#6.7.3 OSPF协议路由表)
[6.8 OSPF的工作机制](#6.8 OSPF的工作机制)
[6.8.1 确认机制](#6.8.1 确认机制)
[6.8.2 邻居/邻接关系建立](#6.8.2 邻居/邻接关系建立)
[6.8.3 邻居状态机](#6.8.3 邻居状态机)
[6.8.4 OSPF网络类型](#6.8.4 OSPF网络类型)
[6.8.5 DR和BDR](#6.8.5 DR和BDR)
[6.8.6 单区域和多区域](#6.8.6 单区域和多区域)
第六章 OSPF基础
6.1背景
动态路由协议的优势:相比于静态
- 静态路由无法适应大规模的网络,配置量大
- 静态路由不能自动感知网络拓扑的变化,自动收敛。
6.2距离矢量路由与链路状态路由协议的区别
距离矢量路由协议,逐跳传递路由表信息,对于收到路由的设备,仅知道要去往目的地需要将报文交给下一跳的设备,不知道后续转发路径。
链路状态路由协议,传递的链路状态信息,设备会收到所有其他设备的链路状态信息,设备根据链路状态信息可以知道整个网络拓扑,并自行计算路由。
6.3 链路状态路由协议工作过程
- 邻居关系:相互之间建立邻居关系
- 同步LSDB:发送各自的LSA(链路状态信息),将收到的链路状态信息存在在自己的LSDB(链路状态数据库)。
- 计算拓扑和路由:全网拥有相同的LSDB,以各自自己为根根据LSDB计算拓扑和路由
- 将计算的路由加入到路由表中,指导报文转发。
6.4 概念
6.4.1 区域
- 1、32bit组成,将设备划分到不同的组,每一个组通过区域ID标识
- 区域ID:32bit组成,两种表示方式
- 十进制:0,1...... 100
- 点分十进制:0.0.0.0 0.0.0.1
- 分类方式:
- 0区域:骨干区域
- 非0区域:非骨干区域
- 注意:非骨干区域必须与骨干区域相连,非骨干区域之间不相互连接(防环原则)
- 区域分类:
- 骨干区域和非骨干区域(区域号0和非0)
- 特殊区域和普通区域(特殊区域需要手工配置,如果没有配置,所有的区域都属于普通区域,包含区域0,区域0不能作为特殊区域)
6.4.2 Router ID
- 作用:用于唯一标识OSPF域内的一台OSPF路由器(启用了OSPF协议的路由器),32bit位无符号整数,点分十进制表示。
- 生成方式:
- 手动设置:
- 配置OSPF进程时,同步设置Router ID
- ospf 1 router-id 10.10.10.10 //配置命令
- 配置OSPF进程前,设置全局Router ID
- [S3700-1]router id 1.1.1.11 //手工修改全局Router ID
- 创建OSPF进程,自动选择全局Router ID。
- 配置OSPF进程时,同步设置Router ID
- 自动获取
- 配置OSPF进程,不同步配置OSPF Router ID,则选举全局Router ID
- 全局Router ID:如果不手工配置,则选择设备上第一个配置的IP地址作为Router ID
- 思科的方式:
- 配置OSPF进程不指定Router ID,则有环回口的IP地址选择最大环回口IP地址,没有环回口的选择最大物理接口的IP地址。
- 建议配置OSPF的时候手工指定Router ID
- 如果创建进程后修改OSPF Router ID(全局Router ID,还是重新指定OSPF Router ID),则需要重启OSPF进程生效。
- 参考命令:reset ospf 1 process //用户视图下
- 手动设置:
6.4.3 OSPF进程
设备需要创建OSPF进程启用OSPF协议,并将接口IP地址宣告到OSPF进程中,接口才会发送OSPF协议报文。
- 本地可以创建多个OSPF进程,各进程之间相互独立,本地有效。
- 接口IP通告在哪个进程下面,则对应进程生成对应的LSA信息从对应接口发出。
- 一个接口的IP地址只允许被通告到一个进程,一个接口只可以属于一个区域,不能属于多个区域。
6.4.4 OSPF 开销值
- OSPF设备启用OSPF协议的每一个接口都维护一个开销值。
- 开销值计算:接口开销=参考带宽值/接口的实际带宽,参考带宽值默认是100Mbit/s,G接口实际带宽是1000Mbit/s,E接口实际带宽100Mbit/s
- 如果计算的结果小于1,取值1
- 如果计算结果大于1,舍去小数,向前取值
- 比如有接口的带宽值是2.048Mbit/s,对应的接口开销是48
- 路由的开销计算:路由传递方向的入接口的开销值之和,或者是数据报文转发方向的路径上的所有出接口的开销之和。
- 开销的修改:
- 修改参考带宽值,如果要修改,建议所有设备修改,参考命令如下:
- [S3700-1-ospf-1]bandwidth-reference 1000 //修改参考带宽值为10000Mbit/s,从而影响开销值计算
- 直接在接口下修改,修改命令如下:
- [S3700-1-G0/0/0]ospf cost 10 //接口视图下修改OSPF开销值为10。
- 修改参考带宽值,如果要修改,建议所有设备修改,参考命令如下:
6.4.4 防环原则
- 非骨干区域必须与骨干区域相连,非骨干区域之间不相互连接(防环原则)
- 区域内通过SPF计算最短路径树,实现无环,即算法无环。
6.5 OSPF报文的种类
- Hello报文:用于发现、维护、建立邻居关系。
- Database Description(DD报文):
- 用于选举主从,用于支持DD报文后续交互过程中的有序性、可靠性。
- 通过DD报文通告自己的LSDB(链路状态数据库LSA)的摘要信息。
- LSR(链路状态请求报文):用于请求自己缺少的详细的LSA信息
- LSU(链路状态更新报文):携带LSA信息,向网络中更新。当收到LSR时通过LSU向对端更新LSA信息。
- LSAck(链路状态确认报文):用于确认已收到的LSA信息。
6.6 Hello报文
6.6.1 Hello报文参数
OSPF报文分为两个部分:OSPF头部、OSPF消息部分
- OSPF头部参数:
- 版本:取值为2,表示v2版本,支持IPv4
- 消息类型:Hello、DD、LSR、LSU、LSAck(取值1-5)
- 包长度:OSPF报文的长度
- Router ID:本地的Router ID
- 区域ID:发送该Hello报文的接口所属区域的区域ID
- 校验字段:校验OSPF报文
- 认证类型:不认证、简单明文认证、MD5
- 认证数据:携带的认证密码
- OSPF消息部分(Hello消息/报文)
- 掩码:发送该Hello报文的接口的IP地址的掩码
- Hello周期时间:默认是10s,即周期10s发送一次Hello报文(值与接口网络类型有关)
- Option字段:功能字段(必须要携带)
- N比特位:置1,表示发送给Hello报文的接口是属于NSSA区域(特殊区域)。
- E比特位:置1,表示发送该Hello报文的接口是属于普通区域。
- 路由器优先级:默认1,范围是0-255,用于选举DR和BDR的(越大越优,为0则不参与选举)
- 邻居失效时间(Dead time):在邻居失效时间内没有收到邻居的Hello报文,则认为邻居Down,默认Hello时间的4倍。修改Hello时间会自动修改失效时间,如果修改失效时间,不影响Hello时间。
- DR:指定路由器,Router ID
- BDR:备份指定路由器,Router iD
- 活跃邻居列表:其中保存本端活跃的邻居,收到邻居的Hello报文之后,将邻居的Router ID放到自己的Hello报文中的该字段中发送。
6.6.2 影响邻居关系建立的因素
- 版本号要相同,不同则不能建立邻居关系。
- Router ID不能冲突,不能一致,一致则邻居关系无法建立。
- 区域ID,相同链路上的接口必须在同一个区域内,否则无法建立邻居关系。
- 认证类型和认证数据必须要相同,不同则认证失败无法建立邻居关系。
- 两端的接口掩码必须要一致,不一致则无法建立邻居关系。
- Hello周期和失效周期时间必须要相同,不同则两端无法建立邻居关系。
- Option字段必须要相同,不同则无法建立邻居关系
- N/E比特位两端必须相同。
- 路由器优先级不能同时为0,为0,两端可以建立邻居关系,两端无法建立Full的邻接关系(只在多路访问网络)。
- 接口IP地址没有被正确宣告,不发送Hello报文。接口被配置了静默接口,也不会发送Hello报文。
- 接口的MTU值不同,且两端都开启了OSPF MTU值的检测,则无法到达Full关系。
6.7 OSPF的三张表
6.7.1 邻居表
- 参考命令:
- [AR1]display ospf peer //查看邻居关系详细信息,显示如下:
-
- [AR1]display ospf peer brief
6.7.2 LSDB表
参考命令:display ospf lsdb //查看OSPF LSDB表
6.7.3 OSPF协议路由表
OSPF协议通过SPF算法,根据LSDB中的LSA计算出路由,并将路由放入到OSPF协议路由表(ospf routing)中,然后与其他的协议路由表共同选择各协议路由中到达目的地最优的路由加入到核心路由中ip routing-table(优先级和开销的比较)。
Display ospf routing //查看OSPF的协议路由表
Display ip routing-table //查看的IP核心路由表,该表的路由才用于指导报文转发。
6.8 OSPF的工作机制
OSPF使用的目的地址:224.0.0.5(所有的OSPF路由器),224.0.0.6(所有的DR和BDR)。
6.8.1 确认机制
隐式确认和显式确认
- Hello报文的确认机制:收到的报文的活跃邻居列表中存在自己的Router ID,则认为对端收到了自己的Hello报文。
- DD报文的隐式确认:从路由器必须使
- 用主路由器的DD报文的序列号对收到的DD报文进行确认。
- LSU报文的隐式确认:当路由器R向网络中的DR设备更新LSU报文,DR设备不会回复LSack报文,而是通LSU报文向网络中的所有设备更新LSA,包括R路由器,当R路由器收到LSU报文,发现报文中存在自己刚刚向DR更新的LSA,则认为DR已收到自己的更新报文。
- 显示确认:通过LSack报文对收到的LSA进行确认。
6.8.2 邻居/邻接关系建立
- 接口使能OSPF(宣告),接口发送Hello报文,发现链路上的邻居,并建立邻居关系,R1与R2建立邻居关系的过程。
- R1周期发送Hello报文,携带自己的Router ID (1.1.1.1),目的地址224.0.0.5
- R2收到后,发现邻居R1,并将R1加入到邻居列表中,邻居状态标记为init状态,周期发送自己的Hello报文,并在活跃邻居列表中携带R1的Router ID
- R1收到R2发送的Hello报文,发现邻居R2,并将R2加入到邻居列表,同时由于R2的Hello报文中携带了R1的Router ID,在邻居列表中将R1标记为2-way状态。R1再次周期发送Hello报文,此时报文中携带自己的R2的Router ID
- R2收到R1的Hello报文之后,在报文的活跃邻居列表中发现了自己的Router ID,于是将邻居R1的状态从init修改标记2-way,至此双向的邻居关系建立完成。
- 邻接关系建立过程
- R1和R2建立了2-way邻居关系,进一步将邻居状态切换到Exstart状态,进行主从选举,R1和R2发送DD报文,并认为自己是主路由器,具体过程如下:
- R1发送DD报文,认为自己的主路由器,携带Router ID,序列号x,报文内容:空,邻居状态为Exstart状态
- R2收到DD报文,发送DD报文给R1,认为自己才是主动端,携带自己的Router ID,序列号y,报文内容为空,邻居状态Exstart
- R1收到R2的DD报文,发现R2 Router ID更大,是主路由器,放弃自己的主路由器身份,使用R2的序列号交互后续DD报文,并将邻居状态标记为Exchange状态,发送序列号为y的报文,携带摘要信息。
- R1使用R2的序列y发送DD报文是对接受到的序列为y的报文的确认。从路由器必须确认主路由器发送的任何DD报文。
- R2收到R1的摘要信息DD报文,将邻居状态标记为Exchange状态,同时序列号+1,携带自己的摘要信息发送给邻居R1。
- 只有主路由器可以对序列号进行+1操作。
- 双方的LSDB摘要信息发完之后,进入Loading状态,通过LSR,LSU,LSack获得确实的详细LSA信息。
- 双方LSDB数据库同步完成后,邻居进入到Full状态。
6.8.3 邻居状态机
- Down状态:在邻居失效时间内没有收到邻居的任何OSPF报文,则认为邻居处于Down状态,不在邻居表中显示。
- Attempt状态:NBMA网络中,需要手工指定邻居的地址,该网络Hello报文的目的地址是单播地址。本端将发送Hello报文尝试与对端建立邻居关系,此时邻居状态处于Attempt状态。
- Init状态:收到的Hello报文中不存在自己的Router ID,则邻居状态标记为init状态。
- 2-way状态:收到的Hello报文中包含了自己的Router ID,则邻居状态标记为2-way状态。
- Exstart状态:开始进行主从选举的状态(空的DD报文)
- Exchange状态:主从选举完成后,开始交互LSDB的摘要信息(DD报文中携带摘要信息)
- Loading状态:完成交互摘要信息进入Loading状态,通过LSR,LSU,LSack同步LSDB的过程
- Full状态:已经完成了LSDB的同步,则邻居状态标记为Full状态。
6.8.4 OSPF网络类型
- OSPF的网络类型是一个接口变量,即在接口下配置。不同的网络类型影响接口的对报文的操作。
- 接口默认的网络类型由接口的默认的链路层协议决定。
- 接口链路是以太网链路,则接口默认OSPF的网络类型是Broadcast网络
- 接口链路是FR(帧中继协议),则接口默认的OSPF网络类型是NBMA网络
- 接口链路是PPP链路,则接口的OSPF的网络类型是P2P网络类型
- 没有任何链路的默认OSPF网络类型是P2MP类型,需要通过NBMA网络进行修改。
- 不同OSPF网络类型对报文的处理方式不同:
- 广播类型:组播周期默认10s发送Hello报文,单播发送DD报文
- NBMA类型:单播周期默认30s发送Hello报文,单播发送其他报文。
- P2P类型:组播周期10s发送Hello报文,组播发送其他报文。
- P2MP:组播周期30s发送Hello报文,单播发送其他报文。
6.8.5 DR和BDR
- DR和BDR的作用:只有MA网络中需要(BMA和NBMA)
- 减少邻接关系,进而减少系统的资源消耗。
- 减少LSA的泛洪,进而减少对带宽资源的消耗。
- 选举过程:
- 两边同时配置,各自通过Hello报文收集可以参选DR的设备Router ID
- Hello时间的4倍时间中选举DR
- 通过比较优先级,越大越优,0不参选,(如果优先级相同,比较Router ID,越大越优)最优的成为BDR,进而成为DR
- 在剩余的可参选设备中选举一个最优的成为BDR
- 当DR失效,BDR感知到后,立即成为DR设备,不支持抢占(已选定的不便,除非设备故障)。
- 角色:DR、BDR、DRother
- DRother与DRother之间维持在2-way
- 其他的角色之间维护Full邻居状态,DRother与DR、DRother与BDR、DR与BDR。
- 注意:DR是接口的特性,不是设备,被选举出DR的也是设备的接口,同一个设备可以是多个链路的DR。
6.8.6 单区域和多区域
- 路由器角色:
- ABR:区域边界路由器,路由器上至少有一个接口属于区域0,且至少有一个接口属于非0区域。
- ASBR:连接OSPF域外的AS的路由器。
- 多区域的作用:
- 将SPF计算最短路径树(拓扑)控制区域内,减少系统资源消耗
- 将其他区域的拓扑变化控制在其他区域内,不影响本区域的最短路径树计算。