OSPF
OSPF协议的产生有很大一部分原因是为了解决RIP的问题
RIP的缺陷
- 最大跳数限制了网络规模
- 以跳数为度量值无法准确判断最优路径
- 假设一条跳数多,但是带宽更大的反而开销小的情况
- 路由更新发送完整路由表消耗网络带宽
- 手链速度慢
- 协议会产生路由自环
OSPF定义
- 开放式最短路径优先,基于链路状态特征
- 工作在IP层,协议号89
他的存在解决了上面RIP几乎所有的问题,跳数问题就是RIP的问题之一,OSPF换了一种度量方式就是链路状态特征的方式
工作在IP层,只支持IP协议,不支持IPX协议
OSPF的工作流程
整体流程大概分为三步:

第一步:
建立邻居和邻接关系
1. 发送hello报文发现和建立邻居关系,组播地址224.0.0.5
当双方都配置好了OSPF后双方会发送一个hello报文,也叫做hllo报,用来打招呼,介绍自己是干嘛的,这个hello报文是通过组播发送的;这个组播地址是224.0.0.5,意味着只有配置了OSPF的路由器要监听这个地址,如果没有运行OSPF就收不到这个消息;所以把广播改成组播的好处就是可以避免一些不相关的人收到消息
成为邻居关系也要满足三个条件:
1). 双方接口处于UP状态
2). 双方接口IP地址在同一网段
3). 双方接口在同一区域
2. 选举DR/BDR,建立邻居关系
除了建立邻居关系外还要建立邻接关系,如果单纯只是邻居关系是走不到下一步的,邻居只能是单单住在隔壁的关系;邻居只是一种认识关系,还不算"好朋友"的关系,所以需要建立邻接关系;
似乎很麻烦,建立了邻居关系,还要建立邻接关系,感觉多此一举,实则不然,如果有以下情况:
每个路由器都配置了ospf,那么他们互相是邻居,如果直接发送路由,那么R3会收到从三台路由器发来的不同路由信息,然后就疯掉了,所以不可以直接发送

所以需要建立邻接关系,在建立玩邻居关系后,路由器之间会推选出一个路由器作为代表,算作指定路由器简称DR,所有路由会把自己知道的路由信息都告诉给DR,DR收集完信息后再把路由通告给网上的其他路由器
在选举DR路由器的同时还会选举出备用路由器叫做BDR,作用就是当DR挂了之后接替DR来工作
DR工作的时候:
1). DRother(指的就是既不是DR也不是BDR的路由器)与DR建立邻接关系
2).DRohter与BDR建立邻接关系
3).DR与BDR建立邻接关系
4).两个DRother之间保持邻居关系
选举的目的就是为了让整个网络的通信更加的有序
DR/BDR选举
- 选举原因
- 广播网络中使路由信息交换更加高速有序
- 选举范围
- 每条广播链路上都需要选举出一个DR和一个BDR
- 并非是汇总所有配置OSPF路由之后再集体选举

意思大概是这样的,一个路由器在一个网段可能是DR,但在另外一个网段是BDR,一个路由器可以在不同网段是不同的角色,在每个网段都是要选举出DR和BDR的

如果两台路由器通过串口(S口)连接,那么他就是一个点到点电路(PPP)所以不需要选举出DR和BDR,因为点到点网络就他俩,没有第三个人所以不影响;
如果将中间的链接线换成以太网的双绞线,那么依旧是要选择DR和BDR的,因为这就是一个广播链路了,路由器也不知道这个链路有多少设备;
所以OSPF根本不看网段内有多少设备,而是看网络类型,通过判断是广播网络还是点到点网络来决定是否选举
- 选举原则
- 1.优先级数字大的优先
- 优先级出厂默认值是1,可以手动改
- 2.Router-id大的优先
- 1.优先级数字大的优先
- Routher-id
- 简称RID是用来标识路由器的身份
- 产生方法:1.要么通过手动配置一个ipv4地址作为RID,这里配置IPV4不一定需要这个地址真实存在,只是作为一个标识
- 2.选举
- 1.在所有环回口中选举IP地址最大的作为RID
- 2.在所有物理接口中选举IP地址最大的作为RId
- 建议手动配置一个本地环回口的IP地址作为RID
第二步
邻接路路由器之间交换链路状态信息,实现区域内链路状态数据库同步
- 相关概念
- 链路状态通告
- LSA(英文简写)
- 用来描述路由器的接口、路由条目的相关信息

