我们在提到OSPF的时候,时常喜欢说的一句话就是,OSPF能够计算出无环的路由,那么OSPF究竟是如何规避路由环路的呢?OSPF与距离矢量路由协议不同,运行OSPF的路由器之间交互并不是路由信息,而是LSA,而路由器的计算正是基于网络中所泛洪的各种LSA,所以实际上OSPF路由的环路规避机制还得依赖LSA在环路避免上的设计,接下来我们就来分别探讨各种类型的LSA在防环上的考虑。
1. Type-1 LSA及Type-2 LSA的防环
我们都知道,每台运行OSPF的路由器都会产生Type-1 LSA,Type-1 LSA用于描述路由器的直连接口状态(接口IP信息或所连接的邻居,另外还有接口的Cost值),而且只在接口所属的区域内泛洪。Type-1 LSA使用各种类型的Link来描述路由器直连接口。Type-2 LSA则只出现在MA网络,由DR产生,用于描述接入该MA网络的所有路由器(的Router-ID),以及该MA网络的掩码信息。
得益于区域内泛洪的Type-1 LSA及Type-2 LSA,OSPF路由器能够“在自己的脑海中”还原区域内的网络拓扑及网段信息。路由器为每个区域维护一个独立的LSDB,并且运行一套独立的SPF算法,同一个区域内的路由器,拥有针对该区域的相同LSDB,大家都基于这个LSDB计算出一颗以自己为根的、无环的最短路径树。之所以能做到无环,是因为路由器能够通过LSA描绘出区域的完整拓扑(包括所有接口的Cost)及网段信息。以下图所示的网络为例:
R1、R2、R3及R4的接口均在Area0中,四台路由器都会产生Type-1 LSA并且在Area内泛洪。另外以太网链路由于缺省是广播型多路访问网络,因此会进行DR/BDR的选举,DR会产生Type-2 LSA并在区域内泛洪。在LSDB同步完成之后,每台路由器都拥有了整个区域的拓扑及网段信息,这些都是通过网络中泛洪的Type-1 LSA及Type-2 LSA拼凑出来的,请看下图:
接下来,每台路由器都以自己为根,计算一颗无环的最短路径数,以R3为例,它的最短路径树可能像下面这个样子:
所以,依赖Type-1 LSA及Type-2 LSA,路由器能够描绘出区域内的拓扑及网段信息,从而运行SPF算法,计算出到达每个网段的最优路径,并将这些路径安装到路由表中,因此区域内的路由(Intra-Area Route)可以实现无环路。
2. Type-3 LSA及Type-4 LSA的防环
1) OSPF要求所有的非0区域必须与骨干区域直接相连,区域间路由需经由骨干区域中转。
OSPF要求所有的非0区域必须与骨干区域直接相连,区域间(Inter-Area Route)路由需经由骨干区域中转。这个要求使得区域间的路由传递不能发生在两个非0的区域之间,这在很大程度上规避了区域间路由环路的发生,也使得OSPF的区域架构在逻辑上形成了一个类似星型的拓扑,如下图所示。
2) ABR只能够将其所连接的区域的区域内部路由注入到Area0,但是可以将区域内部路由及区域间的路由注入到非0常规区域。ABR从非骨干区域收到的Type-3 LSA不能用于区域间路由的计算。
OSPF对ABR有着严苛的要求,区域间的路由传递的关键点在于ABR对Summary LSA的处理。
在上图中,如果R3是一台普通的OSPF路由器(不是ABR),例如当它与R2没有OSPF邻居关系时,它会根据R4在Area2中泛洪的Type-3 LSA计算出1.1.1.0/24路由并将路由加载进路由表中。但是当R3与R2建立起OSPF邻接关系后,R3在Area0中就有了一个活跃的全毗邻连接,此时如果它把描述1.1.1.0/24路由的Type-3 LSA再注入回Area0,那么就会带来潜在环路的风险,如下图所示:
因此当一台ABR在非Area0的区域中收到Type-3 LSA时,虽然它会将其装载进LSDB,但是该路由器不会使用这些Type-3 LSA进行路由计算,当然它更不会将这些Type-3 LSA再注入回Area0中。因此在本段落的小标题中的这么一句话:“ABR只能够将其所连接的区域的区域内部路由注入到Area0,但是可以将区域内部路由及区域间的路由注入到非0常规区域”这句话,对应到上面的拓扑中,就是R3作为ABR,只能将其所连接的Area2内的区域内部路由注入到Area0(而不能将其在Area2内收到的3类LSA,也就是区域间路由注入Area0),但是可以将Area0的区域内部路由,以及R2注入到Area0的、用于描述Area1的区域间路由注入到非0常规区域Area2。
这里有一个有意思的细节,就是如果R3连接R2的接口虽然激活了OSPF(而且属于Area0),但是不与R2形成邻接关系(例如R2连接R3的接口不激活OSPF),那么此时R3其实并不算是严格意义上的ABR(虽然它产生的Type-1 LSA中B-bit会被置位,但是它在Area0中并没有全毗邻的邻居),因此它会将Area2内收到的Type-3 LSA用于区域间路由的计算,所以在R3的路由表中能看到1.1.1.0/24的区域间路由,但是一旦R2-R3之间的邻接关系建立起来,R3便不能再使用R4下发的Type-3 LSA计算区域间的路由,而只能使用在Area0中收到的、R2下发的Type-3 LSA进行路由计算,所以R3的路由表中,1.1.1.0/24的路由的下一跳将变为R2,即使从R2到1.1.1.0/24网络的Cost大于从R4走的路径,也不会切到R4上来。
PS,关于本段落标题中的内容,RFC2328相应的描述是:“Note that only intra-area routes are advertised into the backbone, while both intra-area and inter-area routes are advertised into the other areas.”,RFC3509则描述得更为精细:“Note that while only intra-area routes are advertised into the backbone, if the router has an Active Backbone Connection, both intra-area and inter-area routes are advertised into the other areas; otherwise,the router only advertises intra-area routes into non-backbone areas.”
3) ABR不会将描述一个Area内部的路由信息的Type-3 LSA再注入回该区域中。
实际上,OSPF区域间路由的传递行为,很有点距离矢量路由协议的味道。以下图为例,在Area1中,R1及R2都会泛洪Type-1 LSA、Type-2 LSA,两台路由器都能够根据这些LSA计算区域内路由,而R2作为ABR还担负着另一个责任,就是向Area0通告区域间的路由,实际上它是向Area0中注入用于描述Area1内路由的Type-3 LSA,而这些Type-3 LSA是不会发回Area1的——是的,类似水平分割行为对吧?接下来R3利用这些Type-3 LSA计算出了区域间的路由,并且为Area2注入新的Type-3 LSA用于描述区域间的路由,而这些Type-3 LSA同样的不会被注入回Area0。
R2在向Area0通告Type-3 LSA,为每条区域间路由携带上Cost值,这个值就是它自己到达各个目标网段的Cost,而R3收到这些Type-3 LSA并计算路由时,路由的Cost就是在R2所通告的Cost值的基础上,加上R3自己到R2的Cost值,然后,R3向R4通告这些区域间的路由时也携带者自己到达目标网段的Cost,而R4到达目标网段的Cost则是在R3的通告值基础上累加自己到R3的Cost——典型的距离矢量行为。
综上,我们发现OSPF为了区域间的路由防环是操碎了心的。Type-4 LSA实际上与Type-3 LSA都是Summary LSA,只不过一个是Network Summary LSA——用于描述网段路由,另一个则是ASBR Summary LSA——用于描述ASBR,他们使用的防环机制是一致的,因此这里不在赘述。
4) Type-3 LSA还涉及了DN比特位,用于在MPLS VPN环境下的环路规避
3. Type-5 LSA的防环
当一台OSPF路由器将外部路由引入OSPF域后,它就成为了一台ASBR,被引入的外部路由以Type-5 LSA在整个OSPF域内泛洪。一台路由器使用Type-5 LSA计算出路由的前提是两个,其一是要收到Type-5 LSA,其二是要知道产生这个Type-5 LSA的ASBR在哪里。与ASBR接入同一个区域的路由器能够根据该区域内泛洪的Type-1 LSA及Type-2 LSA计算出到达该ASBR的最短路径,从而计算出外部路由。而其他区域的路由器就没有这么幸运了,因为ASBR产生的Type-1 LSA只能在其所在的区域内泛洪,所以才需要Type-4 LSA。因此其他区域的路由器在获取Type-4 LSA后便能计算出到达ASBR的最短路径,进而利用该ASBR产生的Type-5 LSA计算出外部路由。Type-5 LSA将会被泛洪到整个OSPF域,表面上看,它本身并不具有什么防环的能力,但是实际上,它并不需要,因为它可以依赖Type-1 LSA及Type-4 LSA来实现防环。
另外,Type-5 LSA中的External Route Tag字段被用于在MPLS VPN环境下外部路由的防环,这里就不做深入探讨了
- HCNP Routing&Switching之BGP防环机制和路由聚合
前文我们了解了BGP路由宣告相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15440860.html:今天我们来聊一聊BGP防环机制和路由聚合相关话题 ...
- 从mixin到new和prototype:Javascript原型机制详解
从mixin到new和prototype:Javascript原型机制详解 这是一篇markdown格式的文章,更好的阅读体验请访问我的github,移动端请访问我的博客 继承是为了实现方法的复用 ...
- 浏览器 HTTP 协议缓存机制详解
最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...
- JVM的垃圾回收机制详解和调优
JVM的垃圾回收机制详解和调优 gc即垃圾收集机制是指jvm用于释放那些不再使用的对象所占用的内存.java语言并不要求jvm有gc,也没有规定gc如何工作.不过常用的jvm都有gc,而且大多数gc都 ...
- 路由信息协议(RIP)的防环机制
防环机制 1-记数最大值(maximum hop count):定义最大跳数(最大为15跳),当跳数为16跳时,目标为不可达. 2-水平分割(split horizon):从一个接口学习到的路由不会再 ...
- ThreadPoolExecutor运转机制详解
ThreadPoolExecutor运转机制详解 - 走向架构师之路 - 博客频道 - CSDN.NET 最近发现几起对ThreadPoolExecutor的误用,其中包括自己,发现都是因为没有仔细看 ...
- Linux 内存机制详解宝典
Linux 内存机制详解宝典 在linux的内存分配机制中,优先使用物理内存,当物理内存还有空闲时(还够用),不会释放其占用内存,就算占用内存的程序已经被关闭了,该程序所占用的内存用来做缓存使用,对于 ...
- PHP的垃圾回收机制详解
原文:PHP的垃圾回收机制详解 最近由于使用php编写了一个脚本,模拟实现了一个守护进程,因此需要深入理解php中的垃圾回收机制.本文参考了PHP手册. 在理解PHP垃圾回收机制(GC)之前,先了解一 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
随机推荐
- 解决linux环境mysql的sql语句严格区分大小写问题
在Windows环境下,mysql数据库的sql语句是不区分字母大小写的,但是程序移植到linux环境中,就会造成某些大小写不一致的语句执行失败,解决方法如下: 首先打开/etc/mysql/my.c ...
- LeetCode(976. 三角形的最大周长)
问题描述 给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. 示例 1: 输入:[2,1,2] 输出:5 ...
- 在win10中解决 你要以何方式打开此 .xlsx
鼠标右击开始按钮,点击控制面板. 查看方式选择大图标或者小图标. 然后点击“默认程序”. 点击,设置默认程序. 在左侧程序蓝,选择你需要设定的程序.然后点击“将此程序设为默认值”.确定 ...
- [P1396]营救 (并查集)
大佬都是用最短路做的 我用最小生成树 #include<bits/stdc++.h> #include<algorithm> using namespace std; stru ...
- [P4995]跳跳!(贪心)
这应该是我做过的最简单的洛谷月赛了 题意 给你n个高度,你的初始高度是0,现在要求你遍历每一个高度,每一次遍历耗费(hi−hj)2 的值 现在要你求耗费值最大 思路 真的是水…… 排序一下,求一下就好 ...
- python系统编程(十)
多线程-非共享数据 对于全局变量,在多线程中要格外小心,否则容易造成数据错乱的情况发生 1. 非全局变量是否要加锁呢? #coding=utf-8 import threading import ti ...
- vs 基本验证控件使用
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.c ...
- Visual Studio VS使用freopen调试控制台闪退
解决方法 freopen("CON", "r", stdin); system("pause>nul"); 暂停函数之前,使用f ...
- python算法练习
6. 约瑟夫环问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数,数到k的那个人被杀掉:他的下一个人又从1开始报数,数到k的那个人又被杀掉:依此规律重复下去 ...
- .ipynb格式文件
ipynb,即ipython notebook,需要用ipython notebook打开,IPython Notebook是web based IPython封装,但是可以展现富文本,使得整个工作可 ...