OSPF 协议

621 阅读4分钟

概述

OSPF 协议通过两两路由器之间分享链路状态信息,构建 LSDB。通过 LSDB,生成路由表

拓扑图

ospf.jpg

邻居建立

两台路由器之间建立邻居关系,方便分享链路状态

TIME(second)SRC(源 IP 地址)DEST(组播)Active NeighborDR BDRSRC DEST 状态Info
010.0.12.1224.0.0.50.0.0.00.0.0.0 0.0.0.0Down InitHello Packet
010.0.12.2224.0.0.50.0.0.00.0.0.0 0.0.0.0Init InitHello Packet
经过一轮报文交换,即确定了 Neighbor
1010.0.12.2224.0.0.510.0.12.10.0.0.0 0.0.0.0Init 2WayHello Packet
1010.0.12.1224.0.0.510.0.12.20.0.0.0 0.0.0.02Way 2WayHello Packet
2010.0.12.1224.0.0.510.0.12.20.0.0.0 0.0.0.02Way 2WayHello Packet
2010.0.12.2224.0.0.510.0.12.10.0.0.0 0.0.0.02Way 2WayHello Packet
3010.0.12.1224.0.0.510.0.12.20.0.0.0 0.0.0.02Way 2WayHello Packet
3010.0.12.2224.0.0.510.0.12.10.0.0.0 0.0.0.02Way 2WayHello Packet
4010.0.12.1224.0.0.510.0.12.20.0.0.0 0.0.0.02Way 2WayHello Packet
4010.0.12.2224.0.0.510.0.12.10.0.0.0 0.0.0.02Way 2WayHello Packet
40s 一到,路由器的某个接口会根据收到的此网段内所有的 hello 报文,计算出 DR 和 BDR
4010.0.12.1224.0.0.510.0.12.210.0.12.2 0.0.0.02Way 2WayHello Packet
4010.0.12.2224.0.0.510.0.12.110.0.12.2 10.0.12.12Way 2WayHello Packet
DR 和 DBR 已经计算出来,下面开始进行 LSA 报文交换
虽然 DBR 计算出来,但是每个路由器不一定都一样,但不影响下面进行的 LSA 报文交换(有 DR 接口就行)
---- 此处省略 LSA 报文交换的过程,详见下个标题
再经过 hello 报文的洗礼,这时候 DBR 就趋于同一了
5010.0.12.1224.0.0.510.0.12.210.0.12.2 10.0.12.1Full FullHello Packet
5010.0.12.2224.0.0.510.0.12.110.0.12.2 10.0.12.1Full FullHello Packet

邻接交换状态信息

建立邻居关系的路由器,通过一些列报文交换信息,最终达成链路状态同步

TIME(second)SRC(源 IP 地址)DEST(组播)Init More MasterSRC DEST 状态SequenceInfo
4110.0.12.110.0.12.2yes yes yesExStart ExStartxDB Description
4210.0.12.210.0.12.1yes yes yesExchange ExStartxDB Description
经过上述操作,确定主次关系。InIt 代表 第一个报文,More 代表是否还有报文,Master 代表自己是否为主
4310.0.12.110.0.12.2no no noExchange ExchangexDB Description LSA
4310.0.12.210.0.12.1no no yesExchange ExchangexDB Description LSA
经过上述操作,交换了简要 LSA。
只要收到了对方的简要 LSA,比较之后,可立即发起 LS Request
具体报文见下一个个表格展示
5010.0.12.110.0.12.2no no noFull Fullx+1DB Description ACK
Slave 给 Master 发 ACK 确定。这里假设 LSDB 同步完成,所以两台路由器都是 Full 状态
TimeSRCDESTContentInfo
4410.0.12.210.0.12.1【Router-LSA(1)】【Link State ID=10.0.1.1】【 Advert Router=10.0.1.1】LS Request
4410.0.12.110.0.12.2【Router-LSA(1)】【Link State ID=10.0.1.2】【 Advert Router=10.0.1.2】LS Request
4410.0.12.2224.0.0.5【Router-LSA(1)】= {Links = [{Type: Sub, ID: 10.0.12.0, Data: 255.255.255.0, Metric: 1}]}LS Update
4410.0.12.1224.0.0.5【Router-LSA(1)】= {Links = [{Type: Sub, ID: 10.0.12.0, Data: 255.255.255.0, Metric: 1}]}LS Update
44s 两端分别发起 Request,并同时主动 update 当前 LSA,路由器状态由 Exchange 切为 Loading
当前 LSA 的内容,主要描述自己的链路状态,这里每个路由器只有一个链路或者说接口,类型为 Sub
Sub 网络,ID代表 网络号,Data代表子网掩码,Metric代表度量值
4510.0.12.110.0.12.2【Router-LSA(1)】= {Links = [{Type: Transit, ID: 10.0.12.2, Data: 10.0.12.1, Metric: 1}]}LS Update
4510.0.12.210.0.12.1【Router-LSA(1)】= {Links = [{Type: Transit, ID: 10.0.12.2, Data: 10.0.12.2, Metric: 1}]}LS Update
45s Update 的内容主要是 Links 里 Sub 网络 变为 Transit 类型
因为 44s 组播 Update,每个路由器都会更新自己的 Sub 网络为 Transit 网络
Transit 网络,ID 代表 DR 接口地址,Data 代表自己发出报文的接口地址,Metric 代表度量值
4610.0.12.2224.0.0.5【Network-LSA(2)】= {Link State ID: 10.0.12.2, Advert Router: 10.0.1.2, NetMask: 255.255.255.0, Attached Router: [10.0.1.2, 10.0.1.1]}LS Update
46s 是 DR接口的路由器发出的,因为它根据 Transit 计算出了一个网络,主动组播发出去,也只有 DR接口的路由器有权利发出Network-LSA 类型的报文
下面便是 一些 LS Ack 报文,不再描述,最终路由器状态由 Loading 变成 Full

生成 SPT 最短路径树

经过多个周期交换,一个路由器总会持有对整个网络的链路状态信息,称为 LSDB 路由器 R01 的 LSDB 内容如下:

TypeLinkState IDAdvRouterAgeLenSeqMetricSelf
Router10.0.1.110.0.1.11514360011yes
Router10.0.1.210.0.1.21152360021no
Network10.0.12.210.0.1.21152320030no

路由器 R02 的 LSDB 内容如下:

TypeLinkState IDAdvRouterAgeLenSeqMetricSelf
Router10.0.1.210.0.1.21514360011yes
Network10.0.12.210.0.1.21152320030yes
Router10.0.1.210.0.1.21152360021no

生成路由

每个路由器的 LSDB 内容,可以构建一棵树。Router 可以理解成节点,Network 理解成边

也可以理解 LSDB内容为一个矩阵。Router 可以理解成每个元素,Network 理解成二元无序组,这样就可以构成一个无序图,也就是一个矩阵

通过 LSDB 生成一个以自己为根的最短生成树,到每个节点的路径就是路由

在这个例子中,是没有 OSPF 路由生成的,因为都是直连链路,默认路由的优先级高于 OSPF 的