文章目录
- 1.router-ID
- 2.OSPF的三张表
- 2.1邻居表(peer table或Neighbor Table)
- 2.2链路状态数据库(Link-State Database,LSDB)
- 2.3OSPF路由表(Routing Table)
- 3.度量值
- 4.报文类型及格式
- 4.1 Hello报文
- 4.2 DD报文
- 4.3 LSR报文
- 4.4 LSU报文
- 4.5 LSAck报文
- 5.邻接关系
- 5.1OSPF邻居状态
- 5.2 邻接关系建立过程
- 6.网络类型
- 6.1 点对点类型(Point-to-Point,P2P)
- 6.2广播型多路访问类型(Broadcast Multi-Access,BMA)
- 6.3 非广播型多路访问类型(Non-Broadcast Multi-Access,NBMA)
- 6.4点对多点类型(Point-Multipoint,P2MP)
- 7.DR及BDR的概念
- 8.区域的概念及多区域部署
- 9.OSPF路由器的角色
1.router-ID
长度为32bit的数值
通常用点分十进制表示(如1.1.1.1)
一定要记得手动配置router-ID,方便区分不同的OSPF路由。
2.OSPF的三张表
2.1邻居表(peer table或Neighbor Table)
可以用display ospf peer查看ospf邻居表
2.2链路状态数据库(Link-State Database,LSDB)
用display ospf lsdb查看LSDB
数据库中存放LSA(Link-State Advertisement,链路状态通告),路由器把收集到的LSA放入数据库中,生成路由器对网络的完整认知。
2.3OSPF路由表(Routing Table)
用display ospf routing查看OSPF路由表
OSPF根据LSDB中的数据,运行SPF算法得到一棵以自己为根、无环的最短路径树,根据这棵树,OSPF可以生成到达各个网段的最短路径,并写入OSPF路由表。
3.度量值
OSPF用Cost(开销)作为路由度量值。
OSPF接口Cost值的计算公式是:OSPF带宽参考值/接口带宽,结果取整数。
(华为路由器OSPF参考值缺省为100Mbit/s)
OSPF会比较不同路径的开销值,选取最小的写入路由表中。
4.报文类型及格式
OSPF协议基于IP运行,协议号89。OSPF分为5种报文:Hello报文、DD报文、LSR报文、LSU报文和LSAck报文。
OSPF报文使用组播地址作为目的IP地址,以下两个组播IP地址是被保留专用于OSPF
- 224.0.0.5:该组播IP地址意指所有的OSPF路由器
- 224.0.0.6:该组播IP地址意指所有的OSPF DR路由器
OSPF共有五种报文
类型 | 报文名称 | 报文描述 |
1 | Hello | 用于发现直连链路上的OSPF邻居,以及维护OSPF邻居关系 |
2 | DD (Database Description,数据库描述) | 用于描述LSDB,该报文中携带的是LSDB中的LSA的头部数据(也就是并非完整的LSA内容,仅仅是头部数据) |
3 | LSR(Link State Request,链路状态请求) | 用来向OSPF邻居请求LSA |
4 | LSU(Link state Update,链路状态更新) | 用于发送LSA,该报文中携带的是完整的LSA数据。LSA是承载在LSU中进行泛洪的。 |
5 | LSAck(Link State Acknowledgment,链路状态确认 ) | 设备收到LSU后,LSAck用于对接受的LSA进行确认 |
OSPF这五种报文具有相同的报文头格式,长度为24字节。
字段 | 长度 | 含义 |
版本(Version) | 1字节 | 版本,OSPF的版本号。对于OSPFv2来说,其值为2。 |
类型(Type) | 1字节 | 类型,OSPF报文的类型,有下面几种类型:Hello报文;DD报文;LSR报文;LSU报文;LSAck报文。 |
报文长度(Packet length) | 2字节 | OSPF报文的总长度,包括报文头在内,单位为字节。 |
路由器ID(Router ID) | 4字节 | 发送该报文的路由器标识。 |
区域ID(Area ID) | 4字节 | 发送该报文的所属区域。 |
校验和(Checksum) | 2字节 | 校验和,包含除了认证字段的整个报文的校验和。 |
认证类型(AuType) | 2字节 | 验证类型,值有如下几种表示, 0:不验证;1:简单认证;2:MD5认证。 |
认证数据(Authentication) | 8字节 | 鉴定字段,其数值根据验证类型而定。当验证类型为0时未作定义;类型为1时此字段为密码信息;类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。 MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。 |
4.1 Hello报文
用于发现直连链路上的OSPF邻居,以及维护OSPF邻居关系
字段 | 长度 | 含义 |
网络掩码(Network Mask) | 32比特 | 发送Hello报文的接口所在网络的掩码。 |
Hello间隔Hello Interval | 16比特 | 发送Hello报文的时间间隔。在P2P或Broadcast类型的接口上为10s,在NBMA及P2MP类型的接口上为30s |
可选项(Options) | 8比特 | 可选项:E:允许Flood AS-External-LSAs MC:转发IP组播报文 N/P:处理Type-7 LSAs DC:处理按需链路 |
路由器优先级(Router Priority) | 8比特 | DR优先级。默认为1。如果设置为0,则路由器不能参与DR或BDR的选举。 |
路由器失效时间(Router Dead Interval) | 32比特 | 失效时间。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效。 缺省情况下失效时间是Hello间隔的4倍 |
制定路由器(Designated Router) | 32比特 | DR的接口地址。如果字段是0.0.0.0,则表示DR尚未选举出来。 |
备份指定路由器(Backup Designated Router) | 32比特 | BDR的接口地址。如果字段是0.0.0.0,则表示BDR尚未选举出来或没有DBR。 |
邻居(Neighbor) | 32比特 | 邻居,以Router ID标识。 |
4.2 DD报文
用于描述LSDB,该报文中携带的是LSDB中的LSA的头部数据(也就是并非完整的LSA内容,仅仅是头部数据)
字段 | 长度 | 含义 |
接口最大传输单元(Interface MTU) | 16比特 | 在不分片的情况下,此接口最大可发出的IP报文长度。 在缺省时接口发送的DD报文中,无论接口MYU值是多少,该字段都为0 |
可选项(Options) | 8比特 | 可选项:E:允许Flood AS-External-LSAs; MC:转发IP组播报文; N/P:处理Type-7 LSAs; DC:处理按需链路。 |
I位(Initial Bit) | 1比特 | 也及初始化位,当在协商主从路由器时为1,选举完成后为0. |
M位 (More) | 1比特 | 当发送连续多个DD报文时,如果这是最后一个DD报文,则置为0。否则置为1,表示后面还有其他的DD报文。 |
M/S位 (Master/Slave) | 1比特 | 当两台OSPF路由器交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master,0表示发送方为Slave。 |
DD序列号(DD sequence number) | 32比特 | DD报文序列号。在DD报文交互过程中,DD序列号被逐次加1,,用于确保DD报文传输的有序性和可靠性。 DD序列号必修由Master路由器决定,而Slave路由器只能使用Master路由器发送的DD序列号来发送自己的DD报文。 |
LSA头部(LSA Headers) | 可变 | 该DD报文中所包含的LSA的头部信息。 |
4.3 LSR报文
在与OSPF邻居交换DD报文之后,路由器就知道邻居的LSDB摘要,然后向邻居发送LSR报文来请求LSA的完整数据。
字段 | 长度 | 含义 |
链路状态类型(LS type) | 32比特 | LSA的类型号。如: 1-Router LSA 2-Network LSA 3-Network Summary LSA 4-ASBR Summary 5-AS External LSA |
链路状态标识(Link State ID) | 32比特 | 根据LSA中的LS Type和LSA description在路由域中描述一个LSA。 |
通告路由器(Advertising Router) | 32比特 | 产生此LSA的路由器的Router ID。 |
4.4 LSU报文
路由器接收到邻居发送过来的LSR后,会以LSU报文进行回应,在LSU报文中包含了对方请求的LSA完整信息。一个LSU可以包含多个LSA。另外,当路由器感知到网络发送变化时,也会触发LSU报文的泛洪。
非DR、BDR路由器向224.0.0.6这个组播地址发送LSU报文,而DR及BDR会侦听这个组播地址,DR在接收LSU报文后向224.0.0.5发送LSU报文,从而将更新信息泛洪到整个OSPF区域,所有OSPF路由器都会侦听224.0.0.5这个组播地址。
4.5 LSAck报文
当路由器收到邻居发来的LSU报文后,会发送一个LSAck报文来回复。
字段 | 长度 | 含义 |
LSA头部(LSAs Headers) | 可变 | 通过LSA的头部信息确认收到该LSA。 |
5.邻接关系
开启OSPF后,发送和侦听Hello报文,在通过Hello报文发现和确认双向通信后,两者便形成了邻居关系。
但这只是一个开头,一系列的报文交互和邻居状态的切换会在接下来的过程中继续发生,两台路由器会开始交互空的DD报文协商Master/Slave,再交互包含LSA头部的DD报文以便描述自己的LSDB,然后通过LSR及LSU报文交互双方的LSA,当两者的LSDB同步完成后,两台路由器形成了对网络拓扑的一致认知,并开始独立计算路由。此时,我们称这两台路由器形成了邻接关系。
5.1OSPF邻居状态
Down(失效):OSPF邻居状态切换的初始状态。在该状态下, OSPF接口尚未收到邻居发送的Hello报文。
Init (初始) :当OSPF路由器收到直连链路上某个邻居发送过来的有效Hello报文,但并未在Hello报文的“邻居”字段中看到自己的Router-ID时,它会将该邻居置为Init状态。
这个状态表明,在该直连链路上有一个活跃的OSPF路由器,但是目前两者尚未确认双向通讯。接下来,收到Hello报文的路由器会将对方的Router-ID添加到自己发送的Hello报文中,以便告知对方: “我已经发现你了"。
Attempt (尝试) :该状态只在NBMA类型的接口中出现。在NBMA网络中,OSPF邻居通常是采用手工的方式指定的,此时OSPF路由器往往通过单播的Hello报文与直连设备建立邻居关系。
当路由器的NBMA接口激活后,邻居的状态将从Down过渡到Attempt,在该状态下,路由器周期性地向邻居发送Hello报文,但是当前并未从邻居收到有效的Hello报文。当路由器收到邻居发送的Hello报文后(但是没有在该报文的"邻居”字段中看到自己的Router-ID),则将邻居的状态切换到Init。
2-Way (双向通信):当OSPF路由器收到直连链路上某个邻居发送过来的Hello报文并且在该报文的“邻居”字段中发现自己的Router-ID时,它会将该邻居置为2-Way状态,这表明它与邻居确认了双向通信。
2-Way状态可以视为OSPF的稳定状态之一,也是建立邻接关系的基础。
ExStart (交换初始) :在该状态下,路由器发送空的DD报文以便协商Master/Slave,Router-ID最大的路由器会成为Master路由器, DD序列号就是由Master路由器决定的。,用于Master/Slave协商的报文是空的、不携带任何LSA头部的DD报文,在这些报文中,I比特位被设置为1。
Exchange (交换) :在该状态下,路由器向邻居发送描述自己LSDB的DD报文,DD报文中包含LSA的头部(而不是完整的LSA数据),。
DD报文逐个发送,每个报文中包含着DD序列号, DD序列号是由Master路由器决定的,这个序列号在DD报文的交互过程中被递增,以确保DD报文交互过程的有序性和可靠性。
Loading (加载) :在该状态下,路由器向邻居发送LSR以便请求LSA的完整数据。对方使用LSU报文进行回应,因此只有LSU报文里才有LSA的完整信息。在收到LSU报文后,路由器需要发送LSAck对其中的LSA进行确认。
Full (全毗邻) :当接口上待请求的LSA列表为空时,表明路由器已经完成了与邻居的LSDB同步,没有再需要请求的LSA了,此时邻居的状态被置为Full。
5.2 邻接关系建立过程
交换Hello报文建立邻居关系
交换空DD报文,协商主从路由,协商完成后发送LSA头部信息
互相请求对方的完整LSA,发送LSR请求报文,对方收到后发送LSU报文,几次交换后双方数据库同步后,便建立邻接状态。
6.网络类型
OSPF接口的网络类型与该接口采用的数据链路层封装有关,在不同网络类型的接口上OSPF的操作有所不同。
6.1 点对点类型(Point-to-Point,P2P)
点到点网络指的是在一段链路上只能连接两台路由器的环境。一个典型的例子是PPP链路,当两台路由器通过PPP链路直连时,设备接口上采用的封装协议就是PPP,当这个接口激活OSPF后, OSPF会自动根据该接口的数据链路层封装将其网络类型设置为P2P。
另外,当接口采用HDLC封装时,其OSPF网络类型缺省也为P2P, OSPF在网络类型为P2P的接口上以组播的方式(相应的组播IP地址为224.0.0.5)发送协议报文(Hello报文、DD报文、LSR报文、LSU报文以及LSAck报文)。
缺省情况下, P2P类型的接口以10s为间隔周期性地发送Hello报文。
OSPF在P2P类型的网络中不会选举DR及BDR.
6.2广播型多路访问类型(Broadcast Multi-Access,BMA)
BMA (或者称为Broadcast)是一个支持广播的网络环境,该网络允许多台路由器接入,任意两台路由器之间都能直接进行二层通信,一台路由器发送出去的广播数据会被所有其他的路由器收到。
以太网(Ethernet)是典型的广播型多路访问网络。当多台路由器接入到同一个BMA网络(例如多台路由器连接在同一台以太网二层交换机上)时,这些路由器的接口一旦激活OSPF便会开始发送组播的Hello报文从而发现网络中的其他路由器。如果路由器两两之间都建立全毗邻的邻接关系,这意味着每台路由器不得不维护大量的邻接关系。为了避免这个问题, OSPF在这种网络中会进行DR和BDR的选举,所有非DR, BDR路由器仅与DR和BDR建立邻接关系。
OSPF在BMA类型的接口上通常以组播的方式发送Hello报文、LSU报文及LSAck报文,以单播的形式发送DD报文及LSR报文。当使用组播的方式发送协议报文时,有两个组播地址可能会被使用到-224.0.0.5及224.0.0.6,当路由器需要向DR以及BDR发送OSPF报文时,使用224.0.0.6这个组播地址作为报文的目的IP地址;当需要向所有的OSPF路由器发送报文时,使用224.0.0.5。
缺省情况下, Broadcast类型的接口以10s为间隔周期性地发送Hello报文。
6.3 非广播型多路访问类型(Non-Broadcast Multi-Access,NBMA)
NBMA网络也允许多台路由器接入,但是该网络不具备广播能力,正因为如此,基于组播发送的Hello报文在NBMA网络中可能就会遇到问题。
在这种场景中,为了让OSPF路由器之间能够顺利地发现彼此并且正确地建立邻接关系,还需要进一步的配置,例如使用单播的方式来发送OSPF报文等。NBMA网络的一个最为大家熟知的代表是帧中继(Frame-Relay),另一个例子是X.25。OSPF在NBMA网络中,也会进行DR及BDR的选举。
缺省情况下, NBMA类型的接口以30s为间隔周期性地发送Hello报文。
6.4点对多点类型(Point-Multipoint,P2MP)
与前面介绍的几种网络类型不同, P2MP并非路由器根据接口的数据链路层封装自动设置的,而是必须通过网络管理员手工指定的。
P2MP有点类似于将多条P2P链路的一端进行捆绑得到的网络。在P2MP网络中无需选举DR, BDR. OSPF在P2MP类型的接口上通常以组播的方式发送Hello报文,以单播的方式发送其他报文。
缺省情况下,Hello报文的发送间隔为30s。
即使两个路由器的直连接口网络类型不匹配,也可以建立起OSPF邻接关系,但是OSPF路由的计算很有可能出问题。因此, OSPF邻居的互联接口网络类型必须一致。
7.DR及BDR的概念
通俗的讲,多路访问(Multiple-Access,简称MA)网络指的是在同一个共享介质中连接着多个设备的网络,在这个网络中,任意两台设备之间都能够直接地进行二层通信。
多路访问网络有两种,一种广播型多路访问(Broadcast Multiple-Access, BMA)网络,例如以太网。另一种则是非广播型多路访问(Non-Broadcast Multiple-Access, NBMA)网络,例如帧中继。
BMA网络的一个典型示例是一台以太网交换机连接着多台路由器,这些路由器的接口具备从这个网络访问其他路由器的能力,若有一个广播数据被发出,则整个网络中的路由器都会收到。而在帧中继环境中,多台路由器同样可以通过帧中继链路构建一个MA网络,只不过帧中继链路并不支持广播,但不管怎样,这不影响一台路由器通过这个共享介质去访问其他设备,只要虚电路建立得当。
我们把既不是DR又不是BDR的路由器称为DROther, MA网络中的所有DROther都只和DR以及BDR建立OSPF邻接关系, BDR也与DR建立邻接关系,而DROther之间只停留在2-Way状态。如此一·来,网络中的路由器所需维护的邻接关系数量便得到了优化。
DR在网络中的LSDB同步方面有着关键性的作用,它负责侦听网络中的拓扑变更信息并将变更信息通知给其他路由器。它为网络生成Type-2 LSA,在该LSA中显示出了连接在这个MA网络的所有OSPF路由器的Router-ID,其中也包括DR自己。BDR会监控DR的状态,并在当前DR发生故障时接替它的工作。
DR、 BDR的选举是通过Hello报文来实现的,选举过程发生在2-Way状态之后。路由器将自己接口的DR优先级填写在Hello报文的"DR优先级”字段之中。
这个值可以通过ospf dr-priority命令修改(该命令需在接口视图下执行),取值范围是0~255, DR优先级为0的接口不具备DR及BDR选举资格。
当接口激活OSPF后,它首先会检查网络上是否已经存在DR,如果是则接受已经存在的DR (因此DR的角色不具备可抢占性),否则拥有最高DR优先级的路由器将成为DR,当DR优先级相等时,拥有最大Router-ID的路由器将成为DR。除了DR的选举, OSPF还会进行BDR的选举, BDR的选举过程与DR类似.
值得注意的是, DR及BDR是一个接口级别的概念,所以“某台路由器是DR"的,说法其实是不够严谨的,严格地说应该是: “某台路由器的某个接口在这个MA网络中是DR"。在一个MA网络中, DR负责确保接入该网络中的所有OSPF路由器拥有相同的LSDB,也就是确保这些LSDB的同步。
DR使用组播目的IP地址224.0.0.5向该网络中发送LSU报文,所有的OSPF路由器都会侦听这个目的IP地址,并与DR同步自己的LSDB。而DROther感知到拓扑变化时,向224.0.0.6发送LSU报文以便通告这个变化, DR及BDR会侦听这个组播地址。
8.区域的概念及多区域部署
我们把一系列连续的OSPF路由器组成的网络称为OSPF域(Domain),每个域下还会划分区域(Area),某些LSA的泛洪被限制在单个区域内部,同一个区域内的路由器维护一套相同的LSDB,它们对这个区域内的网络有着一致的认知。
每个区域独立地进行SPF计算。区域内的拓扑结构对于区域外部而言是不可见的,而且区域内部拓扑变化的通知可以被局限在该区域内,从而避免对区域外部造成影响。
如果一台路由器的多个接口分别接入了多个不同的区域,则它将为每个区域分别维护一套LSDB。
多区域的设计极大程度地限制了LSA的泛洪,有效的把拓扑变化的影响控制在区域内,另外在区域边界路由器上可以通过执行路由汇总来减少网络中的路由条目数量。多区域提高了网络的可扩展性,有利于组建更大规模的网络。
OSPF要求域中的所有非骨干区域(区域ID不为0的区域)都必须与Area0相连。
为避免区域间的路由形成环路,非骨干区域之间不允许直接相互发布区域间的路由。因此,所有的**ABR (Area Border Router,区域边界路由器)**都至少有一个接口属于Area0,所以Area0始终包含所有的ABR。
有的时候区域无法和Area0直连,必须经过其他区域才可以到达Area0。可以考虑使用一种临时解决方案。
那就是OSPF虚链路(Virtual Link), Virtual Link是一种逻辑的链路,并·非一条真实的链路,您可以将它理解为骨干区域的一个延伸,通过搭建一条Virtual Link,可以将原本没有与骨干区域直接相连的区域和后者连接起来。
9.OSPF路由器的角色
在OSPF中,存在多种路由器角色,每种路由器在OSPF网络中都发挥着不同的作用。
值得强调的是, OSPF不仅仅能够被部署在路由器上,实际上这个公有协议在许多交换机、防火墙产品,甚至Linux主机上都能被实现,因此所谓的“OSPF路由器”角色,实际上是以路由器作为代表。
内部路由器(Internal Router, IR):所有接口都接入同一个OSPF区域的路由器。它们所有直连接口都在同一个区域中激活OSPF。
区域边界路由器(Area Border Router, ABR):接入多个区域的路由器。并非所有接入多个区域的路由器都是ABR,它必须有至少一个接口在Area0中激活,同时还有其他接口在其他区域中激活。ABR负责在区域之间传递路由信息,因此ABR必须连接到Area0,同时连接着其他区域。
骨干路由器(Backbone Router, BR):接入Area0的路由器。一台路由器如果所有的接口都接入Area0,那么它就是一台骨干路由器,另外ABR也是骨干路由器。
AS边界路由器(AS Boundary Router, ASBR):工作在OSPF自治系统(AutonomousSystem, AS)边界的路由器。ASBR将OSPF域外的路由引入本域,外部路由在整个OSPF域内传递。并不是同时运行多种路由协议的OSPF路由器就一定是ASBR, ASBR一定是将外部路由重分发到OSPF,或者执行了路由重分发操作的路由器。