本文解释了OSPF 链路状态更新( LSA )数据包,并展示了它们如何包含链路状态通告( LSA )。还分析了 OSPF LSU 和 LSA 数据包结构,并解释了 OSPF LSA 数据包中的每个字段。最后,我们讨论了最常见的LSA 类型、路由器来源类型(ABR、ASBR、DR等)、它们的功能和受影响的区域。
1. OSPF Packet & LSU & LSA
每个单独的链路状态更新( LSU ) 数据包可以包含一个或多个LSA,并且当在 OSPF 路由器之间发送LSU时,它会通过网络泛洪LSA 信息。
如下图示例,OSPF 路由器向OSPF 指定路由器( DR )发送一个LSU ,其中包含有关新网络的LSA 信息:
LSA包含在 LSU 内,而 LSU 都是封装在以太网帧内的OSPF 数据包的一部分(假设是以太网网络)
通过捕获下面的OSPF 以太网帧,我们可以确认 LSU/LSA 数据包结构图。我们使用相同的颜色突出显示每个部分(LSA、LSU、OSPF Header):
[!CAUTION]
请注意,目标 IP 地址是多播地址 224.0.0.6,这是意料之中的,因为路由器使用此多播地址向指定路由器( DR ) 发送更新。
1.1 OSPF数据包结构图:
1.2 OSPF的五种报文
OSPF数据包拥有共五种报文类型,主要根据OSPF Header的Message Type进行区分,以下就按照不同的报文类型,对OSPF的报文字段进行分析。
OSPF基本Header
- version: OSPF版本
- Message Type: 共有五种报文
- Packet Length:包括 Header Ospf 总长度
- Source OSPF Router:发送者的 Router-id
- Area ID:发送接口表示所在区域
- Checksum: 整个数据包的校验和
- Auth Type:
- 0:没有认证
- 1:明文认证
- 2:MD5 认证
- Auth Data: 所需要的认证信息
① Hello Packet(Hello报文)
OSPF协议使用Hello报文来建立和维护相邻邻居路由器之间的邻居关系。仅用来向邻居路由器证明自己的存在。
Hello报文被周期性(Hello Interval,默认为10秒)地发向邻居路由器接口发送,如果在设定的死亡时间(Router Dead Interval,默认为40秒,通常至少是Hello包发送时间间隔的4倍)内没有收到对方OSPF路由器发送来的Hello报文,则本地路由器会认为该对方路由器无效。
报文内容包括一些定时器设置、DR、BDR以及本路由器已知的邻居路由器。整个Hello报文格式如下表所示。
字段 | 长度 | 功能 |
---|---|---|
Network Mask | 4字节 | 发送Hello报文接口所在的子网掩码。 |
HelloInterval | 2字节 | 指定发送Hello报文的时间间隔,默认为10秒。 |
Options | 1字节 | 可选项,包括:E:允许泛洪AS-external-LAS;MC:允许转发IP组播报文;N/P:允许处理Type 7 LSA;DC:允许处理按需链路。 |
Router Priority | 1字节 | 指定DR优先级,默认为1。数值越大越优先。如果设为0,则表示本路由器不参与DR/BDR选举。 |
Router Dead Interval | 4字节 | 指定路由器失效时间,默认为40秒。如果在此时间内没有收到邻居路由器发来的Hello报文,则认为该邻居路由器已失效。 |
Designated Router | 4字节 | 指定DR的接口IP地址 |
Backup Designated Router | 4字节 | 指定BDR的接口IP地址 |
Active Neighbor | 4字节 | 指定邻居路由器的RID。可以指定多个邻居路由器RID |
② Data Description(数据库描述报文)
DD报文是用来描述本地路由器的链路状态数据库(LSDB),在两个OSPF路由器初始化连接时要交换DD报文,进行LSDB数据库同步。
DD报文内容部分包括:DD报文序列号和LSDB中每一条LSA的头部等。对端路由器根据所收到的DD报文中的LSA头部,判断出自己的LSDB中是否已有这条LSA。
由于数据库的内容可能相当长,所以可能需要多个数据库描述报文来描述整个数据库。所以有三个专门用于标识数据库描述报文序列的比特位,即DD报文格式中的I、M和M/S这三位。接收方对报文的重新排序使其能够真实地复制数据库描述报文。
DD交换过程按询问/应答方式进行,在DD报文交换中,一台为Master(主)角色,另一台为Slave(从)角色。Master路由器向从路由器发送它的路由表内容,并规定起始序列号,每发送一个DD报文,序列号加1,Slave则使用Master的序列号进行确定应答。但是显然,主从之间的关系会因每个DD交换的不同而不同。网络中的所有路由器会在不同时刻作用,在这个过程中既可能是主路由器又可能是从路由器。
对于的各字段说明如下表所示。
字段 | 长度 | 功能 |
---|---|---|
Interface MTU | 2字节 | 指出发送DD报文的接口在不分段的情况下,可以发出的最大IP报文长度。 |
Options | 1字节 | 可选项,包括:E:允许泛洪AS-external-LAS;MC:允许转发IP组播报文;N/P:允许处理Type 7 LSA;DC:允许处理按需链路。 |
I | 1比特 | 指定在连续发送多个DD报文,如果是第一个DD报文则置1,其它的均置0。 |
M | 1比特 | 指定在连续发送多个DD报文,如果后续还有报文需传达则置1,如果是最后一个DD报文则置0。 |
M/S | 1比特 | 设置进行DD报文双方的主从关系,如果本端是Master角色,则置1,否则置0。 |
DD Sequence Number | 4字节 | 指定所发送的DD报文序列号。主从双方利用序列号来确保DD报文传输的可靠性和完整性。 |
LSA Header | 4字节 | 指定DD报文中所包括的LSA头部。可以指定多个LSA头部。 |
因为DD报文仅在两台OSPF路由器初始化连接时才进行DD交换,所以它没有发送周期。之后的数据库存同步是通过LSR、LSU和LSAck报文进行同步的。
③ Link State Request(链路状态请求报文)
LSR报文用于请求相邻路由器链路状态数据库中的一部分数据。当两台路由器互相交换完DD报文后,知道对端路由器有哪些LSA是本LSDB所没有的,以及哪些LSA是已经失效的,则需要发送一个LSR报文,向对方请求所需的LSA。
LSR报文内容包括所需的LSA摘要,主要包含三个字段:Link State Type,Link State ID,Advertising Router;具体格式如下图所示:
LSR报文内容部分各字段说明如下表所示:
字段 | 长度 | 功能 |
---|---|---|
LS type | 4字节 | OSPF指定所请求的LSA类型,总共11类,其中主要常用的共7类,其余均为特殊场景下应用,以下仅列出常见的LSA类型:第一类:Router-LSA(路由器LSA);第二类:Network-LSA(网络LSA);第三类:Network-Summary-LSA(网络汇总LSA);第四类:ASBR-Summary-LSA(ASBR汇总LSA);第五类:AS-External-LSA(自治系统外部LSA);第七类:NSSA-External-LSA(NSSA外部LSA)。 |
Link State ID | 4字节 | 用于指定ospf所描述的部分区域,该字段的使用方法根据不同的LSA类型而不同:当为一类LSA时,该字段值是产生LSA 1的路由器的Router-ID;当为二类LSA时,该字段值是DR的接口地址;当为三类LSA时,该字段值是目的网络的网络地址;当为四类LSA时,该字段值是ASBR的Router-ID;当为五类LSA时,该字段值是目的网络的网络地址。 |
Advertising Router | 4字节 | 指定产生此所要请求的LSA的路由器ID |
④ Link State Update(链路状态更新报文)
LSU报文是回应LSR报文的请求,用来向对端路由器发送所需的LSA,内容是多条LSA完整内容的集合。
LSU报文内容部分包括此次共发送的LSA数量(Number of LSAs字段)和每条LSA(LSAs字段)的完整内容,如下图所示。
LSU报文在支持组播和多路访问的链路上是以组播方式将LSA泛洪出去的,并且对没有收到对方确认应答(就是下面将要介绍的LSAck报文)的LSA进行重传,但重传时的LSA是直接送到没有收到确认应答的邻居路由器上,而不再是泛洪。报文内容部分字段如下表所示。
字段 | 长度 | 功能 |
---|---|---|
Number of LSA | 4字节 | 指定此报文中共发送的LSA数量。 |
LSAs | 4字节 | 是一条条具体的LSA完整信息,后面的省略号表示可多条LSA。 |
⑤ Link State Acknowledge(链路状态确认报文)
LSAck报文是路由器在收到对端发来的LSU报文后所发出的确认应答报文,内容是需要确认的LSA头部(LSA Headers)。
LSAck报文根据不同链路以单播或组播形式发送。整个LSAck报文的格式如下图所示。
Q:在OSPF路由协议中,组播地址224.0.0.5和224.0.0.6分别代表什么,在什么情况下使用?
组播地址224.0.0.5代表所有运行OSPF的路由器,DR,BDR向DRother发送DD,LS Request,LS Update报文时,其发送的目的地址是224.0.0.5。可以理解为:DRother侦听224.0.0.5。
组播地址224.0.0.6代表所有角色为DR的路由器,DRother向DR,BDR发送DD,LS Request,LS Update报文时,其发送的目的地址是224.0.0.6。可以理解为:DR侦听224.0.0.6。
2. 链路状态通告 (LSA) 数据包结构
每个LSA数据包由一个报头和一个正文组成,其中包含在 OSPF 网络内交换网络信息所需的所有信息。下图显示了 OSPF LSA 数据包的结构:
20 字节的 LSA header部分包含以下字段:
- LS Age :LSA 从创建到现在经过的秒数(单位为秒),表示第一个LSA id 何时创建,何时会被提升。
- Options:指示 OSPF 功能,如表。
- LS Type:定义 LSA 类型,例如在哪里使用哪个 LSA。
- Link State ID:标识 OSPF 路由器之间的网络链路;大多数情况下,我们了解 OSPF 进程使用的 IP 标识。
- Advertising Router:显示原始路由器的ID,通过它可以识别OSPF的哪个进程在哪个路由器上运行。
- LS Sequence Number:一个唯一的数字,用于过滤每个 LSA 包中过时和冗余的 LS。
- LS Checksum:提供给 LS 用于比较和错误检测的特定数字。
- Length:表示 LSA 数据包的长度,这意味着该 LSA 的实际大小就是正在生成的 LSA。
发表评论