- 链路状态通告
例如上图,路由器有四个接口,假设都用OSPF宣告后,OSPF会将每个接口上宣告信息:IP地址,子网掩码,cos值,描述角色等信息的情报描述成一条LSA

邻接路由器不是给他传递路由,而是将自身的所有LSA都传递给它;和RIP的区别就是:RIP是直接通告路由,那么收到的路由器就没有选择权,而是只能找对应通告路由的路由器来找到目的地;而OSPF是类似于传递的是地图,每个路由器最终会获得一份完整的地图,这样每个路由器想要到达目的地就自己选择怎么走,而不是再去找给他传递路径的路由器;上述的区别也是距离矢量协议和链路状态协议的区别
-
链路状态数据库
-
LSDB
-
存储本地所有LSA
-
这就是前面提到了类似于地图的东西,方便每个路由器自己做路由选择
- 工作流程有四步:
- 1.向邻接路由器发送DD(数据库描述报文)报文,通告本地LSDB中所有LSA的摘要信息
- 2.收到DD后,与本地的LSDB对比,向发对方发送LSR报文,请求发送本机所需的LSA
- 3.收到LSR后,把对方所需的LSA的完整信息打包为一条LSU报文,发送至对方
- 4.收到LSU后,向对方回复LSAck报文,进行确认
第三步
每台路路由器根据本机链路状态数据库,计算到达每个目的网段的最优路由,写入路由表
OSPF报文类型
- Hello报文
- 建立连接后,会每隔十秒再发一次,确认存货,超过四次没收到就判定对面挂了
- DD报文
- 数据库描述报文
- 用于描述本地LSDB中所有LSA的摘要
- LSR报文
- 链路状态请求
- LSU报文
- 链路状态更新
- LSAck报文
- 链路状态确认
OSPF分区域管理
分区域的原因
- 加快收敛速度
- 当某个设备挂掉后,网络从不稳定到稳定的过程叫做收敛
- 把网络故障隔离在区域内部
- 前面说过需要同步LSDB,所以如果区域过大就会导致同步过慢,如果分区就可以只让每个区域内的LSDB同步,减小工作难度
那么此时就似乎出现了问题,似乎跨区域不能互通

但是这里其实多了一个新角色,叫做区域边界路由器,ABR,他会将某一个区域的LSDB汇总后统一发送给相邻的区域
路由器角色
- IR
- 内部路由器
- 所有接口都处于同一个区域
- ABR
- 区域边界路路由器
- 链接不同区域的路由器
- ASBR
- 自制系统边界路由器
- 连接外部自制系统的路由器
如果左上角的那个路由器连接的是其他自制系统,比如rip,那么他就是自制系统边界路由器

区域类型
- 骨干区域
- 只能由一个关区域,一般是区域0
- 骨干区域必须是连续的
- 非骨干区域
- 除了骨干区域都叫非骨干区域
- 非骨干区域必须连接到骨干区域
- 两个非骨干区域的互通必须经过骨干区域
- 这样做是为了区域之间防环,因为区域边界路由器是类似距离矢量路由协议,不加限制就会环
实验部分
实验拓扑如下:

