概述
OSPF 协议通过两两路由器之间分享链路状态信息,构建 LSDB。通过 LSDB,生成路由表
拓扑图
邻居建立
两台路由器之间建立邻居关系,方便分享链路状态
| TIME(second) | SRC(源 IP 地址) | DEST(组播) | Active Neighbor | DR BDR | SRC DEST 状态 | Info |
|---|---|---|---|---|---|---|
| 0 | 10.0.12.1 | 224.0.0.5 | 0.0.0.0 | 0.0.0.0 0.0.0.0 | Down Init | Hello Packet |
| 0 | 10.0.12.2 | 224.0.0.5 | 0.0.0.0 | 0.0.0.0 0.0.0.0 | Init Init | Hello Packet |
| 经过一轮报文交换,即确定了 Neighbor | ||||||
| 10 | 10.0.12.2 | 224.0.0.5 | 10.0.12.1 | 0.0.0.0 0.0.0.0 | Init 2Way | Hello Packet |
| 10 | 10.0.12.1 | 224.0.0.5 | 10.0.12.2 | 0.0.0.0 0.0.0.0 | 2Way 2Way | Hello Packet |
| 20 | 10.0.12.1 | 224.0.0.5 | 10.0.12.2 | 0.0.0.0 0.0.0.0 | 2Way 2Way | Hello Packet |
| 20 | 10.0.12.2 | 224.0.0.5 | 10.0.12.1 | 0.0.0.0 0.0.0.0 | 2Way 2Way | Hello Packet |
| 30 | 10.0.12.1 | 224.0.0.5 | 10.0.12.2 | 0.0.0.0 0.0.0.0 | 2Way 2Way | Hello Packet |
| 30 | 10.0.12.2 | 224.0.0.5 | 10.0.12.1 | 0.0.0.0 0.0.0.0 | 2Way 2Way | Hello Packet |
| 40 | 10.0.12.1 | 224.0.0.5 | 10.0.12.2 | 0.0.0.0 0.0.0.0 | 2Way 2Way | Hello Packet |
| 40 | 10.0.12.2 | 224.0.0.5 | 10.0.12.1 | 0.0.0.0 0.0.0.0 | 2Way 2Way | Hello Packet |
| 40s 一到,路由器的某个接口会根据收到的此网段内所有的 hello 报文,计算出 DR 和 BDR | ||||||
| 40 | 10.0.12.1 | 224.0.0.5 | 10.0.12.2 | 10.0.12.2 0.0.0.0 | 2Way 2Way | Hello Packet |
| 40 | 10.0.12.2 | 224.0.0.5 | 10.0.12.1 | 10.0.12.2 10.0.12.1 | 2Way 2Way | Hello Packet |
| DR 和 DBR 已经计算出来,下面开始进行 LSA 报文交换 | ||||||
| 虽然 DBR 计算出来,但是每个路由器不一定都一样,但不影响下面进行的 LSA 报文交换(有 DR 接口就行) | ||||||
| ---- 此处省略 LSA 报文交换的过程,详见下个标题 | ||||||
| 再经过 hello 报文的洗礼,这时候 DBR 就趋于同一了 | ||||||
| 50 | 10.0.12.1 | 224.0.0.5 | 10.0.12.2 | 10.0.12.2 10.0.12.1 | Full Full | Hello Packet |
| 50 | 10.0.12.2 | 224.0.0.5 | 10.0.12.1 | 10.0.12.2 10.0.12.1 | Full Full | Hello Packet |
邻接交换状态信息
建立邻居关系的路由器,通过一些列报文交换信息,最终达成链路状态同步
| TIME(second) | SRC(源 IP 地址) | DEST(组播) | Init More Master | SRC DEST 状态 | Sequence | Info |
|---|---|---|---|---|---|---|
| 41 | 10.0.12.1 | 10.0.12.2 | yes yes yes | ExStart ExStart | x | DB Description |
| 42 | 10.0.12.2 | 10.0.12.1 | yes yes yes | Exchange ExStart | x | DB Description |
| 经过上述操作,确定主次关系。InIt 代表 第一个报文,More 代表是否还有报文,Master 代表自己是否为主 | ||||||
| 43 | 10.0.12.1 | 10.0.12.2 | no no no | Exchange Exchange | x | DB Description LSA |
| 43 | 10.0.12.2 | 10.0.12.1 | no no yes | Exchange Exchange | x | DB Description LSA |
| 经过上述操作,交换了简要 LSA。 | ||||||
| 只要收到了对方的简要 LSA,比较之后,可立即发起 LS Request | ||||||
| 具体报文见下一个个表格展示 | ||||||
| 50 | 10.0.12.1 | 10.0.12.2 | no no no | Full Full | x+1 | DB Description ACK |
| Slave 给 Master 发 ACK 确定。这里假设 LSDB 同步完成,所以两台路由器都是 Full 状态 |
| Time | SRC | DEST | Content | Info |
|---|---|---|---|---|
| 44 | 10.0.12.2 | 10.0.12.1 | 【Router-LSA(1)】【Link State ID=10.0.1.1】【 Advert Router=10.0.1.1】 | LS Request |
| 44 | 10.0.12.1 | 10.0.12.2 | 【Router-LSA(1)】【Link State ID=10.0.1.2】【 Advert Router=10.0.1.2】 | LS Request |
| 44 | 10.0.12.2 | 224.0.0.5 | 【Router-LSA(1)】= {Links = [{Type: Sub, ID: 10.0.12.0, Data: 255.255.255.0, Metric: 1}]} | LS Update |
| 44 | 10.0.12.1 | 224.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代表度量值 | ||||
| 45 | 10.0.12.1 | 10.0.12.2 | 【Router-LSA(1)】= {Links = [{Type: Transit, ID: 10.0.12.2, Data: 10.0.12.1, Metric: 1}]} | LS Update |
| 45 | 10.0.12.2 | 10.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 代表度量值 | ||||
| 46 | 10.0.12.2 | 224.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 内容如下:
| Type | LinkState ID | AdvRouter | Age | Len | Seq | Metric | Self |
|---|---|---|---|---|---|---|---|
| Router | 10.0.1.1 | 10.0.1.1 | 1514 | 36 | 001 | 1 | yes |
| Router | 10.0.1.2 | 10.0.1.2 | 1152 | 36 | 002 | 1 | no |
| Network | 10.0.12.2 | 10.0.1.2 | 1152 | 32 | 003 | 0 | no |
路由器 R02 的 LSDB 内容如下:
| Type | LinkState ID | AdvRouter | Age | Len | Seq | Metric | Self |
|---|---|---|---|---|---|---|---|
| Router | 10.0.1.2 | 10.0.1.2 | 1514 | 36 | 001 | 1 | yes |
| Network | 10.0.12.2 | 10.0.1.2 | 1152 | 32 | 003 | 0 | yes |
| Router | 10.0.1.2 | 10.0.1.2 | 1152 | 36 | 002 | 1 | no |
生成路由
每个路由器的 LSDB 内容,可以构建一棵树。Router 可以理解成节点,Network 理解成边
也可以理解 LSDB内容为一个矩阵。Router 可以理解成每个元素,Network 理解成二元无序组,这样就可以构成一个无序图,也就是一个矩阵
通过 LSDB 生成一个以自己为根的最短生成树,到每个节点的路径就是路由
在这个例子中,是没有 OSPF 路由生成的,因为都是直连链路,默认路由的优先级高于 OSPF 的