分析路由协议的的步骤:
1、范围,属于IGP
2、属于链路状态协议LSP
3、无类路由协议,支持VLSM CIDR
4、封装,封装在IP协议中,协议字段值为89
5、组播地址,224.0.0.5和224.0.0.6
首先搞清楚文字上的区别:
形成邻接关系的可以互相交互LSA,而邻居是可以交换HELLO数据包,但只有形成邻接关系后
才可以交互LSA
OSPF工作的过程如下:
发送HELLO包(在邻居之间)-->形成邻接关系-->建立邻居表-->交互LSA(包含路由和拓扑信息)-->
建立拓扑表LSDB-->通过SPF计算-->计算出最佳路由放入路由表中
DV协议与LS协议的区别:
DV协议是基于其邻居路由器传送的路由信息来形成本身的路由表,也就是基于传闻。所以有能该路由是不可达也会出现在路由表中。
LS协议是基于其邻居路由器传送的拓扑信息来形成拓扑数据库,在一个区域内的路由器都会收敛
为一致的LSDB,也就是在这个区域内的所有路由器都知道去往目的地的一致的拓扑信息。通过SPF算法
计算出来的路由,一定是可以到达的哦!
层次化的特点:
1、减少路由表的条目-->域间汇总(手工配置)
2、拓扑变化限制在一个区域内
3、LSA的类型不同,传播的范围也不同
非骨干区域必须连入骨干区域,这才是比较好的设计哦!
两大网络类型:
1、P2P类型
2、MA类型
LSA的泛洪过程:
支持周期更新(30分钟),也支持触发更新,LSDB的老化时间是60分钟
接收到一个LSA,先查看是否是新的路由的LSA,如果是,就添加到LSDB中,并发送一个LSAck
并泛洪LSA到其他邻居,然后进行SPF算法。
如果不是新的路由,看是否是更新的路由,是的话,看序列号是高的话,添加到LSDB
序列号低的话,将自己的LSA,发送给源端
若序列号相同的话,就忽略掉它。
序列号(4byte):0x80000001(min)0x7fffffff(max)
OSPF的报文:
1、Hello
2、DBD LSA数据库描述,通过序列号来确认,是隐式确认
3、LSR 请求
4、LSU 更新
5、LSAck 用来对LSU的确认,显式确认
对于DBD的描述:其实就是LSA的摘要,一个LSA的简单描述。在前期交互的,为了节约链路带宽
当接收到DBD,看缺了哪些路由条目,就发送LSR,请求缺少的路由条目。接收到LSR后,回复LSU
OSPF的报文格式:
version:v2 用于IPv4,v3 用于IPv6
type:1-->hello 2-->DBD 3-->LSR 4-->LSU 5-->LSAck
packet length:OSPF报文长度
RouterID:1、手工指定(推荐)2、环回口接口IP最大 3、物理接口IP最大
AreaID:
校验和:
认证类型:0无认证 1明文认证 2密文认证(MD5)
认证密钥:
data:
Hello报文的data内容:
*表示建立邻接关系的条件
*hello和dead时间 10s/30s (不同的网络类型有不同的时间间隔) dead时间是4倍的hello时间
*AreaID
*密钥(需要一致)
*stub标识(需要一致)
建立邻接关系的过程:
down-发送hello->init-邻居回复hello->two-way(收到带有自己的RID的hello包)
接下来需要分情况说明了
如果是MA网络的话,需要接着选举DR和BDR,而选举这段时间就是wait时间,也是4倍的hello时间
如果是P2P网络,直接进入下一个环节
接着就到了exstart,这个阶段就是交换firstDBD,为了选出主从关系,只有主路由器在后续状态里
可以发送DBD,主路由器的选举就是需要高RID的路由器来当选
First DBD的三个字段:i m m/s
i:init,置1的话,代表第一个DBD
m:more,置1的话,代表有更多的报文
M/S:master/slave,置1的话,就是主路由器
上图就是交换DBD,选出主从关系的过程
进入exchange状态,开始交换正常的DBD,然后进入loading状态,通过发送LSR和回复LSU来完成
更新,完成收敛,最后的状态就是full,就是收敛完成
实验拓扑:
预配:
R1:
interface e0/0
ip add 12.1.1.1 255.255.255.0
no shut
interface lo0
ip add 1.1.1.1 255.255.255.0
no shut
R2:
interface e0/1
ip add 12.1.1.2 255.255.255.0
no shut
interface s1/0
ip add 23.1.1.2 255.255.255.0
no shut
interface lo0
ip add 2.2.2.2 255.255.255.0
R3:
interface s0/1
ip add 23.1.1.3 255.255.255.0
no shut
interface lo0
ip add 3.3.3.3 255.255.255.0
为了能看到整个的状态机变化过程,我们开启debug ip ospf packet debug ip ospf adj
debug ip ospf packet 开启查看交换ospf报文功能
debug ip ospf adj 开启查看邻接关系建立过程
R2:
router ospf 110 //110就是进程号,邻居之间可以不同
router-id 2.2.2.2 //整个建议开局就预配,建议手工配置
network 23.1.1.0 0.0.0.255 area 0
R3:
router ospf 90
router-id 3.3.3.3
network 23.1.1.0 0.0.0.255 area 0
debug是在R2上开启的
*Mar 1 00:18:31.811: OSPF: Interface Serial1/0 going Up
*Mar 1 00:18:31.831: OSPF: rcv. v:2 t:1 l:48 rid:3.3.3.3
aid:0.0.0.0 chk:E290 aut:0 auk: from Serial1/0
*Mar 1 00:18:31.831: OSPF: 2 Way Communication to 3.3.3.3 on Serial1/0, state 2WAY
*Mar 1 00:18:31.831: OSPF: Send DBD to 3.3.3.3 on Serial1/0 seq 0x21E0 opt 0x52 flag 0x7 len 32
*Mar 1 00:18:31.867: OSPF: rcv. v:2 t:2 l:32 rid:3.3.3.3
aid:0.0.0.0 chk:8AA5 aut:0 auk: from Serial1/0
*Mar 1 00:18:31.867: OSPF: Rcv DBD from 3.3.3.3 on Serial1/0 seq 0x154F opt 0x52 flag 0x7 len 32 mtu 1500 state
解析:
rcv代表接收了报文,v2版本是2 t类型是1,也就是hell0包,l就是报文长度48字节
rid为3.3.3.3,也就是R3发过来的
aid为区域ID为0 chk就是校验和 aut:认证类型为0,无认证
接着就进入了2way状态了,发送DBD到3.3.3.3 序列号0x21E0 flag 0x7
自己也接收到了DBD,序列号0x154F,flag 0x7 MTU1500
EXSTART
*Mar 1 00:18:31.867: OSPF: NBR Negotiation Done. We are the SLAVE
*Mar 1 00:18:31.867: OSPF: Send DBD to 3.3.3.3 on Serial1/0 seq 0x154F opt 0x52 flag 0x0 len 32
*Mar 1 00:18:31.879: OSPF: rcv. v:2 t:2 l:52 rid:3.3.3.3
aid:0.0.0.0 chk:A0DB aut:0 auk: from Serial1/0
*Mar 1 00:18:31.879: OSPF: Rcv DBD from 3.3.3.3 on Serial1/0 seq 0x1550 opt 0x52 flag 0x3 len 52 mtu 1500 state
进入exstart状态,因为完成了一次DBD交互后,对比各自的RID,R2知道自己只能是slave了
发送DBD 序列号为0x154F,flag 0x2
接收DBD 序列号为0x1550,flag 0x3 MTU1500
至此,我们完成了主从关系的选举
EXCHANGE
*Mar 1 00:18:31.883: OSPF: Send DBD to 3.3.3.3 on Serial1/0 seq 0x1550 opt 0x52 flag 0x0 len 32
*Mar 1 00:18:31.899: OSPF: rcv. v:2 t:2 l:32 rid:3.3.3.3
aid:0.0.0.0 chk:8AA9 aut:0 auk: from Serial1/0
*Mar 1 00:18:31.899: OSPF: Rcv DBD from 3.3.3.3 on Serial1/0 seq 0x1551 opt 0x52 flag 0x1 len 32 mtu 1500 state EXCHANGE
进入exchange状态,发送DBD,开始交换正常的DBD
*Mar 1 00:18:31.899: OSPF: Exchange Done with 3.3.3.3 on Serial1/0
*Mar 1 00:18:31.899: OSPF: Send LS REQ to 3.3.3.3 length 12 LSA count 1
*Mar 1 00:18:31.899: OSPF: Send DBD to 3.3.3.3 on Serial1/0 seq 0x1551 opt 0x52 flag 0x0 len 32
*Mar 1 00:18:31.927: OSPF: rcv. v:2 t:4 l:64 rid:3.3.3.3
aid:0.0.0.0 chk:F3B7 aut:0 auk: from Serial1/0
*Mar 1 00:18:31.927: OSPF: Rcv LS UPD from 3.3.3.3 on Serial1/0 length 64 LSA count 1
*Mar 1 00:18:31.927: OSPF: Synchronized with 3.3.3.3 on Serial1/0, state FULL
*Mar 1 00:18:31.927: %OSPF-5-ADJCHG: Process 110, Nbr 3.3.3.3 on Serial1/0 from LOADING to FULL, Loading Done
*Mar 1 00:18:32.315: OSPF: Build router LSA for area 0, router ID 2.2.2.2, seq 0x80000001
进入loading,开始交互LSR和LSU
最后进入full状态了
区域字段值的两种表示方法:
0----0.0.0.0
1----0.0.0.1
255----0.0.0.255
256----0.0.1.0
上面我们看到,在exstart状态的时候,交互的报文中含有mtu字段,如果MTU字段值不匹配的话
就停在exstart,不往下进化了哦!所以需要配置一个功能,忽略掉该匹配项
interface s1/0
ip ospf mtu-ignore
show ip ospf interface 查看哪些接口被宣告进OSPF进程中
R2#show ip ospf interface
Serial1/0 is up, line protocol is up
Internet Address 23.1.1.2/24, Area 0
Process ID 110, Router ID 2.2.2.2, Network Type POINT_TO_POINT, Cost: 64
Transmit Delay is 1 sec, State POINT_TO_POINT,
Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
oob-resync timeout 40
Hello due in 00:00:05
Supports Link-local Signaling (LLS)
Index 1/1, flood queue length 0
Next 0x0(0)/0x0(0)
Last flood scan length is 1, maximum is 1
Last flood scan time is 0 msec, maximum is 0 msec
Neighbor Count is 1, Adjacent neighbor count is 1
Adjacent with neighbor 3.3.3.3
Suppress hello for 0 neighbor(s)
可以show ip ospf interface brief 看简洁信息
R2#show ip ospf interface brief
Interface PID Area IP Address/Mask Cost State Nbrs F/C
Se1/0 110 0 23.1.1.2/24 64 P2P 1/1
COST值的计算:
10^8/带宽(bps)
R2#show ip route ospf
3.0.0.0/32 is subnetted, 1 subnets
O 3.3.3.3 [110/2] via 23.1.1.3, 00:00:41, Serial1/0
我想问的是2是怎么计算出来的呢?
控制层面的路由入接口COST相加之和
也就是R3的l0接口的COST+R2上的s1/0接口上COST之和
在上图的实验中,我们已经加R2和R3上的环回口的IP地址通告到OSPF路由进程
看到上图中的3.3.3.0/32是主机路由啊,为什么呢?
这是为了防止路由黑洞,那么怎么让它恢复正常的子网掩码呢?
interface l0
ip ospf network point-to-point
怎样修改hello和dead时间呢?
interface s1/0
ip ospf hello-interval 多少s
ip ospf dead-interval 多少s
DR和BDR的选举:
DR和BDR会监听224.0.0.6,而DRother监听224.0.0.5
1、选择较大的优先级
2、较大的RID
R1:
router ospf 110
router-id 1.1.1.1
network 12.1.1.0 0.0.0.255 area 0
network 1.1.1.0 0.0.0.255 area 0
interface l0
ip ospf network point-to-point
R1#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
2.2.2.2 1 FULL/DR 00:00:38 12.1.1.2 Ethernet0/0
这里R2成为了DR,而R1就是BDR了
在这里我们修改下R1上的e0/0的OSPF优先级
interface e0/0
ip ospf priority {0--255}
修改成一个较大的优先级,看是否会改变DR和BDR的角色
没有变化,说明在DR和BDR选举结束后,是不可抢占的
那怎么才能变化呢?
clear ip ospf process 输入yes,清除OSPF进程
预配
R1:
interface e0/0
ip add 100.1.1.1 255.255.255.0
no shut
interface lo0
ip add 1.1.1.1 255.255.255.0
no shut
R2:
interface e0/0
ip add 100.1.1.2 255.255.255.0
no shut
interface l0
ip add 2.2.2.2 255.255.255.0
no shut
R3:
interface e0/0
ip add 100.1.1.3 255.255.255.0
no shut
interface l0
ip add 3.3.3.3 255.255.255.0
no shut
先让R1和R2进行DR和BDR选举
R1:
router ospf 110
router-id 1.1.1.1
network 100.1.1.0 0.0.0.255 area 0
R2:
router ospf 110
router-id 2.2.2.2
network 100.1.1.0 0.0.0.255 area 0
R1#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
2.2.2.2 1 FULL/DR 00:00:32 100.1.1.2 Ethernet0/
R2当选为DR,R1当选为BDR,这个时候让R3运行OSPF协议
R3:
router ospf 110
router-id 3.3.3.3
network 100.1.1.0 0.0.0.255 area 0
R3#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
1.1.1.1 1 FULL/BDR 00:00:35 100.1.1.1 Ethernet0/0
2.2.2.2 1 FULL/DR 00:00:38 100.1.1.2 Ethernet0/0
R3就是一个DRother,现在假设R2down掉的话,DR和BDR选举是怎么变化的呢?
R3#show ip ospf neighbor
Neighbor ID Pri State Dead Time Address Interface
1.1.1.1 1 FULL/DR 00:00:34 100.1.1.1 Ethernet0/0
这里是R1变成了DR,而R3变为BDR。也就是说,当DR down掉后,BDR将充当DR角色,BDR重新进行选举
总结:DR和BDR是基于网段进行选举的路由器的接口