摘要
本文主要介绍在网络工程师角度(并非协议的设计者、实现者)下的OSPFv2的工作原理,主要介绍一些OSPF的基本概念、Link-State Advertisement、特殊的OSPF Area以及一些OSPF的协议特性。
目录
OSPF邻居关系的建立及握手过程
邻居发现
邻居(Neighbouring)关系的建立过程
邻接(Adjacency)关系建立过程
影响邻居关系及邻接关系建立的问题
OSPF网络类型
OSPF报文与区域
OSPF报文结构
LSA格式及类型
OSPF区域
OSPF协议特性
路由汇总
Virtual Link
默认路由
报文认证
转发地址
OSPF路由防环机制
OSPF路由类型及优先级
内容
OSPF邻居关系的建立及握手过程
邻居发现
OSPF通过Hello报文发现维持邻居关系,邻居关系是指达到2-way状态的路由器之间的关系。
OSPF发送Hello报文方式
在不同网络上,OSPF发送Hello报文方式不同:
时间上,broadcast和P2P网络中,Hello报文10s发送一次; NBMA和P2MP上30s发送一次。
Broadcast、P2P、P2MP,OPSF通过目的地址为244.0.0.5(AllOSPFRouter)来自动发现邻居。而在NBMA网络中需要手动指定邻居。
建立邻居关系时报文字段的检查
在建立邻居关系时,路由器必须对Hello报文中携带的“参数”达成一致,对参数进行检查对比,以下是需要对比的参数:
Hello/Dead Interval:全部一致才能建立邻居关系。
Area ID(在Hello报文头部中):全部一致才能建立邻居关系。
Area Type:参考Hello报文的Option位,全部一致才能建立邻居关系。
Authentication Type和密钥:全部一致才能建立邻居关系
Router ID:不能一样才能建立邻居关系。
邻居(Neighbouring)关系的建立过程
下面以图示来说明邻居(Neighbouring)关系的建立过程:
DOWN
假设两个路由器运行OSPF,正准备建立邻居关系。此时两台路由器在对方眼里都处于DOWN状态。
DOWN -> INIT
路由器A发送了第一个报文,路由器B接收到了,B将会把A加入到邻居列表中,并将A的状态标记为INIT。
DOWN -> Two-Way
B发送Hello报文,并声明看见了邻居A,当A收到该报文后,将B加入邻居列表中,并将其状态转移到Two-Way。
INIT -> Two-Way
此时A发送了一个Hello报文,并声明看见了邻居B,当B收到该报文后,将A的状态转移到Two-Way。
邻接(Adjacency)关系建立过程
邻接(Adjacency)关系建立的对象
在broadcast和NBMA网络上,DROther彼此之间保持在2-way状态,而只与AllDRouter之间形成邻接关系。
在其他OSPF类型网络上,不需要DR,邻接关系发生在2-way状态之后。
邻接关系状态迁移过程如下图所示[3:Page54:Fig14]:
信息交换初始状态(ExStart)
动作:路由器之间互相发送空的DD(Database Description)报文。
作用:确定Slave / Master关系、确定DD初始化序列号、比较接口MTU。
信息交换状态(Exchange)
动作:Master和Slave路由器之间互相DD报文。
作用:用于数据库同步的标识信息传递。
信息加载状态(Loading)
动作:Master和Slave之间使用上一状态获取的标识符来向对方索取自己没有的LSDB表元。
作用:同步路由器的LSDB。
完全邻接状态(Full)
动作:当路由器发现自己已经同步LSDB后,将邻居状态更改到Full。
作用:表明自己已经不需要从某个邻居同步LSBD。
影响邻居关系及邻接关系建立的问题
有以下几种原因影响Adjacency关系的建立:
1. 主IP网络和掩码
在broadcast网络中,如果两个路由器发送hell报文源IP地址和hello中的子网掩码确定的子网不一致,则不能建立neigbouring relationship,而P2P和P2MP没有此要求。
2. MTU不一致
由于MTU不一致,如果DD、LSRequest、LSUpdate报文过大,会导致报文被对方忽略,而OSPF没有提供手段自动检测该情况,所以邻居状态可能会一直停留在ExStart、Exchange、loading状态之一。
OSPF网络类型
OSPF接口根据链路类型可分为4种网络类型:
1. P2P(Point-to-Point)
这种网络类型工作在只有两个节点的环境中,彼此之间不需要选举DR,建立邻居关系后直接开始同步数据库。链路层运行协议有PPP、HDLC和FrameRelay。
2. broadcast
支持广播的网络环境,该网络允许多台路由器介入,任意两台路由器之间都能直接进行二层通信,一个广播报文能被其他所有路由器接收到。
3. NBMA(Non-broadcast Multi-Access)
不支持广播,该网络允许多台路由器介入,任意两台路由器之间都能直接进行二层通信。
4. P2MP(Point-to-Multipoint)
逻辑上等同于多个P2P网络的组合。
OSPF报文与区域
OSPF报文结构[3]
OSPF通用头部
所有OSPF报文都有一个相同的头部,长度为24byte,如下图所示:
Version
OSPF版本号,在本上下文中为2。
Type
表明该报文的类型,对应关系如下表所示:
Packet length
OSPF报文长度的byte数,包含该头部的长度
Router ID
路由器的OSPF Router-ID。
Area ID
报文所属的Area ID。
Checksum
校验报文是否有效。
Autype
指示该报文使用的认证类型。
Authentication
用于报文认证的内容。
Hello报文
Hello报文是OSPF报文类型1,在所有接口上周期性发送以建立保持邻居关系,报文结构如下所示。
Network mask
发送该报文的接口的网络掩码。
HelloInterval
发送Hello报文的时间间隔。
Options
被发送者用来通告自己具有某种能力。
Rtr Pri
路由优先级,用于DR、BDR的选举。
RouterDeadInterval
在邻居路由器被视为无效之前需要等待对方发送Hello报文的时间。
Designated Router
本网段中DR的接口IP地址。
Backup Designated Router
本网段中DR的接口IP地址。
Neighbor
邻居列表,用Router-ID标识,记录当前路由器已知的链路上所有邻居的RID。
DD(Database Description)报文
Interface MTU
不分片下,此接口最大可发出的IP报文长度。
Options
被发送者用来通告自己具有某种能力。
I(Initialization)
为1时代表这是第一个DD报文,否则为0。
M(More)
为1表示后续DD报文中还有LSA Header,否则为0。
MS(Master / Slave)
当两台OSPF路由器交换DD报文时,要确定双方的主从关系,RouterID大的一方称为Master,为1时表示Master,0表示Slave。
DD Seq NR
DD报文序列号,用以保证DD报文传输的可靠性。
LSA Headers
本LSBD的LSA header。
LSR(Link-State Request)报文
在与OSPF邻居交换DD报文后,路由器知晓了邻居的LSDB摘要,路由器使用该报文来请求所需的LSA,LS type、Link State ID和Advertising Router字段唯一地标识了一个LSA。
LS type
指示LSA的类型,例如Router LSA、Network LSA、Network Summary LSA、ASBR Summary LSA、AS External LSA等。
Link State ID
LSA的标识。
Advertising Router
产生该LSA的Router-ID。
LSU报文
路由器接收到LSR后,会以LSU回应,在LSU报文中包含着对方请求的LSA。
# LSAs(NR of LSAs)
标识LSU中包含的LSA的个数。
LSAs
LSA的列表。
LSAck报文
为了确保LSA能够可靠送达,当一台路由器收到邻居发来的LSU报文时,需要对报文中包含的LSA进行确认,LSA header唯一地标识了一个LSA。
LSA header
LSA的头部,唯一标识一个LSA。
LSA格式及类型
LSA头部
LS age
LSA产生后所经过的时间,以s计。
Options
宣告自己具有某种能力。
LS Type
代表不同的LSA类型。
Link State ID
与LS Type和Advertising Router一起标识一个LSA,具体的LS Type和Link State ID的对应关系[3 : Page 119 : Table 16]:
Advertising Router
记录产生该LSA的路由器的Router ID。
LS Sequence NR
LSA的序列号。
LS Checksum
除了LS age以外其他域的校验和。
Length
LSA的总长度,包含LSA header,以byte计。
LSA类型
Router-LSA(Type 1)
产生设备:每个Router。
作用:描述该路由器所有OSPF直连接口的状况和Cost值。
报文传播范围:所属Area。
报文格式:
V(Virtual):
如果为1表示该路由器为Virtual Link的端点。
E(External):
如果为1表示该路由器为ASBR(Autonomous Systen Border Router)。
B(Border):
如果为1表示该路由器为ABR(Area Border Router)。
# links:
该Router LSA描述的链路(Link)数量,每个Link在逻辑上是一个4元组(link type,link ID,link data,metric)。
Link ID:
该路由器连接到的对象的标识符。
Link Data:
链路数据。
Link Type:
链路类型(并非OSPF网络类型!),如下表所示:
链路类型 | 描述 | Link ID | Link Data |
1 | 点到点(P2P)连接到另一台路由器 | 邻居的Router-ID | 产生该LSA的路由器的接口IP地址 |
2 | 连接到一个传输网络(Transit) | DR的接口IP地址 | 产生该LSA的路由器的接口IP地址 |
3 | 连接到一个末梢网络(Stub) | 网络IP地址 | 网络掩码 |
4 | 虚链路(Virtual) | 邻居的Router-ID | 产生该LSA的路由器的接口IP地址 |
metric:
Cost的值。
Network-LSA(Type 2)
产生设备:DR。
作用:描述该MA网络的子网掩码和邻居Router-ID。
报文传播范围:所属Area。
报文格式(简洁起见,除去了LSA Header):
network mask
该MA网络的网络掩码。
Attached Router
介入到该MA网络的路由器的Router-ID。
Network-Summary-LSA(Type 3)
产生设备:ABR。
作用:描述了到达某个区域的目标网段路由。
报文传播范围:所属Area。
报文格式(简洁起见,除去了LSA Header):
Network mask:
被通告的网络的子网掩码(The subnet mask of an advertised network)。
metric:
路由的cost。
TOS、TOS metric:
REF [3]
ASBR-Summary-LSA(Type 4)
产生设备:ABR。
作用:描述了到达某个ASBR的主机路由。
报文传播范围:所属Area。
报文格式:
同Network-Summary LSA报文格式一致。
Network mask:
恒为0.0.0.0,LSA header中的LSID为该ASBR的Router-ID。
metric:
路由的cost。
TOS、TOS metric:
REF [3]
AS-External-LSA(Type 5)
产生设备:ASBR。
作用:描述了OSPF domain外部的目标网段路由。
报文传播范围:OSPF domain。
报文格式(简洁起见,除去了LSA Header):
Network Mask:
外部路由的目的网络掩码。
E:
1表示Metric-Type-2类型度量值类型,否则为Metric-Type-1。
metric:
该外部路由的cost。
Forwarding address:
若该字段为0.0.0.0时,到达该外部网段的流量会被发往引入该条路由的ASBR,否则转发到该地址。
External Route Tag:
外部路由才能携带的标记,用于部署路由策略。
其他不重要字段:
REF [3]
NSSA LSA(Type 7)
产生设备:ASBR。
作用:描述了OSPF domain外部的目标网段路由。
报文传播范围:所属NSSA。
报文格式:同ASE LSA。
OSPF区域
骨干区域(Backbone Area)
角色:OSPF domain的核心即Area0,所有域间路由必须通过它来中转。
允许泛洪的LSA:Router,Network,Network Summary,ASBR Summary,ASE。
常规区域(Normal Area)
角色:OSPF domain的非核心区域,知晓本域内所有路由信息(包括引入的路由)。
允许泛洪的LSA:Router,Network,Network Summary,ASBR Summary,ASE。
末梢区域(Stub Area)
角色:相当于阻挡ASE LSA的Normal Area,区域内部路由器不需要根据特定外部路由来选择特定出口的区域。ABR下发一个Network Summary默认路由,表明可以到达OSPF domain外的目的网段。
允许泛洪的LSA:Router,Network,Network Summary。
Totally Stub Area
角色:相当于阻挡Network Summary的Stub Area,ABR下发一个Network Summary 默认路由,表明可以到达本Area外的目的网段。
允许泛洪的LSA:Router,Network,Network Summary(默认路由)。
非完全末梢区域(Not-So-Stubby Area)
角色:相当于引入了一些ASE路由的Stub Area。
允许泛洪的LSA:Router,Network,Network Summary,NSSA Externel(外部路由,默认路由)。
Totally NSSA
角色:相当于引入了一些ASE路由的Totally Stub Area。
允许泛洪的LSA:Router,Network,Network Summary(默认路由),NSSA Externel。
OSPF协议特性
路由汇总
OSPF支持两种路由汇总,一种部署在ABR上,另一种部署在ASBR上:
1. 在ABR上部署路由汇总。
只能在ABR上完成路由汇总,并且只能汇总ABR直连区域内部路由。
2. 在ASBR上部署路由汇总。
只能在ASBR上完成路由汇总,并且只能汇总ASBR引入的外部路由。
Virtual Link
一条在路由器之间建立的逻辑通路。
默认路由
在Normal Area中发布默认路由
OSPF认为在执行路由重分发时,如果把默认路由引入OSPF存在引发环路的风险,所以不能通过引入静态路由来发布默认路由,以防止失误。
在Stub Area中发布默认路由
Stub Area中的ABR会在区域内下发一个Network Summary LSA来使Stub Area内部流量能够通过ABR到达OSPF domain外部。
在Totally Stub Area中发布默认路由
Totally Stub Area中的ABR会在区域内下发一个Network Summary LSA来使Totally Stub Area内部流量能够通过ABR到达该区域外部。
在NSSA中发布默认路由
NSSA只能学习到自己引入的外部路由,而OSPF domain外其他的外部路由不能被学习到。因此,NSSA ABR将会分发一个默认路由来引导到OSPF domain外部的流 量。
在Totally NSSA中发布默认路由
NSSA只能学习到自己引入的外部路由,而该区域外的其他路由不能被学习到。因 此,NSSA ABR将会分发一个默认路由来引导到该区域外部的流量。
报文认证
空认证
简单口令认证
密文认证
转发地址
一种防止次优化的手段,见实验。
OSPF路由防环机制
区域内部防环
由于区域内部的lsdb的同步机制,在同一个域中的路由器将会拥有一致的Area-Intra (Type1和Type2 LSA)lsdb,根据生成树算法会得到一个无环图。
区域间防环
网络结构防环
所有非backbone area必须与backbone area相连接,Area-inter路由需要经过Area0中转。
Network Summary LSA防环机制
1. ABR从Non-backbone area收到的Network Summary LSA不能用于Area-Inter路由的计算。
2. ABR只能把自己到达所连接区域的Area-Intra路由注入Area0。另外,可以将所到达的Area-Intra路由和到达其他区域的Area-Inter路由注入Non-backbone Area。
3. 水平分割:ABR不会将到达某个区域内的网段路由的Network Summary LSA再次通告回去。
MPLS VPN防环
HCNP R&S 不做要求,略去。
外部路由防环
外部路由由ASE LSA和ASBR LSA描述,根据Router LSA、Network LSA、Network Summary LSA可以保证到达ASBR无环路,ASBR再将流量送出OSPF domain。
OSPF路由类型及优先级
以下按照优先顺序枚举OSPF路由类型:
Area-Intra Route
Area-Inter Route
Metric-Type 1 Route
Metric-Type 2 Route
参考文献
[1] HCNP 路由交换学习指南
[2] HCIE 路由交换学习指南 //这本书有点鸡肋,叙述协议不如看RFC文档,概念顺序安排不当,有价值的可能就是一些配置实例。
[3] RFC 2328,OSPF version2 official standard