思维导图:
原理:OSPF要求每台运行OSPF的路由器都了解整个网络的链路状态信息,这样才能计算出到达目的地的最优路径。OSPF的收敛过程由链路状态公告LSA(Link State Advertisement)
泛洪开始,LSA中包含了路由器已知的接口IP地址、掩码、开销和网络类型等信息。收到LSA的路由器都可以根据LSA提供的信息建立自己的链路状态数据库LSDB(Link State Database)
,并在LSDB的基础上使用SPF算法
进行运算,建立起到达每个网络的最短路径树。最后,通过最短路径树得出到达目的网络的最优路由,并将其加入到IP路由表中。
什么叫链路(LINK) =路由器接口
什么叫状态(State) =描述接口以及其与邻居路由器之间的关系
基于链路状态的路由协议
,它从设计上就保证了无路由环路。OSPF支持区域的划分,区域内部的路由器使用SPF最短路径算法保证了区域内部的无环路。OSPF还利用区域间的连接规则保证了区域之间无路由环路。触发更新
,能够快速检测并通告自治系统内的拓扑变化。度量值
接口COST=100M/接口带宽
,其中100M为OSPF的参考带宽。Router-ID不具有抢占性
)RIP特性 | 带来的问题 | 优化或解决的方式 |
---|---|---|
逐跳收敛 | 收敛慢,故障恢复时间长 | “收到更新->计算路由->发送更新” 改为“收到更新->发送更新->计算路由” |
传闻路由更新机制 | 缺少对全局网络拓扑的了解 | 路由器基于拓扑信息,独立计算路由 |
最多有效跳数为15 | 环形组网中,使远端路由不可达 | 不限定跳数 |
以“跳数”为度量 | 存在选择次优路径的风险 | 将链路带宽作为选路参考值 |
OSPF是基于链路状态(Link-State)的路由协议,而RIP是基于距离矢量路与协议(二者的根本性差别);
RIP是一种“传话
”的方式来传递路由有关的路由信息,OSPF是以一种“宣告
”的方式,OSPF的收敛时间明显小于RIP;
RIP是一种“嘈杂
”的路由协议,路由收敛后仍然周期性地持续地存在大量的RIP协议报文流量;OSPF是一种“安静
”的路由协议,路由收敛后,OSPF网络中只存在一小部分OSPF报文;
RIP协议是以UDP作为其传输层协议的,RIP是封装在UDP报文中,端口号是520;OSPF没有传输层协议
,OSPF是直接封装在IP报文中的;
RIP报文有两种
:请求报文和响应报文;OSPF有五种
:hello报文、数据库描述报文(DD)、链路状态请求报文(LSR)、链路状态更新报文(LSU)和链路状态确认报文(LSAck);
RIP以“跳数
”来作为路由开销的定义,OSPF理论上可以采取任何参量作文开销定义,最常见的就是采用链路带宽来定义路由开销;
OSPF具有区域化结构,RIP没有;
OSPF网路中路由器有角色之分,不同路由器有着不同的功能和作用,RIP没有角色之分;
OSPF每台路由器都有独一无二的路由器身份号(Router-ID),在RIP网络中是没有Router-ID的;
OSPF支持将一组网段组合在一起,这样的一个组合称为一个区域。一个OSPF网络可以划分成多个区域(Area)。如果一个OSPF网络只包含一个区域就称为单区域OSPF网络;如果一个OSPF网络包含了多个区域称为多区域OSPF网络。
- OSPF网络中,如果一台路由器所有接口都属于同一个区域,则这样的路由器被称为
内部路由器(Internal Router)
;- OSPF网络中如果一台路由器包含属于Area 0 的接口,则这样的路由器被称为
骨干路由器(Backbone Router)
;- OSPF网络中如果一台路由器的某些接口属于Area 0 ,其他接口属于别的区域,则这样的路由器被称为
区域边界路由器(ABR)
;- 非骨干区域之间通信必须要要通过骨干区域中转才能进行;
- 单区域只包含一个区域,这个区域必须是area 0;
划分OSPF区域可以缩小路由器的LSDB规模,减少网络流量;
区域内的详细拓扑信息不向其他区域发送,区域间传递的是抽象的路由信息,而不是详细的描述拓扑结构的链路状态信息。**每个区域都有自己的LSDB,不同区域的LSDB是不同的。**路由器会为每一个自己所连接到的区域维护一个单独的LSDB。由于详细链路状态信息不会被发布到区域以外,因此LSDB的规模大大缩小了;
在OSPF网络中,每一个区域都有一个编号,称为Area-ID。Area 0为骨干区域,为了避免区域间路由环路,非骨干区域之间不允许直接相互发布路由信息。因此,每个区域都必须连接到骨干区域;
运行在区域之间的路由器叫做区域边界路由器ABR(Area Boundary Router)
,它包含所有相连区域的LSDB。自治系统边界路由器ASBR(Autonomous System Boundary Router)
是指和其他AS中的路由器交换路由信息的路由器,这种路由器会向整个AS通告AS外部路由信息;
OSPF能够支持的网络类型,指的是OSPF能够支持的二层网络的类型,OSPF能够支持广播网络、NBMA(Non-Boadcat Multi-Access)、点到点网络(P2P)和点到多点网络(P2MP)。
在广播网络和NBMA网络中
注意:OSPF路由器的某个接口的类型是与该接口直接相连的二层网络的类型是一致的。
比如,如果OSPF路由器某个接口连接的是一个广播网络,那么该接口就是一个广播接口;如果OSPF路由器某个接口连接的是一个P2P网络,那么该接口就是一个P2P网络接口;
广播型网络支持两台及两台以上的设备接入同一共享链路且可以支持广播、组播报文的转发,是OSPF最常见的网络类型。
广播型网络的例子:通过以太网链路相连的路由器网络。
VC互连
。
与广播型网络不同的是NBMA网络默认不支持广播与组播报文的转发。
NBMA方式要求网络中的路由器组成全连接
在NBMA网络上,OSPF模拟在广播型网络上的操作,但是每个路由器的邻居需要
手动配置
。NBMA(non-broadcast multiple access)型网络的例子:通过全互连的
帧中继链路
相连的路由器网络.
- 将一个非广播网络看成是一组P2P网络,这样的非广播网络便成为了一个点到多点(P2MP)网络。在P2MP网络上,每个路由器的OSPF邻居可以使用
反向地址解析协议(Inverse ARP)
来发现。- P2MP可以看作是多个P2P的集合,P2MP可以支持广播、组播的转发。
- 没有一种链路层协议默认属于P2MP类型网络,也就是说必须是由其他的网络类型强制更改为P2MP。常见的做法是将非完全连接的帧中继或ATM改为P2MP的网络。
OSPF是一种链路状态协议,所谓的链路状态,其实就是路由器的接口状态。OSPF核心思想就是,每台路由器都将自己的各个接口的接口状态(即链路状态)共享给其他路由器。
- 该接口的IP地址及掩码
- 该接口所属区域的Area-ID
- 该接口所属路由器的Router-ID
- 该接口的接口类型(也就是该接口的网络类型,如P2P,广播型)
- 该接口的接口开销(通常以接口带宽来定义接口开销,带宽越大,开销越小)
- 该接口所属的路由器的Router Priority(这个参数是用来选举DR与BDR的)
- 该接口所在二层网络中的DR
- 该接口所在二层网络中的BDR
- 该接口的HelloDeadInterval(接口发送Hello报文的间隔时间)
- 该接口的RouterDeadInterval(实效时间)
- 该接口所有邻居路由器
- 该接口认证类型
- 该接口秘钥等等
LSA(Link State Advertisement)
是路由器之间链路状态信息的载体。LSA是LSDB的最小组成单位,也就是说LSDB由一条条LSA构成的。LSA有十几种类型
;
所有的LSA都拥有相同的头部,关键字段的含义如下:
生存的时间
,单位是秒。
Type-1 LSA(Router LSA);
Type-2 LSA(Network LSA);
Type-3 LSA(Network Summary LSA);
Type-4 LSA(ASBR Summary LSA);
Type-5 LSA(ASExternal LSA);
…
每台路由器都会产生。Type-1LSA用来描述路由器各个接口的接口类型、IP地址、开销值等信息。
一个Type-1LSA只能在产生它的Area 内泛洪,不能泛洪到其他Area。
OSPF的协议报文是直接封装在IP报文中
的,IP报文头部中的协议字段必须为89
。
OSPF 本身5种类型,分别是Hello报文、DD报文、LSR报文、LSU报文、LSAck报文,各种不同类型的LSA其实只是包含在LSU报文中
。
其他类型的OSPF报文中虽然没有携带LSA,但是仍然会携带一些链路状态信息,当然也会携带一些其他的信息。
Type | 报文名称 | 报文功能 |
---|---|---|
1 | Hello | 发现和维护邻居关系 |
2 | Database Description | 交互链路状态数据库摘要 |
3 | Link State Request | 请求特定的链路状态信息 |
4 | Link State Update | 发送详细的链路状态信息 |
5 | Link State Ack | 发送确认报文 |
- Version :对于当前所使用的OSPFv2,该字段的值为2。
- Type:OSPF报文类型。
- Packet length:表示整个OSPF报文的长度,单位是字节。
- Router ID:表示生成此报文的路由器的Router ID。
- Area ID:表示此报文需要被通告到的区域。
- Checksum:校验字段,其校验的范围是整个OSPF报文,包括OSPF报文头部。
- Auth Type:为
0时表示不认证
;为1时表示简单的明文密码认证
;为2时表示加密(MD5)认证
。- Authentication:认证所需的信息。该字段的内容随AuType的值不同而不同。
Hello报文的作用:
组播地址:224.0.0.5
发送给ALLSPFRouters,通告两台路由器建立相邻关系所必需统一的参数Keepalive机制
,检测邻居运行状态。
- OSPF的版本号
- 该接口所属的路由器的Router-ID
- 该接口所属的区域ID
- 该接口的认证类型
- 该接口的秘钥
- 该接口的IP地址和掩码
- 该接口所属的路由器的Router Priority(这个参数是用来选举DR与BDR的)
- 该接口所在二层网络中的DR
- 该接口所在二层网络中的BDR
- 该接口的HelloDeadInterval(接口发送Hello报文的间隔时间)
- 该接口的RouterDeadInterval(实效时间)
- 该接口所有邻居路由器
在RIP网络中,如果路由器A与路由器B位于同一个二层网络,那么就说路由器A与路由器B是“邻居关系”;
在OSPF网络中,如果路由器A与路由器B位于同一个二层网络,只能说路由器A与路由器B“相邻”,不能说是“邻居关系”。相邻不等于邻居关系更不等于“邻接关系”
运行OSPF的路由器之间需要交换链路状态信息和路由信息,在交换这些信息之前路由器之间首先需要建立邻接关系
。
OSPF路由器启动后,便会通过OSPF接口向外发送Hello报文
用于发现邻居。收到Hello报文的OSPF路由器会检查报文中所定义的一些参数,如果双方的参数一致,就会彼此形成邻居关系,状态到达2-way 即可称为建立了邻居关系。如果参数不一致,不能形成邻居关系。
Hello报文用来发现和维持OSPF邻居关系
Hello报文的作用:
Keepalive机制
,检测邻居运行状态。时间间隔
,单位为秒。接口的Router Priority
,用于选举DR和BDR。失效时间
。如果在此时间内未收到邻居发来的Hello报文,则认为邻居失效;单位为秒,通常为四倍Hello Interval。DR的IP地址
。如果设置为0.0.0.0,表示未选举DR路由器。BDR的IP地址
。如果设置为0.0.0.0,表示未选举BDR。邻居的Router ID列表
,表示本路由器已经从这些邻居收到了合法的Hello报文。状态含义:
状态 | 含义 |
---|---|
Down | 这是邻居的初始状态,表示没有从邻居收到任何信息 |
Init | 在此状态下,路由器已经从邻居收到了Hello报文,但是自己的Router ID不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系 。 |
2- Way | 在此状态下,路由器发现自己的Router ID存在于收到的Hello报文的邻居列表中,已确认可以双向通信 。 |
邻居建立过程如下:
邻居列表为空
,此时状态为Down
,RTB收到RTA的这个Hello报文,状态置为Init。Init
。2-way
。2-way
。目的地址224.0.0.5
)。对于不支持组播的网络可以通过手动配置实现邻居的发现与维护。
形成邻居关系的双方不一定都能形成邻接关系,这要根据网络类型而定。只有当双方成功交换DD报文,并同步LSDB后,才形成真正意义上的邻接关系。
状态含义:
状态 | 含义 |
---|---|
ExStart | 邻居状态变成此状态以后,路由器开始向邻居发送DD报文 。Master/Slave关系是在此状态下形成的,初始DD序列号也是在此状态下确定的。在此状态下发送的DD报文不包含链路状态描述。 |
Exchange | 在此状态下,路由器与邻居之间相互发送包含链路状态信息摘要的DD报文。 |
Loading | 在此状态下,路由器与邻居之间相互发送LSR报文、LSU报文、LSAck报文。 |
Full | LSDB同步过程完成,路由器与邻居之间形成了完全的邻接关系。 |
LSDB同步过程如下:
ExStart
后,RTA会发送第一个DD报文
。此报文中,DD序列号被随机设置为X,I-bit设置为1,表示这是第一个DD报文,M-bit设置为1,表示后续还有DD报文要发送,MS-bit设置为1,表示RTA宣告自己为Master。ExStart
后,RTB会发送第一个DD报文。此报文中,DD序列号被随机设置为Y(I-bit=1,M-bit=1,MS-bit=1,含义同上)。由于RTB的Router ID较大,所以RTB将成为真正的Master。收到此报文后,RTA会产生一个Negotiation-Done事件
,并将邻居状态从ExStart变为Exchange。Exchange
后,RTA会发送一个新的DD报文,此报文中包含了LSDB的摘要信息,序列号设置为RTB在步骤2中使用的序列号Y,I-bit=0,表示这不是第一个DD报文,M-bit=0,表示这是最后一个包含LSDB摘要信息的DD报文,MS-bit=0,表示RTA宣告自己为Slave。收到此报文后,RTB会产生一个Negotiation-Done事件
,并将邻居状态从ExStart变为Exchange
。Exchange-Done事件
,将邻居状态变为Loading。RTB收到此报文后,会将邻居状态变为Full(假设RTB的LSDB是最新最全的,不需要向RTA请求更新)。LSR报文
,请求那些在Exchange状态下通过DD报文发现的、并且在本地LSDB中没有的链路状态信息。LSU报文
,LSU报文中包含了那些被请求的链路状态的详细信息。RTA在完成LSU报文的接收之后,会将邻居状态从Loading变为Full。LSAck报文
,作为对LSU报文的确认。RTB收到LSAck报文后,双方便建立起了完全的邻接关系
。邻接路由器
;完全一样的LSDB
。DD报文,LSR报文和LSU报文
来实现的;如果两台邻居路由器之间的二层网络是P2P网络或P2MP网络,并且其中一台路由器是这个而层网络的DR或BDR,那么这两台邻居路由器一定会进入彼此之间的LSDB同步的过程;
当这两台路由器之间完成了LSDB同步之后,他们之间建立了邻接关系;
如果这两台路由器都不是这个二层网络的DR或BDR,那么这两台路由器就不会进入彼此之间的LSDB的同步过程,也就是说,彼此之间是不可能建立起邻居关系;
一个OSPF网络中的邻接关系一定是小于等于邻居关系的;
只在NBMA网络上存在
,表示没有收到邻居的任何信息,但是已经周期性的向邻居发送报文,发送间隔为HelloInterval。如果Router DeadInterval间隔内未收到邻居的Hello报文,则转为Down状态。在P2P或P2MP网络中完全不存在DR与BDR的概念,DR与BDR只适用于Broadcast网络或NBMA网络。
网络类型 | 是否和邻居建立邻接关系 |
---|---|
P2P / P2MP | 是 |
Broadcast / NBMA | DR与BDR 、DRother建立邻接关系——BDR与DR 、DRother建立邻接关系 ——DRother之间只建立邻居关系 |
节省带宽
,降低对路由器处理能力的压力。在没有DR的广播网络上,邻接关系的数量可以根据公式n(n-1)/2计算出,n代表参与OSPF的路由器接口的数量。0-255
,值越高越优先。缺省情况下,接口优先级为1
。**如果一个接口优先级为0,那么该接口将不会参与DR或者BDR的选举。**如果优先级相同时,则比较Router ID,值越大越优先被选举为DR。(越大越优先)