配置IP
每段/32的ip地址是用来做router-id的,都配置给环回口,就是下面的l0
首先配置ip地址
[R1]int g0/0
[R1-GigabitEthernet0/0]ip add 100.1.1.1 24
[R1-GigabitEthernet0/0]int l0
[R1-LoopBack0]ip add 1.1.1.1 32
[R2]int g0/0
[R2-GigabitEthernet0/0]ip add 100.1.1.2 24
[R2-GigabitEthernet0/0]int g0/1
[R2-GigabitEthernet0/1]ip add 100.2.2.2 24
[R2-GigabitEthernet0/1]int l0
[R2-LoopBack0]ip add 2.2.2.2 32
[R3]int g0/0
[R3-GigabitEthernet0/0]ip add 100.2.2.3 24
[R3-GigabitEthernet0/0]int g0/1
[R3-GigabitEthernet0/1]ip add 100.3.3.3 24
[R3-GigabitEthernet0/1]int l0
[R3-LoopBack0]ip add 3.3.3.3 32
[R4]int g0/0
[R4-GigabitEthernet0/0]ip add 100.3.3.4 24
[R4-GigabitEthernet0/0]int g0/1
[R4-GigabitEthernet0/1]ip add 100.4.4.4 24
[R4-GigabitEthernet0/1]int l0
[R4-LoopBack0]ip add 4.4.4.4 32
[R5]int g0/0
[R5-GigabitEthernet0/0]ip add 100.4.4.5 24
[R5-GigabitEthernet0/0]int l0
[R5-LoopBack0]ip add 5.5.5.5 32

中间框内就是area 0,左侧是area 1
R1上配置ospf,先进入ospf进程,如果不选数字,默认是1进程,然后指定router-id然后选择区域,左侧实在area 1区域
[R1]ospf router-id 1.1.1.1
[R1-ospf-1]area 1
[R1-ospf-1-area-0.0.0.1]#这里进入0.0.0.1是区域号,是以ip地址形式展现的
[R1-ospf-1-area-0.0.0.1]net 100.1.1.0 0.0.0.255 #后面0开头的是反掩码,正名叫掩码通配符
[R1-ospf-1-area-0.0.0.1]net 1.1.1.1 0.0.0.0
掩码通配符的作用是基于ospf逻辑来的,因为ospf在宣告匹配的时候是一个个匹配的,0的部分是必须要匹配的,1的部分是不需要完全匹配的,计算方法一般是用全1减去子网掩码,但是有个小tips:在比较难算反掩码的时候,可以直接宣告对应接口的ip地址,然后反掩码接0.0.0.0来实现精准匹配
这里的环回地址一般是不用宣告的,他本身就不存在,所以宣不宣告都没有问题,但是工作中,一般telnet连接设备的时候都是连接环回口,这样方便连接,所以这里还是宣告一下
R2:
[R2]ospf router-id 2.2.2.2
[R2-ospf-1]area 1
[R2-ospf-1-area-0.0.0.1]net 100.1.1.0 0.0.0.255
[R2-ospf-1-area-0.0.0.1]area 0
[R2-ospf-1-area-0.0.0.0]net 100.2.2.0 0.0.0.255
[R2-ospf-1-area-0.0.0.0]net 2.2.2.2 0.0.0.0
这里R2情况比较复杂, 左右两侧在不同的区域不能宣告错了,环回口的ip宣告一般可以随心选择,最好选择靠近骨干区域的
R3:
[R3]ospf router-id 3.3.3.3
[R3-ospf-1]area 0
[R3-ospf-1-area-0.0.0.0]net 100.2.2.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0]net 100.3.3.0 0.0.0.255
[R3-ospf-1-area-0.0.0.0]net 3.3.3.3 0.0.0.0
R4:
[R4]ospf router-id 4.4.4.4
[R4-ospf-1]area 0
[R4-ospf-1-area-0.0.0.0]net 100.3.3.0 0.0.0.255
[R4-ospf-1-area-0.0.0.0]net 4.4.4.4 0.0.0.0
[R4-ospf-1-area-0.0.0.0]area 2
[R4-ospf-1-area-0.0.0.2]net 100.4.4.0 0.0.0.255
R5:
[R5]ospf router-id 5.5.5.5
[R5-ospf-1]area 2
[R5-ospf-1-area-0.0.0.2]net 100.4.4.0 0.0.0.255
[R5-ospf-1-area-0.0.0.2]net 5.5.5.5 0.0.0.0
此时配置完成,可以在R2上查看邻居关系
[R2]display ospf peer
这就是他的两个邻居,后面的FULL表示进入了邻接状态,如果显示的是2-Way是表示还在邻居状态,但是在这个拓扑中不会存在邻居关系,因为除非是一个网段中存在多个路由器才会存在邻居关系

在R5上ping100.1.1.1,发现通过,配置成功

通过用[R5-ospf-1]display ospf routing可以查看ospf路由表
