🕒 1. 概述
开放最短路径优先OSPF(Open Shortest Path First),是为克服RIP的缺点在1989年开发出来的。
- “开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的。
- "最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。
OSPF是一种基于链路状态选路算法的路由协议。
- 链路状态是指本路由器都和哪些路由器相邻,以及相应链路的"代价"(cost)
- "代价"的意思是费用、距离、时延、带宽等
思科路由器中OSPF协议计算代价的方法是:100Mb/s除以链路带宽
计算结果小于1的值仍记为1,大于1且有小数的,舍去小数。
使用OSPF的每个路由器都会产生链路状态通告LSA(Link Siate Adverisement),包含以下内容:
- 直连网络的链路状态信息
- 邻居路由器的链路状态信息
优点:
- 支持在多条等代价路由之间的负载均衡;
- 支持路由信息交换的认证;
- 可用作大型自治系统的内部路由协议。
- OSPF采用SPF算法计算路由,从算法上保证了不会产生路由环路
- OSPF不限制网络规模,更新效率高,收敛速度快
标准:
- RFC 2328:OSPF2
- RFC 5340:OSPF3,可用于 IPv6 网络
🕒 2. 相关概念
🕘 2.1 基本思想
- 将互联网络抽象成一个有向加权图(directed weighted graph)。
- 参与链路状态选路协议的路由器监测所连接网络的链路状态,并将链路状态信息发送给其他路由器,路由器将这些信息存入链路状态数据库LSDB中。
- 每台路由器根据LSDB构造出当前网络的完整拓扑图。
- 路由器在拓扑图上计算从自己出发到任一网络的最佳路由(最短路径),从而建立起自己的路由表。
- 可能发现到达一个目的地址的多条等代价路由。
- 所有路由器的链路状态数据库都保持同步。
🕘 2.2 区域及路由
为了使OSPF能够用于规模很大的网络,OSPF把一个自治系统再划分为若千个更小的范围,叫做区域(Area)。
区域:一组网络和连接到任一网络的路由器接口。
- 每个区域运行一个独立的链路状态选路算法,区域内部的网络拓扑结构在区域外不可见。
如果一个路由器的多个接口属于不同区域,它要为每个区域都运行一个链路状态选路算法,即OSPF协议实例。
例如图示网络中的R3、R4、R5和R8,都分属于两个区域,因而都要运行两个OSPF协议实例。
- 每个区域有一个
32
位的编号,可用类似于 IP 地址的点分十进制法表示,也可用一个十进制数表示。- 区域
0.0.0.0
是一个特殊的区域:主干区域(backbone area)。 - 其他区域称为非主干区域(non-backbone area)。
- 主干区域连通了非主干区域,为非主干区域之间提供传输服务。
- 区域
所有的非主干区域都要连接到主干区域上。主干区域和非主干区域通常采用星型结构连接:主干区域作为中心节点,非主干区域是边缘节点。
根据作用不同,路由器被划分为 4 种类型:
- 区域内路由器IR(internal router):所连接的网络都属于同一个区域。如R1,R2,R7,R9,R10。内部路由器只运行一个OSPF协议实例。
- 主干路由器BBR(backbone router):主干区域中的路由器。如R3,R4,R5,R6,R7,R8
- 区域边界路由器ABR(area border router):连接到多个区域,且必须连接到主干区域。如R3,R4,R5,R8。为每个连接的区域分别运行一个 OSPF 协议实例。
- 自治系统边界路由器ASBR(AS border router):与其他自治系统交换路由信息的路由器。如R6
一台路由器可以同时属于多种类型。
虚拟链路:
- 主干区域必须是连续的:所有区域边界路由器都能通过主干区域到达其他区域边界路由器。
- 若不满足,可配置虚拟链路(virtual link)使主干区域变成连续的。
- 图示网络中,主干区域中的路由器R3、R4、R6形成一个连通网络,R5、R7、R8形成另一个连通网络,但这两个网络在主干区域中没有连接,因而主干区域是不连续的。但R4和R5都连接到了区域3,它们在区域3中通过N4连接。这时,可以在主干区域中在R4和R5之间配置一条“虚拟链路”,使主干区域变成连续的;虚拟链路实际利用R4和R5在区域3中的物理连接来进行通信。
- 主干区域将虚拟链路看作是一个点到点链路,其传输代价就是非主干区域中连接虚拟链路两端路由器的路由的代价。
自治系统内的路由分为两个层次:区域内路由和区域间路由
🕘 2.3 链路状态数据库
- 链路状态选路算法把网络抽象成一个有向加权图。
- OSPF 的链路状态数据库是有向加权图在路由器中的表示。
- OSPF 为每个区域运行一个独立的链路状态选路算法;
- 路由器的一个链路状态数据库描述了所属区域的网络拓扑结构。
使用OSPF的每个路由器都有一个链路状态数据库LSDB,用于存储LSA。
OSPF 支持 5 种网络类型:
- 点到点网络(point-to-point):看作两条有向边。
- 虚拟链路(virtual link):也看作一个点到点网络。
- 点到多点网络(point-to-multipoint):看作一组点到点网络。
- 广播网络(broadcast)
- 非广播多址接入网络(Non-Broadcast Multi-Access,NBMA)
🕤 2.3.1 点到点网络
图示网络中,路由器RT1和RT2通过点到点网络连接。在链路状态数据库中,可以表示为RT1连接到RT2、RT2连接到RT1两条链路。图中的‘X’表示连接关系及其传输代价。
点到点网络的两个接口可以不用分配IP地址,如果分配了IP地址,OSPF就在链路状态数据库中增加相应的“末端链路”(stub link)。这里末端链路实际上表示的就是点到点网络上的对方。
🕤 2.3.2 点到多点网络
OSPF可以把非广播网络当作点到多点网络或非广播多址接入网络。区别是点到多点网络中,并非每对节点间都能直接通信(即有连接关系);而非广播多址接入网络中,每对节点都可以直接通信,但不支持在所有节点之间的广播通信。
图示网络中,四台路由器连接到点到多点网络N2上。链路状态数据库表示了它们之间的连接关系:RT3、RT6与所有路由器都有连接;RT4和RT5不与对方连接,但与其余路由器有连接。路由器与点到多点网络的连接接口也被OSPF表示成末端链路。
🕤 2.3.3 广播网络与非广播多址接入网络
- OSPF 在非广播多址接入 (NBMA) 网络上模拟广播网络的行为。
- 广播网络和 NBMA :抽象成伪节点(pseudo node)。
图示网络被抽象成伪节点N2。在链路状态数据库中,路由器都连接到伪节点N2,N2也连接到各路由器。这里有一点需要注意,从路由器到伪节点的传输代价是网络的传输代价,但从伪节点到路由器的传输代价则是 0。原因是在广播网络上,所有节点都是可以直接通信的,并不需要伪节点的转发。
🕤 2.3.4 区域外部网络
概念:可看作连接到区域边界路由器的一个末端网络。
- 边的权重为区域边界路由器到网络的传输代价。
对于区域外部的网络,区域边界路由器将到这些网络的路由汇总后注入到所属区域的OSPF协议实例中。对OSPF来说,这些外部网络可以看作是连接到区域边界路由器上的一个末端网络(stub-network),在链路状态数据库中也可用一个伪节点表示。
🕤 2.3.5 例子
这里是从RFC 2328中摘录的一个例子。左侧是某个OSPF区域抽象所得的有向加权图,右侧是相应的链路状态数据库。其中‘RT’表示路由器,‘N’表示网络,‘H’表示主机。列上的数字表示链路的传输代价。
OSPF 路由器在有向加权图上计算一个以自己为根(root)的最短路径树,并据此建立自己的路由表。
🕒 3. 基本工作原理
- 相邻路由器之间周期性发送HELLO报文,以便建立和维护邻居关系
- 建立邻居关系后,给邻居路由器发送数据库描述报文(DBD),也就是将自己链路状态数据库中的所有链路状态项目的摘要信息发送给邻居路由器
- 收到数据库描述报文后,若发现自己缺少其中某些链路状态项目,则会发送链路状态请求报文(LSR)。
- 对方收到链路状态请求报文后,则会将其所缺少的链路状态项目的详细信息封装在链路状态更新报文(LSU)中发送回去
- 收到链路状态更新报文后,将这些信息添加到自己的链路状态数据库中,随后发回链路状态确认报文(LSACK)
🕘 3.1 HELLO 协议
🕤 3.1.1 发现邻居并监测与邻居链路的状态
-
OSPF 路由器定期向所有邻居路由器发送 HELLO 报文。
-
报文中包含了最近一段时间内发送过 HELLO 报文的邻居路由器。
- 路由器用其标识符表示。
- 发送周期为
10
秒 40
秒未收到来自邻居路由器的 HELLO 报文,则认为该邻居路由器不可达
-
如果路由器在邻居发送的 HELLO 报文中发现了自己的标识符,就表明这两个邻居路由器之间建立了双向通信链路。
- 每个路由器都会建立一张邻居表。
- 每个路由器都会建立一张邻居表。
OSPF 路由器的两种关系:
- 邻居关系(neighboring):连接到同一个网络,能建立双向通信链路。
- 邻接关系(adjacent):可交换网络的链路状态。
- 建立双向通信链路后,由 OSPF 协议确定。
- 并非所有的邻居路由器之间都要建立邻接关系:
- 广播网络或 NBMA 网络上,DR/BDR 与其他路由器之间有邻接关系;
- 其他路由器之间不需要邻接关系。
邻居关系的建立:
HELLO 协议在不同类型网络上的工作过程不同:
- 点到点网络、虚拟链路:路由器向对方发送 HELLO 报文;
- 点到多点网络:路由器仅向能直接通信的邻居发送 HELLO 报文;
- 广播网络:每台路由器定期组播发送 HELLO 报文;
- NBMA 网络:需要配置后 HELLO 协议才能正常工作。
🕤 3.1.2 DR/BDR 的选举
广播网络或 NBMA 网络上每台路由器都清楚网络的链路状态。
若每台路由器都发送网络的链路状态,会有很多重复发送。OSPF 协议规定:
- 在广播网络或 NBMA 网络上选举一个指定路由器(Designated Router,DR)和一个备份指定路由器(Backup Designated Router,BDR);
- 只有 DR 能代表该网络发送网络的链路状态;
- DR 发生故障后,BDR 就变成 DR。
当路由器连接到广播网络或 NBMA 网络上的接口启动时:
- 检查该网络上是否已存在 DR 和 BDR:存在就接受;
- 否则,比较自己和其他路由器的优先级:
- 优先级最高的路由器成为 DR;优先级次高的路由器成为 BDR。
- 若两个路由器的优先级相同,标识符(ID)更大的胜出。
- 优先级:
0-255
,默认值是1
- DR和BDR一旦选定,即使OSPF区域内新增优先级更高的路由器,DR和BDR也不重新选举
🕘 3.2 链路状态数据库同步
OSPF 邻接路由器之间的链路状态数据库同步大体上可分为三步:
- 双方交换各自的链路状态数据库摘要;
- 向对方请求链路状态并更新自己的数据库;
- 若有链路的状态发生变化,更新自己的数据库,并通知对方。
🕤 3.2.1 交换摘要
OSPF 路由器定期与邻接路由器交换链路状态数据库摘要:
- 数据库摘要用一组数据库描述报文描述;
- 每个数据库描述报文包含一组链路状态通告(LSA)的首部;
- LSA 首部有其唯一标识及新旧标记。
🕤 3.2.2 同步信息
发送和接收数据库描述报文的过程称为“数据库交换过程” ,其中:
- 若路由器发现邻接路由器某些链路的状态更新,或自己没有,就向对方发送链路状态请求报文;
- 邻接路由器发送链路状态更新报文进行响应。
两个邻接路由器的链路状态数据库达同步后,称它们之间建立了完全邻接关系(fully adjacent)。
🕤 3.2.3 新情况下的同步
路由器监测其所有链路,若有链路的状态发生改变:
- 更新自己的链路状态数据库;
- 向邻接路由器发送链路状态更新报文,通知变化的链路状态。
🕤 3.2.4 洪泛机制
OSPF 协议定义了一种可靠的洪泛(reliable flooding)机制,用于在 OSPF 路由域中快速扩散链路状态的变化。
-
可靠是指收到链路状态更新报文后要发送确认,收到重复的更新报文无需再次转发,但要发送一次确认。
-
路由器接收到链路状态更新报文后,逐个检查其中的 LSA:
- 若 LSA 的状态更新,或本地不存在,就用 LSA 更新自己的数据库;
- 同时,在某些接口上继续发送该 LSA,称为“洪泛” 。
- 注意:路由器并不是直接发送接收的链路状态更新报文,而是发送根据自己的数据库生成的链路状态更新报文。
-
通过各路由器洪泛法发送封装有自己LSA的LSU报文,各路由器的LSDB最终达到一致
-
使用OSPF的各路由器基于LSDB进行最短路径优先SPF计算,构建出各种到达其他各路由器的最短路径,即构建各自的路由表。
例子:
我们通过一个例子来理解OSPF如何实现网络中所有路由器的链路状态数据库同步。
- 假设RT8新加入网络,连接到广播网络N6上;N6的指定路由器是RT10。
- 首先RT8和RT10通过发送链路状态数据库描述报文交换各自的数据库摘要,并通过发送链路状态请求报文和链路状态更新报文实现两者数据库的同步。这时,网络中只有RT8和RT10具有完整的链路状态数据库。
- 然后,RT10再把发生变化的链路状态,包括广播网络N6、路由器RT8以及网络N7的链路状态,洪泛给自己的邻接路由器;
- 而邻接路由器在更新自己的数据库后,再次洪泛这些变化的链路状态。
- 这个过程持续进行,最终所有路由器都将获得变化的链路状态,此时它们的数据库也会达到同步状态。
- 这个例子是在一个区域中洪泛的情形,也没有考虑虚拟链路。在整个自治系统中,AS-外部LSA在除末端区域接口和虚拟链路接口外的所有接口上洪泛,其他类型的LSA则在各自所属区域的接口上进行洪泛。
🕒 4. OSPF的运行状态
Down
:此状态还没有与其他路由器交换信息。首先从其ospf接口向外发送hello报文。Init
:表明收到了Hello包,但是2-Way通信仍然没有建立起来。two-way
:双向会话建立,而RID彼此出现在对方的邻居列表中。ExStart
:信息交换初始状态,在这个状态下,本地路由器和邻居将建立Master/Slave关系,一般情况下, 路由器ID大的成为Master。Exchange
:信息交换状态,本地路由器和邻居交换一个或多个DBD报文。Loading
:信息加载状态,收到DBD后,将收到的信息同LSDB中的信息进行比较。如果DBD中有更新的链路状态条目,则向对方发送一个LSR,用于请求新的LSA 。Full
:完全邻接状态,邻接间的链路状态数据库同步完成。
🕒 5. 报文格式
🕘 5.1 OSPF 报文
- OSPF 协议使用 IP 报文发送报文,其协议编号是
89
,发往组播地址224.0.0.5
。 - 即使在广播型网络上,OSPF 也尽可能采用组播方式发送报文。
OSPF 报文24
字节的固定首部:
- “版本”,占``1字节,指明OSPF协议的版本号。对OSPF2协议设置为
2
。 - “类型”,也占
1
个字节,指明了报文的类型。OSPF 协议定义了5
种类型报文。 - “分组长度”,占
2
字节,指明整个OSPF报文(包括首部)的长度,单位是字节。 - “路由器标识符”,占
4
字节,是报文发送方路由器的标识符。每个运行OSPF协议的路由器都有一个32
位的标识符,在自治系统中唯一地标识了该路由器。 - “区域标识符”,占
4
字节,是OSPF报文所属区域的标识符。OSPF报文只在某个特定的区域中发送。如主干区域就是0.0.0.0
- “校验和”,占
2
字节,是整个OSPF报文(除8字节认证数据外)的校验值。计算方法与IP首部校验和相同。 - “认证类型”,占
2
字节,指定了要使用的认证机制,包括:不进行认证(0
),简单的密码认证(1
),加密认证(2
)。 - “认证数据”,占
8
字节。- OSPF协议的认证可基于接口进行,即可以为每个路由器接口独立地配置认证机制。
OSPF 协议定义了 5 种类型报文:
报文类型 | 名称 | 英文 | 用途 |
---|---|---|---|
1 | HELLO 报文 | Hello | 发现邻居并监测与邻居链路的状态; 选举网络的指定路由器和备份指定路由器 |
2 | 数据库描述报文 | Database Description(DBD) | 与邻接路由器交换链路状态数据库摘要 |
3 | 链路状态请求报文 | Link State Request (LSR) | 向邻接路由器请求具体的链路状态 |
4 | 链路状态更新报文 | Link State Update (LSU) | 向邻接路由器发送具体的链路状态 |
5 | 链路状态确认报文 | Link State Acknowledgement (LSACK) | 对接收到的链路状态通告进行确认,以实现可靠的链路状态传输 |
🕤 5.1.1 HELLO 报文
OSPF 路由器周期性在所有接口(包括虚拟链路)上发送 HELLO 报文。
- “网络掩码”是报文发送接口所连接网络的地址掩码,该接口的地址在报文首部中的“路由器标识符”字段中。
- “HELLO报文间隔”字段占
2
字节,用于指定路由器发送 HELLO 报文的间隔时间,单位是秒。 - “选项”字段占
1
字节,用于OSPF路由器交换各自的能力等级。 - “路由器优先级”字段占
1
个字节,用于在广播网络或非广播多址接入网络上选举指定路由器和备份指定路由器。如果为0
,表明发送方路由器不参加选举。 - “路由器故障间隔”字段占
4
字节,指明在确认对方路由器发生故障前应等待的时间,单位是秒。 - 如果是广播网络或非广播多址接入网络,“指定路由器”和“备份指定路由器”字段分别是发送方路由器认为的网络当前的指定路由器和备份指定路由器的IP地址。全
0
地址表示网络上还没有指定路由器和备份指定路由器。 - “邻居路由器”列表给出了最近一段时间内从其接收到有效HELLO报文的邻居路由器的标识符。“最近一段时间”是指“路由器故障间隔”字段指明的时间。
🕤 5.1.2 数据库描述报文
数据库描述报文描述了链路状态数据库的摘要信息。
- “接口MTU”字段指明了报文发送接口所连接网络的最大传输单元。如果是虚拟链路则设置成 0。
- “选项”字段用于OSPF路由器之间交换各自的能力等级。
- “I”标志,即初始(Init)标志。如果设置为
1
,表明本报文是描述链路状态数据库摘要的第一个数据库描述报文。 - “M” 标志,即更多(More)标志。如果设置为
1
,表明后续还有其他数据库描述报文。 - “MS” 标志,即主(Master)、从(Slaver)标志。若设置为
1
,表明本路由器在数据库交换过程中是主方,否则是从方。 - “数据库描述序号”字段占
4
字节,用于对描述链路状态数据库摘要的一组数据库描述报文进行编号。第一个报文中该字段是一个随机数,后续报文的序号在随机数的基础上顺序递增。 - 报文的剩余部分是一组链路状态通告(LSA)首部,即链路状态数据库的摘要信息,表明了本地数据库中有哪些链路状态及其新旧程度。
🕤 5.1.3 链路状态请求报文
链路状态请求报文用于向邻接路由器请求特定链路的状态。
- “链路类型”、“链路状态标识符”和“通告路由器”三个字段共同在OSPF路由域中唯一地标识了一条链路。
- 通过重复这三个字段,链路状态请求报文指定了一组要请求其状态的链路。
🕤 5.1.4 链路状态更新报文
链路状态更新报文用于向邻接路由器发送特定链路的状态。
- “LSA数量”指明了报文中包含的链路状态通告的数量。
- 剩余部分则是一系列链路状态通告,每个链路状态通告描述了一组链路的状态信息。
🕤 5.1.5 链路状态确认报文
链路状态确认报文用于对接收到的链路状态通告(LSA)进行确认。
- 包含一系列LSA首部。
🕒 6. 实验:OSPF配置观察
设备名 | 端口 | ip地址 | 掩码 | 区域ID |
---|---|---|---|---|
R1 | f0/0 | 192.168.2.1 | 255.255.255.0 | 10 |
f0/1 | 192.168.1.1 | 255.255.255.0 | 0 | |
R2 | f0/1 | 192.168.1.2 | 255.255.255.0 | 0 |
f0/0 | 192.168.3.2 | 255.255.255.0 | 20 | |
R3 | f0/0 | 192.168.2.3 | 255.255.255.0 | 10 |
R4 | f0/0 | 192.168.2.4 | 255.255.255.0 | 10 |
R5 | f0/0 | 192.168.2.5 | 255.255.255.0 | 10 |
R6 | f0/0 | 192.168.3.6 | 255.255.255.0 | 20 |
f0/1 | 192.168.4.6 | 255.255.255.0 | 20 | |
R7 | f0/1 | 192.168.4.7 | 255.255.255.0 | 20 |
实验步骤:
一、在R1上配置OSPF
(1)启动OSPF路由协议
R1(config)#router ospf 1
其中1
是路由器上的OSPF进程号,进程ID只在路由器内部有效,不同路由器的OSPF进程ID可以相同。通常网络管理员会在整个AS中保持相同的进程ID。
(2)指定直连网段
R1(config-router)#network 192.168.1.0 0.0.0.255 area 0
R1(config-router)#network 192.168.2.0 0.0.0.255 area 10
其中0.0.0.255
是通配符掩码,使用网络地址掩码的反码,即为0的位需要匹配,为1的位不需要匹配。
二、在R2上配置OSPF
(1)启动ospf
R2(config)#router ospf 1
(2)指定直连网段
R2(config-router)#network 192.168.1.0 0.0.0.255 area 0
R2(config-router)#network 192.168.3.0 0.0.0.255 area 20
三、在R3上配置OSPF
(1)启动ospf
R3(config)#router ospf 1
(2)指定直连网段
R3(config-router)#network 192.168.2.0 0.0.0.255 area 10
四、在R4,R5,R6(除f0/1口)外进行OSPF配置
注:在本次实验中配置OSPF顺序为R1,R3,R4,R5,R2
五、抓包分析邻居发现及维护过程
(1)在区域10的以太网的任一网络接口启动分组捕获。在wireshark显示过滤器输入“ospf.msg.hello && ip.src==192.168.2.1”
(2)观察产生的数据包
从分组列表窗口可以看到,R1周期性(约10s)发送HELLO报文,报文的目的地址是所有OSPF路由器组播地址224.0.0.5
。
选择一个HELLO报文,在分组首部详细信息窗口查看其首部字段值。注意OSPF报文封装在IP分组中。
查看OSPF报文详细信息,可以看到OSPF报文由三部分组成:OSPF首部(OSPF Header)、HELLO报文(OSPF HELLO Packet)以及本地链路信令数据块(LLS (Local-Link Signaling) Data Block)。
注:由于优先级相同,则标识符(IP地址)更大者胜出,但由于在实验中,按R1,R3,R4,R5的顺序启动路由器ОSPF进程,因此R1成为指定路由器,而R3成为备份指定路由器。已经选举出来的指定路由器不会再重新选举,除非故障。
六、抓包分析备份指定路由器选举过程
(1)在区域10的以太网的任一网络接口启动分组捕获。在R3中输入以下指令:
R3#clear ip ospf process # 重启OSPF进程,用来模拟选举过程
(2)在wireshark显示过滤器输入“ospf.msg.hello && ip.addr ==192.168.2.3”
R3的OSPF进程重启后,将首先查询网络上的指定路由器和备份指定路由器。这通过发送(组播)一个指定路由器和备份指定路由器均为0.0.0.0
的 HELLO报文实现
网络中当前的指定路由器收到查询报文后,向查询路由器发送(单播)一个响应HELLO报文,其包含当前的指定路由器和备份指定路由。
由于原来的备份指定路由器(R3)重启,其余路由器进行了新备份指定路由器选举。路由器从其当前邻居中选择优先级最高或路由器标识符最大(优先级相同时)的路由器作为新备份指定路由器。实验中,在这些路由器中R5的路由器标识符最大(所有路由器的优先级相同,均为1),成为新备份指定路由器。R3向指定路由器发送(单播)一个确认HELLO报文,其中包含R3的当前邻居(R1)。此后,R3将周期性组播发送HELLO报文。
七、抓包分析指定路由器选举过程
(1)在区域10的以太网的任一网络接口启动分组捕获。在R1中输入以下指令:
R1#clear ip ospf process
(2)在wireshark显示过滤器输入“ospf.msg.hello && ip.addr ==192.168.2.1”
R1的OSPF重启后﹐首先查询网络中的指定路由器和备份指定路由器。R1发送(组播)一个HELLO报文,其指定路由器和备份指定路由器均为0.0.0.0
。网络的所有路由器都向R1发送(单播)一个HELLO报文。由于原指定路由器R1失效,R3和R4认为原备份指定路由器(R5)变为指定路由器,而备份指定路由器仍是R5。
R5发送的HELLO报文如图所示。R5是原备份指定路由器,当原指定路由器(R1)失效后,R5将成为新的指定路由器,并从其当前的邻居中选择优先级最高或路由器标识符最大(优先级相同时)的路由器(R4)作为新的备份指定路由器。
R1收到R5、R4、R3 发送的响应HELLO报文后,分别向各自发送(单播)确认HELLO报文。
八、抓包分析链路状态数据库同步过程
(1)先后在R6的f0/1口和R7的f0/1口启动ospf路由协议。在R6和R7中输入以下指令:
R6(config)#router ospf 1
R6(config)#network 192.168.4.0 0.0.0.255 area 20
R7(config)#router ospf 1
R7(config)#network 192.168.4.0 0.0.0.255 area 20
(2)在R6和R7、R2和R6、R1和R2、R1和SW1间抓包,在wireshark显示过滤器输入“ospf && not ospf.msg.hello”
数据库描述报文有两种:空数据库描述报文和包含LSA首部信息的数据库描述报文。当两个路由器相互收到HELLO Seen报文(即路由器包含在HELLO报文中的邻居字段列表中)之后,它们开始互相发送空数据库描述报文。
空数据库描述报文用来确定通信过程中的主从关系。通常以路由器标识符较大的路由器作为主方。
主从关系确立后,从方使用主方的序号(6047)向主方发送第一个包含若干LSA首部信息的数据库描述报文;
主方在收到从方的数据库描述报文后发送自己的序号加1的数据库描述报文(包含LSA首部信息),作为对收到从方报文的确认。如果还有更多的链路状态,从方、主方将继续发送数据库描述报文。
在这个交换过程中,只有主方可以更改序号,从机使用主方确定的序号。
交换完数据库描述报文后,R7与R6相互请求其缺失的链路状态信息。这通过发送链路状态请求和链路状态更新报文实现。
R7和 R6之间链路的更新会在区域20中进行洪泛。可以看到R6与R7都在组播。
区域20中R6和R7间链路状态的更新将被在区域0和区域10中通知。在区域0中,路由器R2以网络摘要LSA方式通知该链路状态的更新,即网络192.168.4.0。在区域10中,区域边界路由器R1组播发送网络摘要。
❗ 转载请注明出处
作者:HinsCoder
博客链接:🔎 作者博客主页