以下文章参考:http://t.csdn.cn/Om22M
本文持续更新完善中,诚邀读者的斧正…
目录
一、什么是ospf:
- OSPF是一个内部网关协议,用于在单一自治系统内决策路由。(Open Shortest Path First开放式最短路径优先)(Interior Gateway Protocol,内部网关协议简称IGP)
- OSPF的协议号是89,管理距离(AD值-Adiministratr distance)是110。
- 值得注意的是,OSPF是链路状态协议,区别于距离矢量协议(RIP/EIGRP/BGP),距离矢量协议是直接交换学习路由表,而链路状态协议是交换的链路状态信息。
- 包括OSPF在内,所有的S P F路由协议基于一个数学算法-Dijkstra算法。这个算法能使路由选择基于链路状态,而不是距离向量。
- 区别于EIGRP的构建过程依据的三个表邻居表->邻接表->路由表;OSPF是邻居表->链路状态数据库(LSDB)->路由表。LSDB我们后文会详细的讲解。
1、OSPF分层的路由协议:
所有的area和area0交换链路信息,area0负责链路信息的转发。 这样的设计可以减少SLA条目的数量,同时Area之间传递的是3类的LSA较1类的LSA更加的精简,也是为了减轻链路的负担;
①virtual-link虚拟链路的实现(建议先看下面的路由器角色)
- 因为OSPF采用了区域化的设计,并且区域也采用了Hub-Spoke的架构,所有区域中定义出一个核心,然后其它部分都与核心相连,OSPF的区域0就是所有区域的核心,称为BackBone 区域(骨干区域),而其它Normal 区域(常规区域)应该直接和骨干区域相连,常规区域只能和骨干区域交换LSA,常规区域与常规区域之间即使直连也无法互换LSA,但在某些情况下,某些常规区域无法与骨干区域直连,这时便无法得到其它区域的路由,因此,设计了将骨干区域的范围通过虚拟的方法进行扩展到相邻常规区域的位置,因而让不能直接与骨干区域相连的区域,最终可以与骨干区域直连,这种对骨干虚拟的扩展和拉伸就是OSPF虚链路(Virtual Link)能实现的;
- 因为某些常规区域不能与骨干区域直连而只能与其它常规区域直连,所以OSPF虚链路(Virtual Link)通过将相邻的常规区域虚拟为骨干区域,从而让那些不能与骨干区域直连的常规区域也能获得其它OSPF区域的路由。与骨干区域相邻的常规区域被扩展后,该区域被称为Transit Area,理论上Transit Area不应该为末节区域;在扩展后,原本为常规区域的Transit Area,将变成骨干区域,所以路由将从Inter-Area Route转变为Intra-Area Route,路由表示形式也将从O IA改变为O的形式;在进行OSPF虚链路扩展时,是将Transit Area中与骨干区域直连的ABR和连接另一个常规区域的ABR相连,连接这两个ABR时,使用双方的Router-ID来连接。如下图:
在上图中,区域2只能与区域1直连,而无法与骨干区域直连,在这种情况下,由于常规区域与常规区域之间即使直连也无法互换LSA,所以R3虽然是ABR,但因为没有连接骨干区域,最后不可能将任何区域的LSA发进区域2,最终导致区域2无法和其它区域通信(不过有一点需要注意5类的SLA的传递不需要经过area 0,也就是说如果存在外部路由协议的话,area 2中会存在5类的SLA,不过没有4类的SLA),在这种情况下,需要通过OSPF虚链路将骨干区域的范围扩展到相邻的区域1,如下图
在进行OSPF虚链路扩展后,区域1被虚拟成了骨干区域,而这时的R3等同于连接骨干区域和区域2的ABR,所以可以将自己所有的LSA发进区域2。在扩展OSPF虚链路时,是通过连接R2(ABR)与R3(ABR)的Router-ID 来建立的。
因为OSPF虚链路(Virtual Link)能将骨干区域扩展到相邻的常规区域,从而将常规区域虚拟为骨干区域,所以在某些情况下,如公司合并,或者为了备份骨干区域,可能出现骨干区域被常规区域所隔离,如下图:
图中骨干区域被区域1分割为两部分,将使得骨干区域自己的路由无法相互传递,在使用OSPF虚链路后,可以将区域1也扩展为骨干区域,如下图:
上面两种情况的 VIRTUAL-LINK 的代码的实现(两种情况代码一样就写一次)
R2:
conf t
router ospf 1
area 1 virtual-link R3的RID
//在区域1内,把area0的范围从R2扩充到R3那里
R3:
conf t
router ospf 1
area 1 virtual-link R2的RID
//扩充区域是一个双向的过程
2、OSPF中的路由器角色:
①IR
如果一台OSPF路由器的接口都在区域内的路由器我们称之IR(Internal-Router)
②ABR
如果一台OSPF路由器属于多个区域,即该路由器的接口不都属于一个区域,那么这台路由器称为ABR(Area Border Router )
③ASBR
如果一台OSPF路由器将外部路由协议重分布进OSPF,那么这台路由器称为ASBR(Autonomous System Boundary Router )
3、ROUTER ID的选举
- RID的概念:
OSPF的RouterID是什么?它所显示的形式是 x.x.x.x ,格式与IP地址相同,但实际上它并不是一个IP地址,确切点说,应该是一个名字。给启用了OSPF协议的路由器的名字。 - 优先级如下:
手动指定>loopback接口(多个取最大)>设备物理接口的最大的IP地址有时为了方便我们简称其为RID。 - 注意点
在RID已经被选举出来之后再去增加设备的LOOPBACK接口,或者手动指定设备的RID是不会改变设备的RID的,此时设备的RID仍然为之前的RID。我们如果执意想要更改设备的RID就需要重启OSPF进程,而且千万注意,这种方法仅适用于更改了设备指定接口的情况下。也就是说如果是更改设备的LOOPBACK接口,然后重启设备的OSPF进程并没有什么作用,此时需要重启设备才可以实现RID的更改。
// 重启OSPF进程的代码
R1# clear ip ospf process
// 重启设备的方法
do write 保存代码后 重启路由器
4、Hello_Interval/Dead_Interval/Wait_Interval
Hello_Interval:设备在开启接口协议之后,每隔一个HelloInterval发送一个HELLO报文,用于维持邻居关系,这个报文目的地址是以广播224.0.0.5的形式发送的。
Dead_Interval: 该时间多设置为HelloInterval的四倍,如果该设备在这段之间后还没收到对方发来的Hello包则宣告;邻居关系的破灭。
//可以修改Hello以及Dead的发文时间,不过后者一定要为前者的整数倍
//在GNS3中只要修改Hello_Interval就会自动修改Dead_Interval
R1:
conf t
int f0/0
ip router hello-interval / dead-interval second
//可以通过以下命令查看报文的时间以及接口的网络类型
R1:
show ip ospf int
Wait_Interval:选举DR/BDR所需要的时间,和DeadInterval时间设置一样。
5、DR/BDR/DRother:
名词解释:
DR:Designed Router
BDR:Backup Designed Router
DRother:Designed Router Others为什么需要选举他们:
选举出DR(与BDR)负责LSA的转发,从而减少链路中LSA条目的数量,达到减轻链路和设备负担。下图也可以看出LSA条目数量确实得到了有效的减少,画工有限,请多包涵= =。
具体的实现方法:
当网络类型为broadcast的设备处于TWO-WAY的状态机的情况下,我们通过交互的hello里面的参数选举出来DR与BDR(剩下的设备为DRother),具体的参数是Hello报文里的端口优先级,选举的时间为一个Wait时间,为Hello时间的四倍,即和Dead时间一致。端口优先级大的优先,优先级一样的情况下再根据HELLO包里的RID来选举其中大的优先。
其中DR负责SLA的转发(当然同时也会选举出一个BDR作为其备份),也就是说所有的DRother设备和DR以及BDR交换SLA(同时DR会和BDR交换),然后DR再将收集好的SLA转发给其他的设备(BDR也会),DR在其中充当一个中转站的角色,这一点类似于OSPF的area0的角色。不可抢占性:
区域内的DR有不可抢占性,一旦选举出来,即使有优先级大于他的设备接入也不会改变他为DR的地位。如果DR失效,则会让BDR成为DR然后重新选举新的BDR;如果BDR失效,只会选举新的BDR;如果两者都失效,则全部重新选举,也就这种情况下,可以让后面加入的优先级更高的设备成为新的DR。(我们可以使用clear ip ospf process使设备占时失效)。接口的特性
上面三种角色是接口的特性而不是路由器的整体特性。也就是说一个路由器上面有多个网段的接口情况下,他可以一个端口是dr一个是bdr,和后文的主从路由器选举类似,值得注意。不同的广播类型
注意在OSPF协议的运行期间会发送两种的广播,一种是224.0.0.5,一种是224.0.0.6;224.0.0.5的报文所有的广播域内的路由器都会收到(在不需要选举DR/BDR的链路中,所有同网段的设备都会收到;在需要选举DR/BDR的链路中,无论是DR/BDR/Drother都会收到);相对的,224.0.0.6只有DR/BDR可以收到。为了防止过多的LSA 的传输导致的链路的拥塞,我们的DR/BDR负责LSA的转发,其他的所有路由器的LSA都通过224.0.0.6发送给DR和BDR,然后DR/BDR通过224.0.0.5发送给所有的设备;也就是说[DR与BDR]以及[DR、BDR和所有的DRother]之间都有交换SLA,他们都是邻接关系,而DRother之间就只是邻居关系,他们的链路状态就只会停留在Two-Way的状态。可以看下面这张图:
//可以通过以下命令查看DR/BDR
R1:
show ip ospf int
6、COST值/Metrics值/AD值(Administrate Distance)
①COST值
开启OSPF协议的接口的COST值=参考带宽/实际带宽。其中参考带宽为100M/bit,记得上下的单位要一致。我们可以直接修改cost值,也可以通过修改参考带宽来间接修改cost的值。至于修改的原因就在于参考的带宽以及不满足当今社会的需求,上面的算式有一个原则:若结果为小数只会取整数,当结果大于1的情况下向下取整,结果小于1的时候向上取整,举个例子64.7->64,0.001->1。所以当实际带宽大于100M/bit的情况下,也就是说100M/bit和100000M/bit算出的cost值是一样的都为1,这样的COST值就没什么意义了,因为根本没对数值有一个准确的反馈,而我们实际上需要COST值的一个准确反馈,以便更精确的计算出后续的Metrics值。
//查看COST值
R1:
show ip ospf int
//修改
R1:
conf t
int f0/0
ip ospf cost 值
②METRIC值
- 对于去往相同网段的配置了相同协议的路由条目,我们通过Metric值来比较他们,从而选择其中值最小的,让这个条目的被选择的优先级最高;Metric值是用在同网段的情况选择最优路由条目的参数;
- METRIC值=到目的路由器的所有路由器出接口的COST值相加(与EIGRP一样),METRIC值是选择最优路由时使用的参数会在路由表中有所体现。(下图画红圈的就是)
像下图:R1到R4的METRIC值为绿色的COST值相加,而R4到R1为没圈的部分相加。
//查看Metric值
show ip route
// 修改Metric值
R1:
conf t
router ospf 1
auto-cost reference-bandwidth <1-4294967> The reference bandwidth in terms of Mbits per second
③AD值
对于配置去往相同网段的不同路由协议的条目,我们只会选择其中的最优的管理距离的那一个路由协议的条目,管理距离越小越好;管理距离是比较去往相同网段的不同路由条目是使用的参数;
协议 | AD值 |
---|---|
直连 | 0 |
静态 | 1 |
EISRP | 90 |
OSPF | 110 |
RIP | 120 |
外部 EIGRP | 170 |
7、OSPFの网络类型(以及匹配的网段类型):
最主要的网络类型有两种,p2p和broadcast。
可以使用以下代码修改链路的类型,链路两端接口网络类型必须一致。
conf t
int f0/0
ip ospf network broadcast
p2p状态下不会选举DR和BDR
Broadcast状态下会选举DR和BDR;
默认情况下,只要是s口就是p2p,f口和e口就是broadcast;
具体看下图,左边链路为p2p,右边为broadcast:
二、五种报文:
在进入七种状态的学习之前,我们需要对OSPF发送的报文有所了解;
1、HELLO:
在我们敲入”network ?.?.?.? 0.0.0.0 area ?“路由器就会产生HELLO包,用于建立邻居关系。
发送的报文的源地址是真实接口的地址(像你用network开启环回接口也不会发送hello包),目的地址是224.0.0.5(一种广播)。
报文中不存在进程ID,也就是说不是同个进程号的OSPF也是可以通过HELLO包协商形成邻居关系的。
值得注意的是,HELLO包其实也分为两种: 假设有两个路由器1,2双方互发hello包,则一种就是未收到对方HELLO包的初始状态下发送的HELLO包A,一种是收到对方的Hello包后发送的变种HELLO包B。举个例子:路由器1发送的A包内含类似于"I’M ROUTER-ID 1 , I SEE NONE"的关键字,当然里面还包含了一些1的端口的配置信息(像是区域ID, 认证信息, 网络掩码,计时器等参数),路由器2在收到1的A包会先核对里面的参数和自己的端口的配置是否匹配,不匹配直接丢弃这个包,邻居关系无法建立;如果匹配会发送一个B包:内包含类似于"I’M ROUTER-ID 2 , I SEE ROUTER-ID 1"的关键字(里面也有参数),此时路由器1在收到2发来的B包发现里面有自己的Router-ID的时候就会认定2为自己的邻居。
本质上说,HELLO包就是为了检测链路是否能双向通信的工具。
2、DBD(Database Description):
里面可能包含了LSA的摘要信息
其中有一些关键信息,M MS I,他们只有0/1的值,0/1表示是否,seq为报文序列号;DBD中的M位表示的是——除了DBD报文中描述的LSA摘要之外是否还有更多没有描述完的LSA摘要,MS表示自己是否为主路由器(在选举主从时设备首次发送的DBD中都是默认M=1),I表示是否是首轮发送的DBD,seq为序列号为后面保证DBD传输的可靠性保驾护航,
每个设备初始的seq都是随机的,后续序列号在基础上递加。
3、LSR(Link State Request):
在核对过DBD后,本地会创建一个LSA请求表,然后把将缺少完整信息的LSA的摘要加入到这个表当中,根据表内内容向邻居发送LSR请求完整的LSA信息,在收到对应完整的LSA之后,会删除表内相应的请求条目。因为LSR的报文内存有限,所以可能需要发送多条的LSR,才能表内的元素清空位置。
4、LSU(Link State Update):
根据接收到的LSR发送相应的LSU(LSU内包含了LSA,Link State Adevertisement,我们目前需要掌握五种类型的LSA,后面再说)而且只要链路的状态发生改变都会发送这个报文,毕竟他叫更新包;
5、LSACK(Link State Acknowledge):
在接收到上面除了Hello包以外的报文时,都会回复一个这个报文,因为除了Hello包其他的包都是可靠的包,需要一个确认的动作。专门回复一个报文来进行确认这是一种显式的确认形式;后文主从dbd报文交互中,以报文里的seq来确认,就是一种隐式的确认方式。无论是显式确认还是隐式确认,如果设备在RetransmitInterval(重传间隔)内没有收到确认,都会进行重传。
三、邻居状态机的七种状态:
1、Down:
本地路由器在Deda_Interval内还未收到邻居Hello包的状态。
2、Init:
本地路由器收到对方发送过来的hello包,但是双向通信还没建立。也就是双方的邻居关系还没有确立。
3、Two-Way
邻居关系已经确立。因为Hello包会段时间发送一次维持邻居关系,所以这是个比较稳定的状态。至于下面的状态转换其实就和邻接关系(Adjacencies)的确立有关了。(在MBA链路类型下会在这个链路状态选举DR/BDR,如果这个链路状态下没有选举出DR和BDR后续的状态转换过程将不会继续下去)
4、Exstart:
本地路由器和邻居首轮互发DBD(不包含SLA摘要摘要只是空壳),根据其包含的Router-id的大小来进行主从路由器的协商,最后由从路由器发送一个带主路由器上一个DBD序列号的MS=0并且携带LSA摘要的DBD来宣告选举的结束。(由于是先根据Router-id,所以DR不一定就是主路由器,因为它可能只是端口的优先级比较高而已。)
5、Exchange:
主从路由器交替发送含LSA头部摘要的DBD(主先发,从后发,且从使用主的DBD的seq用来保证传输的可靠性);在自身发送的DBD的M=0时也会发送LSR,然后邻居也会回复LSU。
注:
在首次收到邻居发来的带LSA摘要信息的DBD时,本地路由器会创建一个链路状态请求表,把比对邻居的LSA摘要中自身缺少的LSA加入其中,后续发送LSR就是根据这个表,如果收到LSU报文含相应的LSA,则本地路由器会将链路状态请求表中的LSA条目删除。
6、Loading:
本地与邻居路由器根据链路状态请求表发送LSR,以及接收来自邻居的LSU(注意如果是BMA的网络,则除了DRother和DRother之间不会转发LSR/LSU外,DRother和DR ,DRother和BDR ,DR和BDR之间都会转发LSA);当然如果本地路由器的链路状态请求表本身为空,则跳过这个状态,直接进入FULL。
7、Full:
最后一条的LSACK发送完成,数据库LSDB状态变为收敛状态,路由表还在计算之中。
四、详细的状态转换过程
由于形成的过程的状态转换并没有我们想的那么有序,所以需要我们专门细致的研究一下,那两台机子网络类型为broadcast的举例。
- 双方刚开始都是“DOWN”的状态,这个状态是指他们都发了"HELLO"报文,但是还没收到对方发来的"HELLO"报文;
- 在收到对方发来的初始的还没有在里面将自己设置为邻居的“HELLO”报文的时候,本地路由器的状态会转为“INIT”状态;
- 当收到将自己设置为邻居的“HELLO”报文的时候,本地路由器的状态会转变为“TWO-WAY”状态;在这个状态下,MBA网络类型中还会进行DR/BDR的选举,如果因为一些原因没有设备被选举,则设备只会停留在这个状态;
- 本地路由器和邻居路由器互发DBD摘要报文,这个DBD包含RID和Process-ID号但是不包含SLA的摘要信息,并且其中关键字段“M=1 MS=1 I=1 seq=本地路由随机产生”。
注:
1>因为DBD包含进程号,所以每个Process-ID对应一个LSDB,所以不同进程号的DBD之间是无法交互LSU的,也就是说不同进程号的OSPF路由器之间无法形成邻接关系
2>其中M MS I只有0/1的值,表示是否,seq为报文序列号;
M表示除了本报文中描述的LSA摘要之外是否还有更多的LSA描述,当描述完后M=0;
MS表示自己是否为主路由器
(在选举主从时设备首次发送的DBD中都是默认MS=1),
I表示是否是首轮发送的DBD,
seq为序列号为后面保证DBD传输的可靠性保驾护航,
每个设备初始的seq都是随机的,后续序列号在基础上递加。
- 当收到邻居发来的上述的DBD之后本地路由器就会切换模式到EXSTART,来进行主从路由器的协商;
- 因为DBD中还包含了RID的信息,所以在查看邻居发来的DBD里面的RID之后,如果确定自己的RID小于邻居的RID,则该设备就会认定自己为从路由器,并且发送一个“M=1 MS=0 I=0 seq=上个确认主的DBD报文seq”的DBD,注意里面有已经开始有LSA的 摘要信息了;这也表明了主从路由器的选举结束了,双方设备状态进入了“EXCHANGE”状态;
- 然后,[主路由器发送一个DBD,之后从路由器再发送一个DBD里面的seq为主发的DBD的],这个目的就是为了保证传输的可靠性,确保对方是收到了自己的报文了,以便能够可靠的完成链路状态请求表的完善。上述的步骤会一直重复,[一直到主路由器的发送最后一个DBD其中M=0, 然后从路由器收到之后,会回复DBD其中M=0]然后停止。注意本地路由在发送m=0的DBD的同时也会发送LSR,是以单播的形式发送的;邻居也会回复LSU和LSACK。也就是说其实在exstart状态,设备间就已经在以单播的形式于主从路由器之间交换LSA了。
- 注意当主设备收到M=0的DBD或者从设备收到M=0的DBD且发送M=0的DBD则他们的设备状态机就会切换到到下面的两种情况之一:
①如果设备的链路状态请求列表里面为空,也就说明其同步完成,则设备直接进入FULL状态;不过这并不影响exchange状态下没交互完DBD继续交互完成。
②如果设备的链路状态请求列表不为空,则设备进入LOADING状态,不过如果之前DBD还没有交互完还会继续交互直到完成,然后开始新的一轮的LSR/LSU/LSACK,记住无论是否是MBA的网络都是以广播的形式发送的报文(单播的形式仅存在于EXSTART和EXCHANGE,因为这个时候的报文交互是依靠的主从的形式进行的),因为这个时候的如果是MBA的网络的话,是依靠DR/BDR的形式进行的报文的交互,而他们的交互形式就是广播的形式;
最后设备的链路状态请求列表清空,则进入FULL状态。
五、状态转换的一些问题
1、DR/BDR和主从路由器的区别:
- 主从路由器的选举目的就是为了后续的DBD的交互能够有序的,可靠的进行(类似TCP的三次握手)。注意一对的路由器就有一对的主从路由器,举个例子DR与BDR是一对主从路由器,与此同时DR/DRouter也是主从路由器,这样一来在BMA网络中每一个设备和所有的设备都可以形成主从关系,可以通过互发DBD来实现对自己的链路状态请求表的完善,为后续的LSR做铺垫;
- DR/BDR是决定后续的BMA的网络中能否继续形成邻接关系。也就是说在BMA网络中,由于路由器的退出选举或者一些其他原因没有形成DR/BDR,那么设备只会停在2way状态,无法形成完全邻接的关系。
2、HELLO包部分单播的问题:
在网络类型为BRODCAST的链路里邻居关系的确认过程中,我们会发现HELLO包不全都是以广播的形式来传输,这有点超乎我们的常识。
- 这实际上是思科的一种优化形式,目的是为了加快邻居关系的确立速度。
- 因为发送广播的HELLO包有间隔时间即一个Hello_Interval时间,很显然一个设备最慢收到对方的Hello包需要度过一个上述时间,这样效率过低。所以本地在回复HELLO包的时候以单播形式立刻回复就不需要度过一个间隔时间,可以缩短邻居确立邻居关系的时间。
3、DBD交互结束是否总是以双方的DBD内的M=0为标志,如果一方M!=0,会怎么样?
- 首先需要强调:DBD中的M位表示的是——除了DBD报文中描述的LSA摘要之外是否还有更多没有描述完的LSA摘要。也就是说这并不是意味着DBD中M=0时,就是发送这个报文的设备的最后一个DBD。后续设备还是可以发送M=0的DBD,里面的LSA摘要为空,当然这是为了符合可靠性的需求。
画个图就明白了:
- 主从都会等对方M=0,在这个过程中会发送M=0的空包用于确认
- 所以DBD交互结束总是以双方的DBD内的M=0为标志
3、思科和华为系统处理IP报文大小超过MTU方式不同:
为了验证2的理论,调小了MTU以及增加LSA条目企图让一个DBD无法描述所有的LSA摘要,需要多个DBD来描述。
模拟器类型 | 处理MTU溢出方式 | 优点 | 缺点 |
---|---|---|---|
CISCO | IP分片 | 减少CPU负担 | 增加网卡负担 |
HUAWEI | DBD分包 | 减少网卡负担 | 增加CPU负担 |
IP分片:
其实还是把完整的包拆分成多个,但是不是完整的报文,没有IP报头,需要接收方组装。
DBD分包:
就是一个DBD报文无法描述完LSA摘要,所以又多分了几个DBD报文,这些是完整的DBD报文。
六、六种LSA(下面打钩的六个,LSA在LSU中)
在下面的六种的LSA中,我们需要掌握报文的 “名称”“产生”“传播范围”“内容”。
在了解LSA之前,我们需要先了解以下几个东西
0、LSDB(链路状态数据库)
上面的这些LSA在传输过程中会被保存到名为LSDB的表中,我们之后查看设备链路之间有哪些LSA的交互就是通过查看这个LSDB来的得知的。同时有一点需要知道,一个区域内的LSDB的内容是同步的,说人话就是表现形式上是一个样的。不过有的路由器是位于两个区域之间的路由器-ABR(Area Board Router),这个时候他的LSDB里面包含多个区域的LSA,这也说明相对于IR而言ABR需要更高性能的路由器去承当这个角色。
查看LSDB的方法为:
show ip ospf database
下面为LSDB的部分可供参考
个人的一些理解:
在上面展示的部分SLA中的Link-ID,一般分为三种类型,他们有三种不同
的表现形式。
第一种:设备的RID
这种仅用设备的RID表示的Link-ID,是OSPF接口的链路状态的一个打包,里面有这个设备所有的详细链路状态信息。出现在1类以及4类的SLA中,就是方便别的设备(包括自己)完全了解自己。
第二种:设备的网段
这种就类似于路由表的网段信息,出现在3类以及5类的LSA中。
第三种:设备的物理接口IP
出现在2类的LSA中,作用未知后续更新......
1、1类LSA
类型1的LSA是任何一台OSPF路由器都会产生的,每一台OSPF路由器的每一个OSPF接口都会有自己的链路状态,但是每台OSPF路由器只能产生一条类型1的LSA,即使有多个OSPF接口,也只有一条类型1的LSA,因为所有OSPF接口的链路状态是被打包成一条类型1的LSA发送的。一个区域正是由于LSA 1的存在,才有精确的路由表,一个区域如果只有LSA 1,同样可以正常通信。LSA 1 只能在单个区域内传递,ABR不能将LSA 1转到发另外一个区域,并且没有任何权利修改LSA 1。在LSDB表现形式上发送的路由器id和通告的Link id是一样的,而且都为Router-id。
2、2类LSA
内含自身的直连信息,包括网段和链路种类等,只有DR能够产生,具体信息比较复杂。表现形式上ADV Router是Router-id,不过Link-ID是DR的物理接口的IP。
3、3类LSA
不同的area之间通过3类的SLA来传递链路信息摘要(比在域内传播的SLA的信息要精简,只包含了网段信息)
其中的这个SLA的发送端是上游的ABR,也就是发送端的Router-id是上游的ABR的随着SLA转发到其他的区域,上游的Router-id也会随之发生变化( 说人话就是哪个ABR转发了这条SLA,那么ADV Routher就是这个ABR的rid。)表现形式上,ADV Router是上游的ABR的Router-id,而Link-ID是发送区域的网段IP,这一点类似于链路矢量协议直接传路由条目。
4、4类LSA
在讲4类SLA之前先看下面5类的SLA。ASBR的下游的ABR是可以知道ASBR的信息的,因为他们位于一个区域,LSDB是同步的。此时这个ABR会发送一个4类的SLA内含ASBR的打包信息以及自身的RID;来帮助5类SLA的传输;这个SLA会随着上游ABR的变化而变化ADV-Router。表现形式上,Link-ID就是ASDB的RID,ADV是上游ABR的RID。
5、5类LSA
在不同的路由协议之间(像重分布),通过ASBR来进行5类SLA的转发,这个SLA和3类的SLA的作用相似,不过区别在于5类的SLA的ADV-Router永远是ASBR的Router-ID不会变,但是就有一个问题,其他区域的ABR可能不知道ASBR这个路由器的信息(对比三类SLA会随着报文传输更改上游ABR,使得ABR一直都是可以被知道的),这将会导致5类SLA无法顺利传输,所以我们需要使用4类的SLA来帮助其他的ABR知道这个ASBR;
//先把物理接口添加入区域中
R1:
conf t
router ospf 1
network 1.1.1.1 0.0.0.0 area 56
// 重分布的写法(把现有的路由器的loopback接口全部重分布进去)
int loopback 0
ip add 2.2.2.2 255.255.255.0
redistribute connected subnets
6、7类LSA
当外部的路由经过重分布进入OSPF的NSSA区域的时候,会自动从5类的LSA转化成7类的LSA,这个工作是由ASBR完成的。不过当这个7类的LSA条目进入OSPF内部区域的时候,会经过ABR自动转换成5类的LSA。至于什么是NSSA区域,我们后文会有讲解。上面的具体如下图:
7、对应的路由表路由表
如果是同区域的路由,叫做Intra-Area Route,在路由表中使用O来表示,1类的LSA转换成路由表就是这个表现形式;
如果是跨区域的路由,叫做Inter-Area Route或Summary Route,在路由表中使用O IA来表示。3类LSA转换成路由表中就是这个表现形式;
如果并非OSPF的路由,只是被重分布到OSPF的,叫做External Route,5类的LSA在路由表中使用O E2或OE 1来表示;
OE1与OE2的区别在于cost值的计算形式不同。
当使用OE2的时候,这个LSA在路由表的Metric值恒为20;
当使用OE1的时候,需要在默认20的外部Metric值的基础上加上内部Metric值
即正常的Metric值的计算方法+20。
- 如果是在NSSA区域内部,且是重分布进入这个区域的外部条目,在这个区域内被叫做NSSA ROUTE,7类的LSA在路由表中使用O N1或者O N2来表示;
是N1/2取决于我们重分布进来的时候是使用的哪一种的类型
8、自动添加的默认路由
- 首先我们知道OSPF是IGP(内部网关协议),不可避免的,我们需要链接外网上网,相对的就要链接外网的BGP(外部网关协议),而BGP需要通过重分布的方法进入我们的OSPF区域,所以我们一般在ASBR上面配置出口的默认路由条目(而且也就ASBR可以产生5类LSA),同时也要在网内的OSPF内的其他路由器上面也配置相对的出口默认路由条目,这样做费时费力。
- 于是我们让不受区域限制的5类SLA携带默认路由条目信息(就算一个区域没有和AREA 0 相邻,也没有做虚拟链路,他的LSDB里面仍然会有5类的LSA的条目,因为这种条目比较特殊,只要物理链路能到达就可以),并且让设备可以将其成功的转换成路由表里的默认条目。
//在ASBR上面进行配置,自身即使没有默认路由条目也可以下发默认路由
router ospf 1
default-information originate always
//在ASBR上面进行配置,自身没有默认条目的情况下不会下发默认路由
router ospf 1
default-information originate
9、3类和5类LSA的手动汇总
- 汇总的目的:通过将多条LSA条目汇总成一条,减少LSA条目的数量,从而减轻链路的负担,也减少因为部分条目的问题导致的LSDB和路由表的动荡的频率。因为OSPF能承载的条目数量最多也就上千条,我们使用汇总可以最大程度的减少条目的数量。
- 汇总肯定是写在ABR或者ASBR的上的,因为域间传播才用到3类和5类的LSA。
- 我们手动汇总采用的方法如下:
(对于IP:相同不变,不同变0)
(对于掩码:IP相同为1,不同为0)
①3类LSA手动汇总
R1:(ABR)
conf t
router ospf 1
area 1 range 192.168.0.0 255.255.0.0
②5类LSA手动汇总
R1:(ASBR)
conf t
router ospf 1
summary-address 192.168.0.0 255.255.0.0
七、四种区域类型
- 为什么我们需要这些区域?因为在一些情况下,我们并不需要过多的LSA条目就可以到达我们想去的IP(有的时候往往只需要一条的默认路由就能解决问题),而过多的LSA,以及过大的LSDB规模和路由表的规模对设备的性能有很大的考验。因此我们拥有了以下的四种区域类型,本质上就是为了进一步的减少LSA的条目的数量,减轻设备的负担。
1、Stub Area
区域设置为Stub Area之后,ABR会过滤掉4和5的外部LSA。所以在Stub区域内不能存在ASBR,即外部的路由不能配置在这个区域里面。为了能保证路由器还能去到外网,会有一条3类的LSA里面包含了默认路由的信息,能够让Stub区域内的设备将其转换成默认路由,以便其能够去往外网。
2、Totally Stub Area
区域设置为Totally Stub Area之后,ABR会过滤掉4和5的外部LSA,以及3类的域间LSA。所以在Stub区域内不能存在ASBR,即外部的路由不能配置在这个区域里面。不过这个区域里面并非一条的的3类LSA都没有,这个区域内的LSDB里面有一条ABR产生的3类的默认路由条目,区域内的设备可以将这个条目转换成默认路由,以便其可以找到外网。
3、NSSA Area(Not-So-Stubby-Area)
这个区域一边连接的是外部路由,一边连接的是OSPF内部路由。OSPF内部区域的5类的LSA无法经过ABR进入NSSA区域,会被ABR过滤掉。不过外部区域的5类LSA可以进入NSSA区域,不过在进入区域之前会被ASBR转换成7类的LSA,这个7类的LSA在往OSPF传递的时候也会被转换成5类的LSA。
4、Totally NSSA Area
在NSSA的基础上ABR还会额外过滤掉3类的LSA。
ASBR会自动发送一条7类的LSA加入Totally NSSA区域,用于后续设备寻找外网。
- 总表
区域类型 | 可存在LSA | 自动生成0.0.0.0 | Route类型 | 是否存在外部路由 |
---|---|---|---|---|
Stub | 1、2、3 | √ | IA | 无 |
Totally Stub | 1、2 | √ | IA | 无 |
NSSA | 1、2、3、7 | × | N2 | 有 |
Totally NSSA | 1、2、7 | √ | IA | 有 |
- 代码
conf t
router ospf 1
area 1 区域类型
//注意:因为区域类型必须一致,邻居关系才能建立,所以务必在区域内部的所有的设备都要更改区域的类型
八、讲在后面
1、OSPF的认证
//明文认证_在端口上开启认证
conf t
int f0/0
ip ospf authenticatio
ip ospf authenticatio-key password
//明文认证_在OSPF进程内开启认证
conf t
router ospf 1
area 1 authentication(所有端口开启认证)
int f0/0
ip ospf authenticatio-key password
//md5认证_在端口上开启认证
conf t
int f0/0
ip ospf authenticatio
ip ospf message-digest-key 1 md5 password
//md5认证_在OSPF进程内开启认证
conf t
router ospf 1
area 1 authentication message-digest(所有端口开启认证)
int f0/0
ip ospf message-digest-key 1 md5 password