一、OSPF基础术语Router-ID
Router-ID是一个32位无符号整数,用于唯一标识一台运行OSPF协议的路由器。
Router ID选举规则如下:
- 手动配置oSPF路由器的Router ID(建议手动配置)
- 如果没有手动配置Router ID,则路由器使用Loopback接口中最大的IP地址作为Router ID
- 如果没有配置Loopback接口,则路由器使用物理接口中最大的IP地址作为Router ID
Loopback是路由器里面的一个逻辑接口。逻辑接口是指能够实现数据交换功能,但是物理上不存在、需要通过配置建立的接口。Loopback接口一旦被创建,其物理状态和链路协议状态永远是Up,即使该接口上没有配置IP地址。
区域(待补充)
OSPF Area用于表示一个OSPF的区域。
区域是从逻辑上将设备划分为不同的组,每个组用区域号Area ID来标识。
OSPF的区域D是一个32bit的非负整数,按点分十进制的形式(与1Pv4地址的格式一样)呈现,例
如Area 0.0.0.1。 为了简便起见,我们也会采用十进制的形式来表示。
链路的两端的路由器需要再同一个区域里。
待补充。。。。。计算机网络课本。。。主区域之类的度量值
OSPF使用Cost(开销)作为路由器的度量值。每个激活了OSPF的接口都会维护一个Cost值,缺省Cost=(100Mbit/s)/接口宽带(cost的值向下取整,若小于1则取1)。其中100Mbit/s为OSPF指定的缺省的参考值,该值是可配置的。
修改Cost值:1.直接修改接口的Cost值(推荐)。2、修改参考值。
OSPF以“累计cost”为开销值,也就是流量从源网络到目的网络所经过所有路由器的出接口的cost总和。
度量值修改举例:
上图(左):由于参考值缺省,且四条链路都是GE型,接口带宽相同,所以计算出的Cost值都相等。所以,对于R1来说,无论是通过R2到达R4,还是通过R3到达R4,开销都是一样的,所以会根据某种算法(例如负载均衡)选择一条路径。
上图(右):对于R1来说,两条路径开销不同,选择开销较小的路径发送数据。
二、OSPF三张表(待补充)
OSPF有三张重要的表项,OSPF邻居表、LSDB和OSPF路由表。
1、邻居表
对于OSPF的邻居表,需要了解:
- OSPF在传递链路状态信息之前,需先建立OSPF邻居关系。
- OSPF的邻居关系通过交互Helo报文建立。
- OSPF邻居表显示了OSPF路由器之间的邻居状态,使用
display ospf peeri
查看。
2、LSDB
对于OSPF的LSDB,需要了解:
- LSDB会保存自己产生的及从邻居收到的LSA信息,本例中R1的LSDB包含了三条LSA。
- Type标识LSA的类型,AdvRouter标识发送LSA的路由器。
- 使用命令
display ospf lsdb
查看LSDB表。
3、OSPF路由表
对于OSPF的路由表,需要了解:
- OSPF路由表和路由器路由表是两张不同的表。本例中OSPF路由表有三条路由。
- OSPF路由表包含Destination、Cost和NextHop等指导转发的信息。
- 使用命令display ospf routing查看OSPF路由表。
三、OSPF七种状态机
状态机名称 | 状态机描述 |
---|---|
Down(失效) | 该状态还没有进行hello包的收发,一旦进行hello的收发,则进入下一状态 |
Init(初始化) | 接收到的hello包中并不存在本地的(自己的)route-id,但是会将发送该hello包的邻居置为init状态,此时双方并没有建立双向通信,随着双方互相收发hello包,于是才会进入下一状态 |
2-way(双向通信) | 接收到的hello包中存在本地的(自己的)route-id,则双方就会进入2-way双向通信状态。该状态也是OSPF最稳定的状态之一,它标志着邻居关系的建立,同时也是邻接关系建立的基础 |
Exstart(预启动) | 使用类似hello的DD报文进行主从关系(Master/Slave)选举,route-id数值大为主,优先进入下一状态。此时的DD报文是空的。 |
Exchange(准交换) | 使用真正的DD报文进行数据库目录的共享 |
Loading (加载) | 使用LSR、LSU、LSAck去获取未知的LSA信息(LSDB同步) |
Full(全毗邻) | 邻接关系建立的标志,此时不再进行LSDB的同步 |
一些字段的详细解释:
Exstart
发送DD报文(此处DD报文不包含LSA头部信息)
作用:
1、决定主从关系(Router-ID大的为主路由器,小的为从路由器)
2、确定序列号保证报文交互的可靠性
3、比较MTU(可选,缺省不比较)
MTU对邻居建立的影响
1、主的MTU值比从设备的MTU值小;两端都会停留在Exstart状态
2、主的MTU值比从设备的MTU值大;从设备会停留在Exchange状态,主设备停留在Exstart状态
3、两端有一段未开启MTU值检测,则两端可以建立邻居
Exchange
通过交换DD报文,交换LSA头部信息
具体的交互流程
上述Exstart状态决定出主从关系后,即从设备此时收到了主设备发来的空的DD报文
从设备使用主的序列号发送DD报文来回应主(此时DD报文包含LSA头部信息)
主也通过DD报文发送自己的LSA头部信息,并将序列号加1
从又使用主的序列号回应主;一直循环,直到主与从的M位都不置位(或者说只要有一侧有未传递的LSA头,就会一直循环)
四、OSPF四种网路类型
OSPF协议支持四种网络类型,分别是点到点网络,广播型网络,NBMA网络和点到多点网络。
1、BMA
广播型网络(Broadcast Multiple Access)是指支持两台以上路由器,并且具有广播能力的网络。一个含有三台路由器的以太网就是一个广播型网络的例子。
OSPF可以在不支持广播的多路访问网络上运行,此类网络包括在hub-spoke拓扑上运行的帧中继(FR)和异步传输模式(ATM)网络,这些网络的通信依赖于虚电路。
OSPF定义了两种支持多路访问的网络类型:非广播多路访问网络(NBMA)和点到多点网络(Point To Multi-Points)。
2、NBMA
非广播式多路访问(Non Broadcast Multiple Access):在NBMA网络上,OSPF模拟在广播型网络上的操作,但是每个路由器的邻居需要手动配置**。NBMA方式要求网络中的路由器组成全连接。
缺省情况下,OSPF认为帧中继、 ATM的网络类型是NBMA。
3、P2P
点到点网络(Point-to-Point)是指只把两台路由器直接相连的网络。一个运行PPP的64K串行线路就是一个点到点网络的例子。
4、P2MP
点到多点(point to multi point):将整个网络看成是一组点到点网络。对于不能组成全连接的网络应当使用点到多点方式。
实际情况下,没有哪一种网络拓扑是P2MP网络,需要通过命令来改变网络类型。
5、四种网络的特点
网络类型 | 特点 | Hello Interval | 例子 |
---|---|---|---|
广播BMA | 需要DR和BDR的选举,不用手动指邻居 通常以组播发送HELLO报文,LSU报文,和LSACK报文,以单播形式发送DD和LSR报文 DR和BDR给非指定路由器发送消息使用的是组播224.0.0.5 非指定路由器给DR和BDR发送消息使用的是组播224.0.0.6 | 10秒 | 以太网 |
非广播多路访问NBMA | 连接的路由器超过两台但是没有广播功能 所有数据包均单播发送,有DR的选举,需要手动指定邻居 | 30秒 | 帧中继网络和ATM网络 |
点对点P2P | 使用组播224.0.0.5来发送各种数据包 没有DR/BDR的选举,直接形成full邻接关系,不用手动指邻居 | 10秒 | PPP链路,HDLC链路 |
点到多点P2MP | Hello包以组播形式发送,其他类型数据包由单播发送 不选举DR,不用手动指邻居 | 30秒 |
现实中遇到的大部分属于点到点网络和广播型网络,因为帧中继、 ATM网络基本已经淘汰了。
6、可根据实际情况按需调整网络类型
- OSPF的网络类型是根据接口的数据链路层封装自动设置的。
- 图中的路由器采用以太网接口互联,因此这些接口的网络类型缺省均为Broadcast。
- 每段链路实际上都是点对点链路,因此在链路上选举DR与BDR是没有必要的。
- 为了提高OSP的工作效率,加快邻接关系的建立过程,可以把这些互联接口的网络类型都修改为P2P。
一条链路两端的路由器接口的OSPF网络类型应该要相同。
五、OSPF五种报文类型OSPF报头
OSPF一共定义了5种类型的报文,不同类型的OSPF报文有相同的头部格式。
OSPF报文直接采用IP封装,在报文的IP头部中,协议号为89。
各个字段的解释:
- Version(版本号):当前广泛实现的版本是OSPF v2,值为2。
- Type(类型): 1字节 ,表示OSPF报文的类型,有下面几种类型:Hello报文;DD报文;LSR报文;LSU报文;LSAck报文。
- Packet length(报文长度) :2字节,OSPF报文的总长度,包括报文头在内,单位为字节。
- Router ID(路由器ID):4字节,发送该报文的路由器标识。
- Area ID(区域ID): 4字节 ,发送该报文的所属区域。
- Checksum 校验和):2字节,校验和,包含除了认证字段的整个报文的校验和。
- AuType(鉴别类型):2字节 ,验证类型值有如下几种表示, 0表示不验证;1表示简单(明文)认证;3表示MD5认证。
- Authentication(鉴别):8字节 ,鉴定字段,其数值根据验证类型而定。当验证类型为0时未作定义;类型为1时此字段为密码信息;类型为2时此字段包括Key ID、MD5验证数据长度和序列号的信息。MD5验证数据添加在OSPF报文后面,不包含在Authenticaiton字段中。
五种报文类型
Hello报文:周期性发送,用于发现和维持邻居关系;
DD报文(DataBase Description Packet):数据库描述报文,描述本地LSDB的摘要信息,用于两台路由器进行数据库同步;
LSR报文(Link State Request Packet):链路状态请求报文,向对方请求所需要的LSA;
LSU报文(Link State Update Packet):链路状态更新报文,向对方发送其所需要的LSA或者泛洪自己更新的LSA;
LSAck报文(Link State Acknowledgment Packet):链路状态确认报文,用于对收到的LSA进行确认。
注:Hello报文和LSAck报文不需要确认。
LSA与LSAck是不同的:
- 链路状态公告LSA (Link State Advertisement):LSA中包含了路由器已知的接口状态、接口IP地址、掩码、开销和网络类型等信息。
- 链路状态确认报文LSAck(Link State Acknowledgment Packet):用于对收到的LSA进行确认。
1、Hello报文格式
Hello报文的主要作用:
- 邻居发现:自动发现邻居路由器。
- 邻居建立:完成Helo报文中的参数协商,建立邻居关系。
- 邻居保持:通过周期性发送和接收,检测邻居运行状态。
Network Mas:32bit,发送Hello报文接口的子网掩码;
Hello Interval:16bit,发送hello报文的时间间隔,单位为秒,默认是10秒;
Options:8bit,可选项,
E:允许泛洪 AS-External-LSAs;是否支持外部路由;
MC:转发IP组播报文;是否支持转发组播数据包;
N/P:处理Type-7 LSAs;是否为NSSA区域;
DC:处理按需链路;
Rtr Pri:8bit,DR优先级,默认为1,如果为0不参与DR/BDR选举;
Router Dead Interval:32bit,失效时间(通常为Hello Interval的4倍,40s)。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效;
Designated Router:32bit,本网段DR的接口地址;如果设置为0.0.0.0,表示未选举DR路由器。
Backup Designated Router:32bit,本网段BDR的接口地址;如果设置为0.0.0.0,表示未选举BDR。
Neighbor:32bit,邻居列表,以router ID标识;
2、DD报文格式
DD报文包含LSA头部信息,包括LS Type、LS ID、Advertising Router、LS Sequence Number、LS
Checksum。
两台路由器在邻接关系初始化时,用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的序列号作为确认。
各个字段的解释:
I:是否为第一个。M:后面是否还有。MA是否为Master。
- I:当发送连续多个DD报文时,如果这是第一个DD报文,则置为1,否则置为0。
- M(More):当发送连续多个DD报文时,如果这是最后一个DD报文,则置为0。否则置为1,表示后面还有其
他的DD报文。 - MS(Master/Slave):当两台oSPF路由器交换DD报文时,首先需要确定双方的主从关系,Router ID大的一方会成为Master。当值为1时表示发送方为Master。
- DD sequence number:DD报文序列号。主从双方利用序列号来保证DD报文传输的可靠性和完整性。
- Interface MTU:指示在不分片的情况下,此接口最大可发出的IP报文长度。在两个邻居发送DD报文中包含MTU参数,如果收到的DD报文中MTU和本端的MTU不相等,则丢弃该DD报文。缺省情况下,华为设备未开启MTU检查。
- Optinons:与Hello的Optinons字段相同。
3、LSR报文格式
两台路由器互相交换过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:链路状态ID,32比特,根据LSA中的LS Type和LSA description在路由域中描述一个LSA。
- Advertising Router:通告路由器,32比特,产生此LSA的路由器的Router ID。
4、LSU报文格式
用来向对端Router发送其所需要的LSA或者泛洪自己更新的LSA,内容是多条LSA(全部内容)的集合。
LSU报文(Link State Update Packet)在支持组播和广播的链路上是以组播形式将LSA泛洪出去。为了实现Flooding的可靠性传输,需要LSAck报文对其进行确认。对没有收到确认报文的LSA进行重传,重传的LSA是直接发送到邻居的。
Number of LSAs:32比特,LSA的数量。
5、LSAck报文格式
用来对接收到的LSU报文进行确认。内容是需要确认的LSA的Header(一个LSAck报文可对多个LSA进行确认)。
LSAck(Link State Acknowledgment Packet)报文根据不同的链路以单播或组播的形式发送。
LSAs Headers:LSA头部,可变,通过LSA的头部信息确认收到该LSA。
六、OSPF工作过程
OSPF工作过程概览
1、建立邻居关系
- OSPF使用Hello报文发现和建立邻居关系。
- 在以太网链路上,缺省时,oSPF采用组播的形式发送Hello报文(目的地址224.0.0.5)
- OSPF Hello报文中包含了路由器的Router ID、邻居列表等信息。
neighbor:邻居
具体过程:以R2为例
- R2发送Hello报文来发现邻居,但没有收到邻居的Hello报文,此时状态为Down。
- R2收到R1的Hello报文后,得知R1是自己的邻居,但自己的Router ID不在R1的邻居列表中(表明此时,对于R1来说,R2不是R1的邻居),此时R2的状态为Init。
- 由于R2知道了R1是自己的邻居,所以发送的Hello报文中包含R1的Router ID。
- 当R2收到R1的Hello包,且其邻居列表中含有自己的Router ID,R2的状态由Init变为2-way。
如果路由器发现所接收的合法Hello报文的邻居列表中有自己的Router ID,则认为已经和邻居建立了双向连接,表示邻居关系已经建立。
验证一个接收到的Hello报文是否合法包括:
1、如果接收端口的网络类型是广播型,点到多点或者NBMA,所接收的Hello报文中Network Mask字段必须和接收端口的网络掩码一致,如果接收端口的网络类型为点到点类型或者是虚连接,则不检查Network Mask字段;
2、所接收的Hello报文中Hello Interval字段必须和接收端口的配置一致;
3、所接收的Hello报文中Router Dead Interval字段必须和接收端口的配置一致;
4、所接收的Hello报文中Options字段中的E-bit(表示是否接收外部路由信息)必须和相关区域的配置一致。
2、LSDB数据库同步
邻居关系建立后,邻居之间确定主从关系,然后开始发送DD报文同步LSDB。
这里提到了主从关系(Master/Slave),要与DR/BDR区分开来。
- DR/BDR是在MA网路中选举出的两台路由器,用于减少网络中的邻接关系。
- MS主从关系是两台互相交换DD报文的邻居路由器之间的关系,其作用只是为了确定seq以Master为准,从而保证DD报文有序可靠的传输。
- MS主从关系确定,只比较Router ID的大小,大的一方成为Master。
具体过程:
主从路由器的选举:
(1)邻居状态变为ExStart以后,R1向R2发送第一个DD报文,在这个报文中,DD序列号被设置为X(假设),R1宣告自己为主路由器。
(2)R2也向R1发送第一个DD报文,在这个报文中,DD序列号被设置为Y(假设)。RTB也宣告自己为主路由器。
由于R2的Router ID比R1的大,所以R2应当为真正的主路由器。
数据库摘要信息的交互:
(3)当主从关系确定后,R1、R2的状态变为Exchange。R1发送一个新的DD报文,在这个新的报文中包含LSDB的摘要信息(LSDB的摘要信息可以类比成一本书的目录),序列号设置为R2在步骤(2)里使用的序列号(表示承认R2为真正的主路由器)。
(4)邻居状态变为Exchange以后,R2发送一个新的DD报文,该报文中包含LSDB的描述信息,DD序列号设为Y+1(上次使用的序列号加1)。
(5)R1收到R2的DD报文后,向R2发送即使R1不需要新的DD报文描述自己的LSDB,但是作为从路由器,R1需要对主路由器RTB发送的每一个DD报文进行确认。所以,RTA向RTB发送一个内容为空的DD报文,序列号为Y+1。???有点不懂这句话。
发送完最后一个DD报文之后,R1、R2的状态都变为了Loading;在此(变为Loading)之前,路由器就算在DD报文中发现了自己需要的LSA也是不会发送LSR报文的。
3、建立完全邻接关系
具体过程:接着上面的第(5)步
(6)邻居状态变为Loading之后,R1开始向R2发送LSR报文,请求那些在Exchange状态下通过DD报文发现的,而且在本地LSDB中没有的链路状态信息。
(7)R2收到LSR报文之后,向RTA发送LSU报文,在LSU报文中,包含了那些被请求的链路状态的详细信息。RTA收到LSU报文之后,将邻居状态从Loading改变成Full。
(8)R1向R2发送LSAck报文,用于对已接收LSA的确认。
此时,R1和R2之间的邻居状态变成Full,表示达到完全邻接状态。
邻居与邻接:
邻居(Neighbor):OSPF路由器启动后,便会通过OSPF接口向外发送Hello报文用于发现邻居。
收到Hello报文的OSPF路由器会检查报文中所定义的一些参数,如果双方的参数一致,就会彼此形成邻居关系。
邻接(Adjacency):形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。
只有当双方成功交换DD报文,并能交换LSA之后,才形成真正意义上的邻接关系。
遗留的问题:
关于R1与R2的状态改变,具体是在什么时候改变的状态?
DR与BDR(1)DR与BDR的作用
- DR(Designated Router,指定路由器)负责在MA网络建立和维护邻接关系并负责LSA的同步。
- DR与其他所有路由器形成邻接关系并交换链路状态信息,其他路由器之间不直接交换链路状态信息。
- 为了规避单点故障风险,通过选举BDR(Backup Designated Router,备份指定路由器),在DR失效时快速接管DR的工作。
除DR和BDR之外,其他路由器都是DR Other。
- DR与BDR之间建立邻接关系。
- DR Other只与DR和BDR建立邻接关系。
- DR Other之间只建立邻居关系。
(2)DR与BDR的选举规则(待补充)DR/BDR的选举是非抢占式的。
例如下图:R4新加入后并不会改变原先就存在的DR/BDR,即使它的优先级比R1、R2都高。这样可以保持网络的稳定。
若要使R4成为DR,需要将DR和BDR的ospf进程restart(重启)。
至于先重启DR还是BDR,等做完实验再补充。。。。。。。。。。。
DR/BDR的选举是基于接口的。
- 接口的DR优先级越大越优先,默认为1,0表示不参与选举。
- 就扣的优先级相等时,Router ID越大越优先。
基于接口的解释:
下图中R4同连接着两个广播网络,它的两个接口的角色并不相同。
(3)不同网络类型中DR与BDR的选举操作
参考:
04 OSPF基础介绍_哔哩哔哩_bilibili
05 OSPF简介_哔哩哔哩_bilibili
06 OSPF工作原理及过程_哔哩哔哩_bilibili
OSPF-五种报文、七种状态机及其工作过程_ospf的lsu有几种-CSDN博客
精!万字15图详解OSPF路由协议 (qq.com)
OSPF——7种状态讲解_ospf七种状态-CSDN博客
[OSPF原理—详细!!ospf协议工作原理‘Beyond’的博客-CSDN博客](https://blog.csdn.net/Beyonod/article/details/130559513#:~:text=二、ospf流程(步骤) 1 相邻路由器建立邻居关系 2,邻居之间交互链路状态信息并同步至LSDB 3 计算最优路径 4 将最优路径添加到路由表)
OSPF协议原理详解-CSDN博客
OSPF-五种报文、七种状态机及其工作过程_ospf的lsu有几种-CSDN博客