OSPF是一种基于链路状态的路由协议,它从设计上就保证了无路由环路。它支持区域的划分,区域内部的路由器使用SPF最短路径算法保证了区域内部的无环路。同时它还利用区域间的连接规则保证了区域之间无路由环路。OSPF支持触发更新,能够快速检测并通告自治系统内的拓扑变化。当网络上路由器越来越多,路由信息流量急剧增长的时候,OSPF可以将每个自治系统划分为多个区域,并限制每个区域的范围。OSPF这种分区域的特点,使得OSPF特别适用于大中型网络。OSPF还可以同其他协议(比如多协议标记切换协议MPLS)同时运行来支持地理覆盖很广的网络。OSPF可以提供认证功能。OSPF路由器之间的报文可以配置成必须经过认证才能进行交换。
OSPF用IP报文直接封装协议报文,协议号为89。OSPF分为5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文
OSPF这五种报文具有相同的报文头格式,长度为24字节。
字段 | 长度 | 含义 |
---|---|---|
Version | 1字节 | 版本,OSPF的版本号。对于OSPFv2来说,其值为2 |
Type | 1字节 | 类型,OSPF报文的类型,有下面几种类型:1:Hello报文;2:DD报文;3:LSR报文;4:LSU报文;5:LSAck报文 |
Packet length | 2字节 | OSPF报文的总长度,包括报文头在内,单位为字节 |
Router ID | 4字节 | 发送该报文的路由器标识 |
Area ID | 4字节 | 发送该报文的所属区域 |
Checksum | 2字节 | 校验和,包含除了认证字段的整个报文的校验和 |
AuType | 2字节 | 验证类型,值有如下几种表示, 0:不验证;1:简单认证;2:MD5认证 |
Authentication | 8字节 | 鉴定字段,其数值根据验证类型而定。当验证类型为0时未作定义;类型为1时此字段为密码信息;类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息,MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。 |
Hello报文是最常用的一种报文,其作用为建立和维护邻接关系,周期性的在使能了OSPF的接口上发送。报文内容包括一些定时器的数值、DR、BDR以及自己已知的邻居。
字段 | 长度 | 含义 |
---|---|---|
Network Mask | 32比特 | 发送Hello报文的接口所在网络的掩码 |
HelloInterval | 16比特 | 发送Hello报文的时间间隔。 |
Options | 8比特 | 可选项:E:允许Flood AS-External-LSAs ;MC:转发IP组播报文 ;N/P:处理Type-7 LSAs ;DC:处理按需链路 |
Rtr Pri | 8比特 | DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举 |
RouterDeadInterval | 32比特 | 失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效 |
Designated Router | 32比特 | DR的接口地址 |
Backup Designated Router | 32比特 | BDR的接口地址 |
Neighbor | 32比特 | 邻居,以Router ID标识 |
两台路由器在邻接关系初始化时,用DD报文(Database Description Packet)来描述自己的LSDB,进行数据库的同步。报文内容包括LSDB中每一条LSA的Header(LSA的Header可以唯一标识一条LSA)。LSA Header只占一条LSA的整个数据量的一小部分,这样可以减少路由器之间的协议报文流量,对端路由器根据LSA Header就可以判断出是否已有这条LSA。在两台路由器交换DD报文的过程中,一台为Master,另一台为Slave。由Master规定起始序列号,每发送一个DD报文序列号加1,Slave方使用Master的序列号作为确认。
字段 | 长度 | 含义 |
---|---|---|
Interface MTU | 16比特 | 在不分片的情况下,此接口最大可发出的IP报文长度 |
Options | 8比特 | 可选项:E:允许Flood AS-External-LSAs;MC:转发IP组播报文;N/P:处理Type-7 LSAs;DC:处理按需链路。 |
I | 1比特 | 当发送连续多个DD报文时,如果这是第一个DD报文,则置为1,否则置为0。 |
M (More) | 1比特 | 当发送连续多个DD报文时,如果这是最后一个DD报文,则置为0。否则置为1,表示后面还有其他的DD报文。 |
M/S (Master/Slave) | 1比特 | 当两台OSPF路由器交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master。 |
DD sequence number | 32比特 | DD报文序列号。主从双方利用序列号来保证DD报文传输的可靠性和完整性。 |
LSA Headers | 可变 | 该DD报文中所包含的LSA的头部信息。 |
两台路由器互相交换过DD报文之后,知道对端的路由器有哪些LSA是本地的LSDB所缺少的和哪些LSA是已经失效的,这时需要发送LSR报文(Link State Request Packet)向对方请求所需的LSA。内容包括所需要的LSA的摘要。LSR报文格式如下图所示,其中LS type、Link State ID和Advertising Router可以唯一标识出一个LSA,当两个LSA一样时,需要根据LSA中的LS sequence number、LS checksum和LS age来判断出所需要LSA的新旧。
字段 | 长度 | 含义 |
---|---|---|
LS type | 32比特 | LSA的类型号 |
Link State ID | 32比特 | 根据LSA中的LS Type和LSA description在路由域中描述一个LSA |
Advertising Router | 32比特 | 产生此LSA的路由器的Router ID |
用来向对端Router发送其所需要的LSA或者泛洪自己更新的LSA,内容是多条LSA(全部内容)的集合。LSU报文(Link State Update Packet)在支持组播和广播的链路上是以组播形式将LSA泛洪出去。为了实现Flooding的可靠性传输,需要LSAck报文对其进行确认。对没有收到确认报文的LSA进行重传,重传的LSA是直接发送到邻居的。
字段 | 长度 | 含义 |
---|---|---|
Number of LSAs | 32比特 | LSA的数量。 |
常用的LSA共有5种,分别为:Router-LSA、Network-LSA、Network-summary-LSA、ASBR-summary-LSA和AS-External-LSA。所有的LSA都有相同的报文头。
字段 | 长度 | 含义 |
---|---|---|
LS age | 16比特 | LSA产生后所经过的时间,以秒为单位。无论LSA是在链路上传送,还是保存在LSDB中,其值都会在不停的增长 |
Options | 8比特 | 可选项:E:允许泛洪AS-External-LSA;MC:转发IP组播报文;N/P:处理Type-7 LSA;DC:处理按需链路 |
LS type | 8比特 | LSA的类型:Type1:Router-LSA;Type2:Network-LSA;Type3:Network-summary-LSA;Type4:ASBR-summary-LSA;Type5:AS-External-LSA;Type7:NSSA-LSA |
Link State ID | 32比特 | 与LSA中的LS Type和LSA description一起在路由域中描述一个LSA |
Advertising Router | 32比特 | 产生此LSA的路由器的Router ID |
LS sequence number | 32比特 | LSA的序列号。其他路由器根据这个值可以判断哪个LSA是最新的。 |
LS checksum | 16比特 | 除了LS age外其它各域的校验和 |
length | 16比特 | LSA的总长度,包括LSA Header,以字节为单位 |
Router-LSA(Type1):每个路由器都会产生,描述了路由器的链路状态和开销,在所属的区域内传播。
字段 | 长度 | 含义 |
---|---|---|
Link State ID | 32比特 | 生成LSA的Router ID |
V (Virtual Link) | 1比特 | 如果产生此LSA的路由器是虚连接的端点,则置为1。 |
E (External) | 1比特 | 如果产生此LSA的路由器是ASBR,则置为1。 |
B (Border) | 1比特 | 如果产生此LSA的路由器是ABR,则置为1。 |
# links | 16比特 | LSA中所描述的链路信息的数量,包括路由器上处于某区域中的所有链路和接口 |
Link ID | 32比特 | 路由器所接入的目标,其值取决于连接的类型:1:Router ID;2:DR的接口IP地址;3:网段/子网号;4:虚连接中对端的Router ID。 |
Link Data | 32比特 | 连接数据,其值取决于连接的类型:unnumbered P2P:接口的索引值;stub网络:子网掩码;其它连接:路由器接口的IP地址。 |
Type | 8比特 | 路由器连接的基本描述:1:点到点连接到另一台路由器;2:连接到传输网络;3:连接到stub网络;4:虚拟链路。 |
# TOS | 8比特 | 连接不同的TOS数量。 |
metric | 16比特 | 链路的开销值。 |
TOS | 8比特 | 服务类型。 |
TOS metric | 16比特 | 和指定TOS值相关联的度量。 |
Network-LSA(Type2):由广播网或NBMA网络中的DR产生,Network-LSA中记录了这一网络上所有路由器的Router ID,描述本网段的链路状态,在所属的区域内传播。
字段 | 长度 | 含义 |
---|---|---|
Link State ID | 32比特 | DR的接口IP地址 |
Network Mask | 32比特 | 该广播网或NBMA网络地址的掩码 |
Attached Router | 32比特 | 连接在同一个网络上的所有路由器的Router ID,也包括DR的Router ID |
Network-summary-LSA(Type3):描述区域内所有网段的路由,并通告给其他相关区域。
ASBR-summary-LSA(Type4):描述到ASBR的路由,通告给除ASBR所在区域的其他相关区域。
Type3和Type4的LSA有相同的格式,它们都是由ABR产生。
字段 | 长度 | 含义 |
---|---|---|
Link State ID | 32比特 | 通告的网络地址。如果是ASBR Summary LSA,此字段表示ASBR的Router ID |
Network Mask | 32比特 | 该广播网或NBMA网络地址的掩码。如果是ASBR Summary LSA,此字段无意义,设置为0.0.0.0 |
metric | 24比特 | 到目的地址的路由开销 |
TOS | 8比特 | 服务类型 |
TOS metric | 24比特 | 和指定TOS值相关联的度量 |
通告缺省路由时,Link State ID和Network Mask都设置为0.0.0.0。
AS-External-LSA(Type5):由ASBR产生,描述到AS外部的路由,这是五种LSA中,唯一一种通告到所有区域(除了Stub区域和NSSA区域)的LSA。
字段 | 长度 | 含义 |
---|---|---|
Link State ID | 32比特 | 通告的网络地址 |
Network Mask | 32比特 | 通告的目的地址的掩码 |
E | 1比特 | 外部度量值类型:0:第一类外部路由;1:第二类外部路由。 |
metric | 24比特 | 到目的地址的路由开销 |
Forwarding Address | 32比特 | 到所通告的目的地址的报文将被转发到这个地址 |
External Route Tag | 32比特 | 添加到外部路由上的标记。OSPF本身并不使用这个字段,它可以用来对外部路由进行管理 |
TOS | 8比特 | 服务类型 |
TOS metric | 24比特 | TOS附加距离信息 |
用来对接收到的LSU报文进行确认。内容是需要确认的LSA的Header(一个LSAck报文可对多个LSA进行确认)。LSAck(Link State Acknowledgment Packet)报文根据不同的链路以单播或组播的形式发送。
字段 | 长度 | 含义 |
---|---|---|
LSAs Headers | 可变 | 通过LSA的头部信息确认收到该LSA |
Route ID:Router ID是一个32位的值,它唯一标识了一个自治系统内的路由器,可以为每台运行OSPF的路由器上可以手动配置一个Router ID,或者指定一个IP地址作为Router ID。如果设备存在多个逻辑接口地址,则路由器使用逻辑接口中最大的IP地址作为Router ID;如果没有配置逻辑接口,则路由器使用物理接口的最大IP地址作为Router ID。在为一台运行OSPF的路由器配置新的Router ID后,可以在路由器上通过重置OSPF进程来更新Router ID。通常建议手动配置Router ID,以防止Router ID因为接口地址的变化而改变。
邻居(Neighbor):送LSA之前必须先发现邻居并建立邻居关系。
邻接(Adjacency):形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。只有当双方成功交换DD报文,并能交换LSA之后,才形成真正意义上的邻接关系。
DR:指定路由器,其负责在MA网络建立和维护邻接关系并负责LSA的同步。DR与其他所有的路由器形成邻接关系并交换链路状态信息,其他路由器不直接交换链路状态信息,这样大大减少了MA网络中邻接关系的数量和交换链路状态信息消耗的资源。DR一旦出现故障,与其他路由器的邻接关系立即失效,链路状态数据库也无法同步,此时就需要重新选举DR,再与非DR路由器建立邻接关系,完成LSA的同步。一般的通过选举备份指定路由器BDR避免此故障,在DR故障时BDR快速接管DR的工作。
BDR:DR的备份路由器
OSPF要求每台运行OSPF的路由器都了解整个网络的链路状态信息,这样才能计算出到达目的地的最优路径。OSPF的收敛过程由链路状态公告LSA(Link State Advertisement)泛洪开始,LSA中包含了路由器已知的接口IP地址、掩码、开销和网络类型等信息。收到LSA的路由器都可以根据LSA提供的信息建立自己的链路状态数据库LSDB(Link State Database),并在LSDB的基础上使用SPF算法进行运算,建立起到达每个网络的最短路径树。最后,通过最短路径树得出到达目的网络的最优路由,并将其加入到IP路由表中,过程如下:
OSPF的邻居发现过程是基于Hello报文来实现的,如果路由器发现所接收的合法Hello报文的邻居列表中有自己的Router ID,则认为已经和邻居建立了双向连接,表示邻居关系已经建立。
验证一个接收到的Hello报文是否合法包括:
路由器在建立完成邻居关系之后,便开始进行数据库同步,具体过程如下:
OSPF定义了四种网络类型,分别是点到点网络,广播型网络,NBMA网络和点到多点网络。
在P2P(点到点)、P2MP(点到多点)网络上具有邻居关系的路由器会进一步建立邻接关系,在广播型(Broadcost)网络和非广播多路访问(NBMA)网络上,非DR/BDR之间只能建立邻接关系,不能建立邻接关系,,非DR/BDR路由器与DR/BDR路由器之间只会建立邻接关系。
OSPF可以在不支持广播的多路访问网络上运行,此类网络包括在hub-spoke拓扑上运行的帧中继(FR)和异步传输模式(ATM)网络,这些网络的通信依赖于虚电路。OSPF定义了两种支持多路访问的网络类型:非广播多路访问网络(NBMA)和点到多点网络(Point To Multi-Points)。
DR是基于端口的路由器优先级的值进行选举的。
在邻居发现完成之后,路由器会根据网段类型进行DR选举。在广播和NBMA网络上,路由器会根据参与选举的每个接口的优先级进行DR选举。优先级取值范围为0-255,值越高越优先。缺省情况下,接口优先级为1。如果一个接口优先级为0,那么该接口将不会参与DR或者BDR的选举。如果优先级相同时,则比较Router ID,值越大越优先被选举为DR。
为了给DR做备份,每个广播和NBMA网络上还要选举一个BDR。BDR也会与网络上所有的路由器建立邻接关系。
为了维护网络上邻接关系的稳定性,如果网络中已经存在DR和BDR,则新添加进该网络的路由器不会成为DR和BDR,不管该路由器的Router Priority是否最大。如果当前DR发生故障,则当前BDR自动成为新的DR,网络中重新选举BDR;如果当前BDR发生故障,则DR不变,重新选举BDR。这种选举机制的目的是为了保持邻接关系的稳定,使拓扑结构的改变对邻接关系的影响尽量小。
OSPF 划分区域之后,并非所有的区域都是平等的关系。其中有一个区域是与众不同的,它的区域号是 0,通常被称为骨干区域。骨干区域负责区域之间的路由,非骨干区域之间的路由信息必须通过骨干区域来转发。对此,OSPF 有两个规定:
A、所有非骨干区域必须与骨干区域保持连通;
B、 骨干区域自身也必须保持连通。
在实际应用中,可能会因为各方面条件的限制,无法满足上面的要求。这时可以通过配置 OSPF 虚连接予以解决。
虚连接是指在两台 ABR 之间通过一个非骨干区域而建立的一条逻辑上的连接通道。它的两端必须是 ABR,而且必须在两端同时配置方可生效。为虚连接两端提供一条非骨干区域内部路由的区域称为传输区(Transit Area)。
虚连接的另外一个应用是提供冗余的备份链路,当骨干区域因链路故障不能保持连通时,通过虚连接仍然可以保证骨干区域在逻辑上的连通性。
虚连接相当于在两个 ABR 之间形成了一个点到点的连接,因此,在这个连接上,和物理接口一样可以配置接口的各参数,如发送 Hello 报文间隔等。
两台ABR之间直接传递OSPF报文信息,它们之间的OSPF路由器只是起到一个转发报文的作用。由于协议报文的目的地址不是中间这些路由器,所以这些报文对于它们而言是透明的,只是当作普通的 IP 报文来转发。
标准区域可以接受任何链路更新信息和路由汇总信息。
只有一个区域相连的非骨干区域,不接受外部自治系统的LSA(类型5),路由器会把去往外部的信息采用缺省路由0.0.0.0发送出去。只承载本区域发起的流量和访问本区域的流量。Stub区域的ABR不向Stub区域内传播它接收到的自治系统外部路由(对应四类、五类LSA),Stub区域中路由器的LSDB、路由表规模都会大大减小。为保证Stub区域能够到达自治系统外部,Stub区域的ABR将生成一条缺省路由(对应三类LSA),并发布给Stub区域中的其他路由器。Stub区域是一种可选的配置属性,但并不建议将每个区域都配置为Stub区域。通常来说,Stub区域位于自治系统的末梢,是那些只有一个ABR的非骨干区域。
配置Stub区域时需要注意下列几点:
[Huawei-ospf-1-area-0.0.0.1]stub
一种更加经济的末梢区域,不接受类型3、4、5的LSA,路由器也会把去往外部的信息采用缺省路由0.0.0.0发送出去。Totally Stub区域既不允许自治系统外部路由(四类、五类LSA)在本区域内传播,也不允许区域间路由(三类LSA)在本区域内传播。Totally Stub区域内的路由器对其他区域及自制系统外部的访问需求是通过本区域ABR所产生的三类LSA缺省路由实现的。与Stub区域配置的区别在于,在ABR上需要追加no-summary参数。
[Huawei-ospf-1-area-0.0.0.1]stub no-summary
NSSA(Not-So-Stubby Area)区域是 Stub 区域的变形,与 Stub 区域的区别在于 NSSA 区域允许引入自治系统外部路由,由 ASBR 发布 Type-7 LSA 通告给本区域。当 Type-7 LSA 到达 NSSA 的ABR 时,由 ABR 将 Type-7 LSA 转换成 Type-5 LSA,传播到其他区域。可以将区域配置为 Totally NSSA(完全 NSSA)区域,该区域的 ABR 不会将区域间的路由信息传递到本区域。为保证到本自治系统的其他区域的路由依旧可达,该区域的 ABR 将生成一条缺省路由 Type-3 LSA,发布给本区域中的其他非 ABR 路由器。
[RTA]interface GigabitEthernet 0/0/0
[RTA- GigabitEthernet0/0/0]ospf cost 20
[RTB]ospf
[RTB-ospf-1]bandwidth-reference 10000
OSPF基于接口带宽计算开销,计算公式为:接口开销=带宽参考值/带宽。带宽参考值可配置,缺省为100Mbit/s。以此,一个64kbit/s串口的开销为1562,一个E1接口(2.048 Mbit/s)的开销为48。命令bandwidth-reference可以用来调整带宽参考值,从而可以改变接口开销,带宽参考值越大,开销越准确。在支持10Gbit/s速率的情况下,推荐将带宽参考值提高到10000Mbit/s来分别为10 Gbit/s、1 Gbit/s和100Mbit/s的链路提供1、10和100的开销。注意,配置带宽参考值时,需要在整个OSPF网络中统一进行调整。
另外,还可以通过ospf cost命令来手动为一个接口调整开销,开销值范围是1~65535,缺省值为1。
OSPF支持简单认证及加密认证功能,加密认证对潜在的攻击行为有更强的防范性。OSPF认证可以配置在接口或区域上,配置接口认证方式的优先级高于区域认证方式。
接口或区域上都可以运行ospf authentication-mode { simple [ [ plain ] | cipher ] | null } 命令来配置简单认证,参数plain表示使用明文密码,参数cipher表示使用密文密码,参数null表示不认证。
命令ospf authentication-mode { md5 | hmac-md5 } [ key-id { plain | [ cipher ] } ] 用于配置加密认证,MD5是一种保证链路认证安全的加密算法(具体配置已在举例中给出),参数key-id表示接口加密认证中的认证密钥ID,它必须与对端上的key-id一致。
[RTA]ospf router-id 1.1.1.1
[RTA-ospf-1]area 0
[RTA-ospf-1-area-0.0.0.0]network 192.168.1.0 0.0.0.255
[RTA]interface GigabitEthernet0/0/0
[RTA-GigabitEthernet0/0/0]ospf authentication-mode md5 1 huawei