- OSPF邻接关系建立
- OSPF报文
- OSPF支持的网络类型
- OSPF的区域类型
- 影响OSPF邻接关系建立的因素
- OSPF的环路场景
- OSPF的防环机制
- DN比特位防环问题
- OSPF无效路由场景
- OSPF快速收敛机制
- 补充
- 追问
- one-way 是什么状态,如何进入 two-way
- DR的选举过程及时间
- first DBD与DBD的区别
- 如何选举主从,选举主从的作用
- OSPF协议的可靠性如何保证?
- 除了LSA的确认机制外,针对发送的LSU还有没有其它确认机制
- ospf协议为什么先进行BDR选举,然后才是DR
- Hello报文中的DR和BDR字段为什么是接口地址而不是RouterID
- 收到LSA之后的处理流程
- OSPF路由的优先级
- 5类LSA为什么需要FA地址?
- 外部路由选路问题
- 引入12.1.1.0/24和12.1.1.0/30两条外部路由,会通告几条5类LSA?
- 不同进程下学到同一条路由(类别和开销都相同)
- 如何减小ospf的lsdb的大小
- OSPF的路由选路原则以及负载的场景
- OSPFv2和v3的异同点
OSPF邻接关系建立
【注意】:每两台设备之间都会建立邻居关系,DR others会和DR与BDR之间、以及DR和BDR之间建立邻接关系即只有DR Others之间才会建立邻居关系,其他的都是邻接关系
状态机
OSPF 共有 8 种状态机:
- Down:邻居的初始状态,表示没有从邻居收到任何信息(包括hello报文检测不通过)或者邻居失效后变为该状态。在NBMA网络上,此状态下仍然可以向静态配置的邻居发送Hello报文,发送间隔为PollInterval,通常和RouterDeadInterval间隔相同。
- Attempt:此状态只在NBMA网络上存在【配置完peer就从Down变为Attempt】,表示没有收到邻居的任何信息,但是已经周期性的向邻居发送报文,发送间隔为Hello时间(30秒)。如果Dead时间(120秒)内间隔内未收到邻居的Hello报文,则转为Down状态,然后启动定时器Poll Interval(默认等于Dead时间,120秒),定时器到期前不再发送hello报文,定时器到期后重新发送hello报文
- Init:从邻居收到了Hello报文并且检测通过变为此状态,但是自己不在所收到的Hello报文的邻居列表中,表示尚未与邻居建立双向通信关系。在此状态下的邻居要被包含在自己所发送的Hello报文的邻居列表中。
- 1-Way:表示路由器发现自己没有在邻居发送Hello报文的邻居列表中,通常是由于对端邻居重启造成的
- 2-Way:表示路由器发现与邻居的双向通信已经开始(发现自己RID在邻居发送的Hello报文的邻居列表中)。Init状态下产生此事件之后,如果需要和邻居建立邻接关系则进入ExStart状态,开始数据库同步过程;如果不能与邻居建立邻接关系则进入2-Way。
成为邻居的7个条件:
- RouterID不冲突
- 区域ID相同
- 特殊区域的flag字段相同,flag位主要体现的是区域类型,即区域类型相同
- hello/dead相同
- 认证相同
- 子网掩码相同,即在同一网段,只影响广播和NBMA网络
- 网络类型
- 2-way:在此状态下,双向通信已经建立,但是没有与邻居建立邻接关系。这是建立邻接关系以前的最高级状态。DR和BDR是从达到2-way或者更高状态的邻居中选举出来的,即此状态是选举DR和BDR的开始(选举周期为40秒,选举期之后没有抢占性)【40秒为WaitingTimer,不可修改,详情参考接口状态机】
如果此阶段发现接收到的hello报文的邻居列表里没有自己的RouterID,则变回Init状态
两端同时进入2-way标志着邻居关系的建立,进入2-way后,要建立邻接关系(Full)的情况如下:
- 接口类型为p2p(点到点),p2MP(点到多)
- 自己为DR,或者为BDR
- 邻居为DR,或BDR
- Exstart:交换信息的初始化状态。发送DBD(包含本地的LSA的摘要信息)报文,选举主从路由器,并确定初始的DBD序号,达到此状态或者更高状态的邻居才能称为邻接
发送第一个DBD报文,由2-way转成Exstart
- Exchange:交换信息的状态。该状态下,相互间发送DBD,告知对端本地所有的LSA的目录;同时,可以发送LSR、LSU、LSACK来学习对端的LSA
主从选举完毕之后,由Exstart转换成Exchange
- Loading:加载状态(没有学习完的状态)。发送LSR、LSU、LSACK,专门学习对端的LSA的详细信息
当DBD报文中的M=0时,由Exchange转成Loading
- Full:邻接状态(学习完的状态)。彼此的LSDB同步,即所有的LSA相同
重传列表为空,由Loading转成Full
- 停留在2-way状态:广播网或者NBMA网络中,DR优先级为0(无法选举DR)
- 停留在ExStart状态:MTU不一致时,主>从时双方都是;从>主时的主,从进入ExChange(开启MTU检查时)
- 停留在Loading状态:如果忽略MTU检测且MTU不一致,路由条目多的情况下,报文长度超过MTU,有可能会卡在Loading状态;如果路由条目比较少,报文长度没有超过MTU,则可以达到full状态
ospf的MTU在哪里比较,如果不通过时什么状态?
MTU在ExStart状态的时候进行比较,MTU在DBD报文里面,华为默认忽略MTU检查,即DBD报文中MTU字段为0。开启MTU检查情况下,在收到报文的MTU大于本端MTU时会丢弃,否则接收。
情况1:2端都忽略MTU检查。路由条目多的情况下,LSU报文长度超过MTU,需要同步数据库的一端停留在在Loading状态,因为收不到LSU;如果路由条目比较少,报文长度没有超过MTU,则可以达到full状态
情况2:2端同时开启MTU检查。MTU不一致时,主>从时,因为双方都认为自己是主,所以双方都是ExStart;从>主时的主,从知道主的存在,所以从进入ExChange,但是主不知道从,所以停留在ExStart
情况3:1端开启1端忽略。不开启的一端发送的MTU值为0,开启的一端收到之后直接检查通过,不开启的一端发送的MTU值不为0,但是对方忽略检查。所以和两端都忽略检查的本质相同,即如果LSU过大,会卡在loading状态。
邻接建立过程
邻接关系建立分3步:
- 邻居关系的建立:
R1和R2的Router ID分别为1.1.1.1和2.2.2.2
- 【R1->R2】:R1发送第一个Hello报文(以组播的方式发送,目的地址为224.0.0.5),此时状态为Down,R2收到R1的Hello报文后,状态置为init
需要注意的是,首次发送hello报文的时候不包含邻居字段,报文长度为44
。 - 【R2->R1】:R2向R1组播发送邻居列表为1.1.1.1的hello报文,发送3个周期(也有超过3个周期),R1在收到R2发来的报文邻居列表中发现自己的Router ID,而且满足ospf邻居的7个条件,状态变为2-way
- 【R1->R2】:R1向R2组播发送邻居列表为2.2.2.2的hello报文,发送3个周期,R2在收到hello报文邻居列表中发现自己的Router ID,而且满足ospf邻居的7个条件,状态变为2-way,至此R1和R2之间建立了邻居关系。
- 【R1->R2】:R1发送第一个Hello报文(以组播的方式发送,目的地址为224.0.0.5),此时状态为Down,R2收到R1的Hello报文后,状态置为init
- DR和BDR的选举:
DR无法选举则停留在2-way
广播40秒,NBMA120秒
为什么要选举DR? 一个既不是DR也不是BDR的路由器只与DR和BDR形成邻接关系并交换链路状态信息以及路由信息,大大减少了邻接关系数量,减少链路状态信息以及路由信息的交换次数,这样可以节省带宽,减少路由器硬件的负担
- R1和R2都会成为DR others,发现Hello报文中没有DR和BDR
- 先选举BDR,先比较优先级,再比较Router ID,
假设优先级相等,R2的Router ID大
,R2成为BDR,R2发现没有DR,自动成为DR - DR others发现又没有了BDR,再选举出来一个BDR,R1成为BDR
DR的选举时间等于Dead time(40秒),只有在广播网络中才会选举DR
ospf协议为什么先进行BDR选举?因为DR和BDR的切换状态机是:当DR失效时,BDR成为DR。如果先选举DR,再选举BDR,那么当选举BDR的过程中DR失效,那么此时网络中既没有DR也没有BDR,切换将无法进行,状态机也就没办法做了。所以,先有BDR,后有DR是为了保证状态机能工作。
- 邻接关系的建立
- 主从选举
检查MTU,分情况讨论MTU不一致的情况
为什么进行主从选举?刚才已经选举出DR和BDR,为了保证其他设备与DR同步数据的时候不出现问题,需要统一1个序列号,同时进行MTU的协商
- 【R1->R2】:状态变为ExStart,R1向R2发送第一个DD报文,在这个报文中,seq(DD序列号)被设置为x,I(Initial)=1表示这是第一个DD报文,M(More)=1表示后续还有DD报文要发送,Ms(Master)=1表示R1宣告自己为主路由器
seq=x,I=1,M=1,Ms=1
- 【R2->R1】:R2向R1发送第一个DD报文,状态变为ExStart,
seq=y,I=1,M=1,Ms=1
由于R2的Router ID比R1的大,所以R2应当为主路由器,Router ID的比较结束后,R1会产生一个NegotiationDone的事件,R1从ExStart改变为Exchange主从选举出来:R1进入ExChange状态,但是R2需要收到R1的隐式确认才能进入ExChange
- 【R1->R2】:状态变为ExStart,R1向R2发送第一个DD报文,在这个报文中,seq(DD序列号)被设置为x,I(Initial)=1表示这是第一个DD报文,M(More)=1表示后续还有DD报文要发送,Ms(Master)=1表示R1宣告自己为主路由器
- 同步LSDB
- 【R1->R2】:R1发送一个新的DD报文,在这个新的报文中包含LSDB的摘要信息,seq=y、I=0、M=1、MS=0
主从选举完毕:R1使用R2的序列号,隐式确认R2为主,R2收到后变为ExChange状态。以后R2是主,其主动权通过修改seq来体现
- 【R2->R1】:R2发送一个新的DD报文,seq=y+1、I=0、M=1、MS=1,R1和R2通过DBD交互了解到对方的OSPF数据库中的摘要信息。这个过程可能交互很多个DBD报文,但这些报文有一个共同点I=0、M=1、R1发的MS=0、R2发的MS=1
- 【R1->R2】:seq=y+1,I=0,M=0,MS=0。R2收到一个M=0的DBD包的时候表明是R1发来的最后一个DBD包了,如果R2搜集完R1发来的DBD并且发现这些DBD里有它感兴趣的LSA,R2期望更详细的LSA信息时,R2将自己的状态变为Loading,并且开始发送LSR报文去请求特定LSA的详细信息。
- 【R2->R1】:seq=y+2,I=0,M=0,MS=1。R1收到一个M=0的DBD包的时候表明是R2发来的最后一个DBD包了,如果R1搜集完R2发来的DBD,假如没有发现自己感兴趣的LSA
假设R1是LSDB是最新最全的,不需要向R2请求
,将自己的状态变为Full。此时R2直接进入Full状态而不是Loading状态,R1进入Loading状态
- 【R1->R2】:
Loading到Full状态的转换
R1将自己感兴趣的LSA通过请求报文LSR发送给R2 - 【R2->R1】:R2收到这个LSR后,会以LSU进行回应,其中就包含了对方请求的LSA详细信息,因此,只有在LSU报文中,才能看到LSA的完整信息
- 【R1->R2】:R1收到R2发来的LSU之后,将LSA详细信息放进自己的LSDB,并且给R2发送一个LSAck进行确认,状态转换为Full状态。
- 【R1->R2】:R1发送一个新的DD报文,在这个新的报文中包含LSDB的摘要信息,seq=y、I=0、M=1、MS=0
- 主从选举
OSPF报文
OSPF报文头部:
OSPF认证
认证配置方式
- 区域认证
- 接口认证,接口认证优先于区域认证
分类
- 明文认证:传递明文密码,不安全,报文被劫获后密码泄露,无抗重放攻击特性
- MD5认证:不传输密码只传输HASH值,就算报文被劫获也无法看到密码,同时认证序列号(4B)可以实现抗重发攻击和报文有效性检查。【注意:摘要信息虽然在ospf头部中,但是并不计算到ospf头部长度内;认证序列号是基于计数的方式,每隔1秒加1(可以用136年),如果收到的报文系列号比之前发送的小则丢弃,不需要顺序匹配,只要保证比之前的大即可】
报文类型
1. Hello
用来发现、建立和维护OSPF的邻居关系,可以组播也可以单播发送,在不同的网络类型中发送方式和发送间隔不同
- Network Mask:只有在广播网络或者NBMA网络才有意义(在P2P和P2MP链路上是不检测的)
- HelloInterval:在广播网络和P2P中是10秒一次,在P2MP和NBMA中是30秒一次
- Options:标识发送此报文的OSPF路由器所支持的可选功能
Hello报文中Option字段位置 和 DBD、LSA报文中中位置相同【即只要hello、DBD和LSA存在Option字段,其他报文不存在此字段】
- DN位:Down比特位,是用来防止MPLS VPN环境下的3类环路问题
如果一台PE设备收到DN位置位的3类或者5类LSA,直接丢弃
- O位:用来支持9、10、11类LSA的能力
- DC位:当始发链路支持按需链路(意思是需要建立时才建立)时该比特位会置位,例如虚链路、sham-link
华为设备此比特位不会置1,华为的虚链路是使用P2P来维护,如果思科与华为对接,思科按照华为的方式(P2P)维护电路,每隔1800秒(30分钟)通告一次LSA,来维护LSA的有效性
- N位:N位表明是否支持7类LSA,N=0表明不接收和发送7类LSA
- P位:用在NSSA LSA(7类LSA),是否做7类转成5类
NP位在不同的报文中意义不一样,如果在hello或者DBD报文中,说明此报文来自NSSA区域;如果在LSA报文中,说明这个LSA需要进行7转5的
- E位:能否接收外部路由(5类LSA),默认E位是1,是可以接收外部路由
- DN位:Down比特位,是用来防止MPLS VPN环境下的3类环路问题
- Rtr Pri:用来选举DR和BDR的
- RouterDeadInterval:通常为4倍HelloInterval,
hello影响dead,但是dead不影响hello
- Designated Router:如果设置为0.0.0.0,表示未选举DR路由器。
- Backup Designated Router:如果设置为0.0.0.0,表示未选举BDR路由器。
- Neighbor:邻居路由器的Router ID列表,表示本路由器已经从该邻居收到合法的Hello报文
验证一个接收到的Hello报文是否合法:
- 如果接收端口的网络类型是广播型、NBMA,Network Mask字段必须和接收端口的网络掩码一致,如果接收端口的网络类型为P2P、P2MP、虚连接,则不检查Network Mask字段;
- 所接收的Hello报文中的HelloInterval字段必须和接收端口的配置保持一致;
- 所接收的Hello报文中的RouterDeadInterval字段必须和接收端口的配置保持一致;
- 所接收的Hello报文中的Options字段中的E位(表示是否接收外部路由信息)必须和相关区域的配置保持一致。
2. DBD
数据库描述报文,选择主从关系,通告LSA摘要信息完整的LSA头部信息
,确保DBD报文交互的可靠性
- firstDBD:不携带LSA头部信息。通过firstDBD确认主从关系。作用只是为了控制序列号的同步。Router-ID高的将成为主。
- DBD只携带LSA的头部信息,没有携带LSA的具体信息
只有主才会生成DD序列号
3. LSR
接收到DBD报文后,将DBD报文中的LSA摘要信息和本地LSDB做对比,如果有本地不存在的LSA,需要发送LSR请求具体的LSA内容,LSA值包含3部分内容:LSA类型(LSA TYPE)、链路状态ID(Link state ID)、通告路由器(Advertising Router)
LSR报文中不会包含option选项
4. LSU
用于向对方回复具体的LSR,含有真正LSA完整信息的
LSA报文
LSA头部(20字节)
- 除Hello报文外,其它的OSPF报文都携带LSA信息
- 常用的LSA:Router LSA、Network LSA、Network-summary LSA、ASBR-Summary LSA、AS External LSA、NSSA LSA,即1、2、3、4、5、7
- 还有哪些LSA:Opaque LSA(9-仅在接口所在网段范围内传播、10-在区域内传播、11-在AS内传播,主要用于MPLS多协议标签交换,即MPLS TE,不透明LSA) 、Mutilcast LSA(6,组播LSA)、External attributes LSAfor BGP(8,BGP的外部属性LSA)
OSPF协议规定LSA的更新时间间隔5秒,是为了防止网络连接或者路由频繁动荡引起的过多占用网络带宽和设备资源,所以看到每隔5秒,LSA重新泛洪一次
- LSA age:默认最大值为3600。
通过将LSA Age设置为3600来删除该条LSA,但1类LSA不适应此条规则
- LAS的序列号:可用的最小数值为0x80000001(初始序号,-2^31+1 ),每次更新该LSA,序列号+1,序列号越大则该LSA越新,最大为0x7FFFFFFF,达到最大值之后,重新从0x80000001开始
收到重复的LSA如何判断新旧?
- 比较LSA的序列号,越大越新
- 比较校验值(Checksum),越大越新
- 比较LSA的Age是否等于Max Age时间3600,相等则最新
- LSA的Age不等于3600,会比较age与3600之间的差值,如果差值大于900(即15分钟),越小越新
- LSA的Age不等于3600,且age与3600之间的差值小于900,则会认为是同一条LSA,忽略其中一条
如何保证让邻居收到一个最新的LSA?
A. 假设AB两台直连设备建立OSPF邻接关系,并且由A通告给B一条序列号为10的Router-LSA,这条LSA会存在于B的LSDB中。现在,我们将A设备的直连接口shutdown,会造成A和B的OSPF的邻居关系断开,那现在B设备的LSDB中是否还会有A发送的Router-LSA呢?
B. 答案是肯定有的,原因是OSPF 为了保证LSDB 的一致性,是没有能力删除邻居发送的LSA 的,只能删除由自己通告的LSA。了解这个机制后,我们再考虑一下,如果现在将A的直连接口恢复,并重新和B 建立邻居关系,那么A会再次通告自己的Router-LSA,那么现在通告的序列号会是多少呢?
C. 会是通告序列号为1 的Router-LSA吗?答案是否定的,A会通告一条序列号为11的Router-LSA。这是为什么呢?我们可以想一下,如果A重新通告一条序列号为1 的Router-LSA 给B,B会接收吗?
D. 答案是不会,原因就是我们之前谈到的LSA 新旧比较问题,由于B的LSDB中存在A 之前通告的一条序列号为10 的Router-LSA,现在又收到同样的的一条LSA,需要比较两条LSA 的新旧,由于收到的LSA 的序列号比LSDB中保存的LSA 的序列号还要小,那么这条LSA 会被忽略掉。
E. 为了让LSDB保持同步,需要在接收到的LSA序列号上加1,作为最新的序列号标识LSA,并重新在区域内泛洪。
LSA报文简略总结:通过判断头部type、LS ID和ADV来判断是否为同一条LSA
种类type | 名称 | 产生者(ADV) | LS ID(链路状态ID) | 泛洪区域 | Cost | 作用 | 防环 |
---|---|---|---|---|---|---|---|
1 | Router | 每台路由器(自己的RouterID) | 自己的RouterID | 所属区域 | 100/实际带宽(100为参考带宽) | 设备的链路状态和开销 | SPF |
2 | Network | DR的RouterID | DR接口IP | 所属区域 | 无cost字段 | 本网段的链路状态 | SPF |
3 | Network-Summary | ABR的RouterID | 网络前缀 | 区域间 | ABR到目的网段的开销 | 区域间的路由信息 | 3类LSA的防环规则 |
4 | ASBR-Summary | ABR的RouterID | ASBR的RouterID | 非asbr区域的所有区域 | ABR到ASBR的开销 | 到ASBR的路由信息 | 和3类相同 |
5 | AS-External | ASBR的RouterID | 网络前缀(外部) | 全网(除stub、nssa) | ASBR到目的网段的开销 | 到AS外部的路由 | 依靠3类 |
7 | NSSA-External | ASBR的RouterID | 网络前缀(外部) | NSSA区域 | ASBR到目的网段的开销 | 到AS外部的路由 | P位 |
8 | Link | 每台路由器(自己的RouterID) | 接口编号 | 本链路 | 本接口cost | 描述本链路的信息(链路本地地址、接口编号和前缀) | SPF |
9 | Inter-Area-Prefix(区域内前缀) | 每台路由器(自己的RouterID) | 网络前缀 | 所属区域 | 本接口cost | 域内路由 | SPF |
Router-LSA(Type1)
OSPF网络里的每一台路由设备都会发布Type1 LSA,这种类型的LSA用于描述设备的链路状态和开销,在路由器所属的区域内传播
一条Router-LSA可以描述多条链接,每条链接由Link ID、Data、Type和Metric描述
报文中3个重要比特位标识设备角色:V代表虚链路,B代表ABR,E代表ASBR
Type | LinkID | LinkData |
---|---|---|
P2P点对点 | 邻居的RouterID | 该网段上本地接口的IP地址 |
TransNet传送网络 | DR的接口IP地址 | 该网段上本地接口的IP地址 |
StubNet末梢网络 | 该Stub网段的IP网络地址 | 该Stub网段的网络掩码 |
Virtual虚链路 | 虚连接邻居的RouterID | 去往该虚连接邻居的本地接口的IP地址 |
广播类型的接口的链路类型是transnet,环回口链路类型是stubnet,点到点链会生成p2p和stubnet两种类型(所以即使不在同一网段也能建立邻居)。OPSF是先计算p2p和transnet,再计算stubnet
哪些接口会通告成stubnet的链路类型?
- 逻辑接口
- 没有邻居关系的物理接口
- 点到点或者虚链路网络类型的接口
Network-LSA(Type2)
由DR产生,描述本网段的链路状态,在所属的区域内传播。
Network-summary-LSA(Type3)
由ABR发布,用来描述区域间的路由信息。ABR将Network-summary-LSA发布到一个区域,通告该区域到其他区域的目的地址。实际上,ABR是将区域内部的Type1和Type2的信息收集起来并汇总之后扩散出去,这就是Summary的含义
OSPF的防环:不允许直接在两个非骨干区域之间发布路由信息,只允许在一个区域内或者骨干和非骨干区域间发布路由信息
3类LSA的防环:(水平分割)一条3类LSA的始发区域不会再通告这条LSA(即一条3类LSA不会再通告回始发区域)
ASBR-summary-LSA(Type4)
报文格式和3类相同,如果是4类,那么LS ID为ASBR的RouterID,且掩码设置为0.0.0.0,无实际意义
由ABR发布,描述到ASBR的路由信息,并通告给除ASBR所在区域的其他相关区域
传递范围为区域内,只要跨区域了,则需要重新生成4类LSA,主要是metric值不同,当然通告路由器也不通
AS-External-LSA(Type5)
由ASBR产生,描述到AS外部的路由,通告到除Stub区域和NSSA区域以外所有的区域
tag字段ospf本身很少使用,但是经常用在MPLS VPN的防环中,TAG被填充为AS number,主要作用是防环
外部度量值类型(E比特位):
OE1:第一类外部路由。在传递过程中开销值累加。OE1的路由优先于OE2
。OE1的路由比较的是总开销值,不区分内外。
OE2:第二类外部路由,默认类型。在传递过程中开销值不会累加,只计算引入时的外部开销值,不计算内部开销值。OE2只看外部开销(忽略内部开销);如果外部开销相同,则比较内部开销;如果内部和外部开销都相同,则进行负载。先看外部cost,再看内部cost
总结:OE1是不分内外,加在一起进行比较;OE2是内外分开,先比较外部,外部相等再比较内部
外部路由引入可以打上TAG,如果没有指定,则默认等于进程ID,例如引入将rip3的路由引入ospf1,则tag默认等于1;如果是在MPLS VPN场景下,这个是本AS号的哈希值
关于FA地址的4问:
-
FA地址作用:防止次优路径和环路。
-
携带FA地址的3个条件:
- 出接口类型不能是P2P、P2MP;
- 出接口不能配置为静默接口(silent接口);
- 下一跳地址要为域内或者域间可达,即引入的外部路由的下一跳接口所在网段必须宣告进OSPF
OSPF的五类LSA如果携带了FA地址,计算路由时会优先考虑FA地址(即只计算到达FA的距离,不计算到达ASBR的距离);如果FA地址不可达,则路由无效;如果没有携带FA地址,才会考虑ASBR
-
FA地址如何填充(即FA地址是什么地址):填充为引入外部路由的下一跳地址
此地址一般不是域内地址,但其所在网段却宣告进了OSPF
-
计算FA地址的条件:到达FA地址所在网段必须是OSPF域内或者域间路由可达。如果是通过静态、外部路由引入等可达,则不计算
NSSA(Type7)
由ASBR产生,描述到AS外部的路由,仅在NSSA区域内传播,报文结构和5类相同。NSSA区域的ABR收到NSSA LSA时,会有选择地将其转化为Type5 LSA,以便将外部路由信息通告到OSPF网络的其它区域。AS-external-LSA是在整个AS泛洪,而NSSA LSA仅在NSSA区域中泛洪。
- P位用于告知转化路由器该条Type7 LSA是否需要转化。
- 缺省情况下,转化路由器是NSSA区域中RouterID最大的ABR。
- 只有P置位并且FA(Forwarding Address)不为0的NSSA LSA才能转化为AS-external-LSA。FA用来表示发送的某个目的地址的报文将被转发到FA所指定的地址。
- ASBR产生的NSSA LSA不会置位P位
- FA地址默认会被填充,填充顺序如下【其实后两者没有任何意义】:
- 如果满足5类LSA的3大条件,FA地址是ASBR上外部路由的下一跳地址;
- 如果没有将引入外部路由下一跳地址所在网段宣告进OSPF,则优选宣告进ospf的逻辑接口IP地址最大的一个;
- 如果没有逻辑接口宣告进OSPF,则优选宣告进ospf中活动的物理接口地址较大的一个
5. LSAck
用来对接收到的LSU报文进行确认,内容是需要确认的LSA的Header(一个LSAck报文可对多个LSA进行确认),LSAck报文根据不同的链路以单播或组播的形式发送。
OSPF支持的网络类型
- P2P网络
只把两台路由器直接相连的网络,例如运行PPP的64K串行线路就是一个点到点网络
不需要选举DR和BDR,hello时间10s,dead时间40s,5种报文全部组播 - Broadcast网络
支持两台以上路由器,并且具有广播能力的网络,例如含有四台路由器的以太网
需要选举DR和BDR,hello时间10s,dead时间40s,hello报文组播、DBD和LSR是单播、LSU和LSAck有单播也有组播 - NBMA网络
例如使用SVC进行通信的ATM网络【全连接ATM网络】
需要选举DR和BDR,hello时间30s,dead时间120s,5种报文均是单播) - P2MP网络
不需要选举DR和BDR,hello时间30s,dead时间120s,hello报文组播、其他报文全是单播 - 虚链接
注意事项:虚连接不能配置在骨干区域(Area0)和末节区域(实验中的Area20),不能跨越多个区域
网络类型 | Hello时间 | dead时间 | Hello报文 | DBD报文 | LSR报文 | LSU报文 | LSACK报文 | 是否选举DR/BDR |
---|---|---|---|---|---|---|---|---|
NBMA | 30 | 120 | 单播 | 单播 | 单播 | 单播 | 单播 | 需要 |
P2MP | 30 | 120 | 组播 | 单播 | 单播 | 单播 | 单播 | 不需要 |
P2P | 10 | 40 | 组播 | 组播 | 组播 | 组播 | 组播 | 不需要 |
Broadcast | 10 | 40 | 组播 | 单播 | 单播 | 单播/组播 | 单播/组播 | 需要 |
虚链路 | 10 | 40 | 单播 | 单播 | 单播 | 单播 | 单播 | x |
P2MP和NBMA的hello时间为30秒的原因:P2MP和NBMA为低速网络,为了保证链路拥塞不会影响邻居的建立,将hello时间调大
虚链路是跨设备的,所以都是使用单播,TTL为255,而其他的组播报文的TTL为1
不同的网络类型之间是否可以建立邻接关系?是否有路由?
能不能建立邻居需要看hello报文时间与发送方式;有没有路由需要看是否有DR和BDR
- P2P与Broadcast
可以建立邻接关系,但是没有路由。
原因:P2P没有DR和BDR,即没有二类LSA,导致Broadcast无法识别相应报文 - P2MP与Broadcast
因为hello时间不相同,无法建立邻居关系。
如果将P2MP的hello时间修改为10s,可以建立邻接关系,但是没有路由。原因同上 - NBMA和Broadcast
因为hello时间不相同,无法建立邻居关系。即使修改hello时间也无法建立邻接关系。
原因:NBMA的hello报文为单播,Broadcast的hello报文为组播 - P2P和P2MP
因为hello时间不相同,无法建立邻居关系。修改P2MP的hello时间为10s之后可以建立邻接关系并且有路由
判断一个接口所属的网络类型
通过接口的二层封装协议判断网络类型
网络类型 | 常见链路层协议(二层封装) |
---|---|
Point-to-point | PPP链路、LAPB链路、HDLC链路 |
Broadcast | 以太网链路、802.3 |
NBMA | 帧中继链路、ATM链路 |
OSPF的区域类型
- 骨干区域:即区域0
- 非骨干区域:非0区域
- 普通区域
- 特数区域
- stub:末节区域
- total stub:完全末节区域
- nssa:次末节区域
- total nssa:完全次末节区域
Option选项与区域类型
E | N | 区域类型 |
---|---|---|
0 | 0 | stub区域 |
0 | 1 | NSSA区域 |
1 | 0 | 普通或者骨干区域 |
影响OSPF邻接关系建立的因素
1. Route ID
1类LSA通过序列号+1撤销路由,3类和5类通过3600秒撤销
1. 同一区域内
1. 直连设备RouterID冲突
【结果】:
无法建立ospf邻居关系,两端的邻居状态机都为down
【分析】:
RouterID不冲突是建立ospf邻居的7个条件之一,如果RouterID冲突,则直接丢弃Hello报文,两端的邻居状态机为down
2. 非直连设备RouterID冲突
【结果】:
- R2会和R1、R3分别建立邻接关系,但是在R2的lsdb中只存在1条来自1.1.1.1的1类lsa;
- 在所有设备上会出现1类和2类LSA的翻动,序列号不断增加。
【分析】:
- R2会收到R1、R3发送的同一条Router-LSA,原因是R1、R3 的RouterID相同,导致LSA的头部信息一致,被认为是同一条LSA。
- R2需要做一次LSA的新旧比较,假如通过序列号比较R2优选了R1通告的1类LSA(R1通告的序列号比R3 的大),R2将Router-LSA放入到LSDB中,并且将这条最新的Router-LSA转发给R3。
- R3收到后发现这是自己通告的LSA,但是LSA的序列号比自己本地生成的还要大,为了保证LSDB的同步,R3会在接收到的序列号基础上+1作为最新序列号,向R2在通告一条1类lsa。
- 这样R2又收到一条R3通告的1类LSA,通告LSA新旧比较,优选了R3。然后将最新的LSA在通告给R1,R1收到后在重复R3的动作。
- 这样造成R1、R3 的1类LSA一直在翻动,序列号在不停的增长。
3. 非直连设备和ABR的RouterID冲突
【结果】:
- 在R2和R4上会出现1类LSA的翻动,序列号不断增加
和同一区域的RouterID冲突原因相同
- R4收到ABR发送的3类LSA后,会将该3类LSA的老化时间设置为3600秒,并泛洪3类LSA
- R2上3类LSA的序列号不断增加,导致区域1会出现3类LSA的翻动
【分析】:
- R3收到R2发送的3类LSA后会转发给R4,R4收到后发现该3类LSA的通告路由器正好是自己的Router-id,会认为该3类LSA是自己发送的,但是R4发现在LSDB中并不存在这条本地通告的LSA。R4会认为这很可能是自己之前已经删除的一条LSA,现在又从邻居收到了。为了同步LSDB和避免环路,R4会将这条3类LSA的LSA AGE配置为3600秒(不会修改LSA 的序列号,只是修改LSA AGE时间为3600S),并泛洪这条修改后的3类LSA,目的就是让区域内的其它OSPF路由器加速删除这条3类LSA,同步LSDB。
- 这样R3又从R4收到一条同样的3类LSA,R3会执行LSA新旧比较过程,由于R4通告的3类LSA中LSA AGE等于MAX AGE(3600S),R3会优选R4通告的3类LSA,替换本地LSDB,并将最新的3类LSA在通告回R2。由于R2是该3类LSA的始发者,并且该LSA还是有效的,为了同步LSDB,避免这条有效的3类LSA被删除。R2 会马上向区域泛洪一条序列号+1的3类LSA 做为更新。
- R3现在又收到了从R2发送的3类LSA,由于R2发送的LSA序列号较大,R3会优选R2发送的LSA,替换本地LSDB,并将最新的3类LSA再通告给R4,R4再次重复以上步骤,导致LSA的翻动。
【解决】:
华为的设备如果发现这种冲突,会在一定的冲突时间范围内,将OSPF进程重启,并重新指定一个Router-id,从而避免冲突
2. 不同区域内
1. 非直连设备RouterID冲突
【结果】:
不同区域间的设备RouterID冲突,不会有任何的影响,冲突设备可以接收LSA并选路。
【分析】:
1类LSA的泛洪范围是区域内,不同区域间不能交互1类LSA。如果想实现不同区域间的通信,就需要ABR,ABR会将1类LSA中的链路信息转换为3类LSA中的路由信息通告给其它区域,3类LSA的通告路由器会用ABR 的RouterID来标识,这样也就避免了RouterID的冲突问题
但是不能引入外部路由,外部路由通过5类LSA在整个OSPF区域泛洪,R1和R3还是会发现对方的存在,导致所有设备上5类LSA的序列号不断增长(详细分析见下面内容)
2. 非直连设备和ASBR的RouterID冲突
【结果】:
R1上5类LSA的序列号不断增加,导致所有设备上出现5类LSA的翻动
【分析】:
与非直连设备和ABR的RouterID冲突的原因类似,只是针对不同的LSA。
- 由于5类LSA是在整个自治系统内泛洪,R4在收到后同样会发现5类LSA的通告路由器和自己的RouterID一样,但是本地并不存在这条LSA,R4会将这条LSA的LSA AGE设置为3600S,并泛洪该LSA,目的是加速删除,同步LSDB。
- 这会造成沿路上的所有转发设备都会认为该5类LSA是最新的,替换LSDB中的LSA,超时后将这条5类LSA从LSDB中删除。当这条LSA会被转发到R1的时候,R1发现5类LSA是本地通告的,并且这条LSA在本地是有效的,LSA AGE在正常范围时间内。
- R1便会将5类LSA的序列号+1,并且重新泛洪5类LSA。保证5类LSA的有效性,同步LSDB,造成5类LSA的翻动
【解决】:
- 自动解决:华为的设备如果发现这种冲突,会在一定的冲突时间范围内,将OSPF进程重启,并重新指定一个Router-id,从而避免冲突
- 人工解决:如果区域0要引入外部路由,可以把区域1配置为Stub区域,因为LSA5不进Stub区域;如果区域1要引入外部路由,可以把区域1设备为NSSA区域,由于LSA7转LSA5后ADV变成ABR。
2. 区域ID
区域ID包含在ospf头部,双方不一致时无法建立邻居
3. flag位(区域类型)
主要是区域类型(option字段中的E位与N位)
E位代表能处理外部路由,在OSPF中外部路由就是指5类lsa,N位代表NSSA区域(支持7类LSA)
E | N | 区域类型 |
---|---|---|
0 | 0 | stub区域 |
0 | 1 | NSSA区域 |
1 | 0 | 普通或者骨干区域 |
4. hello和dead时间
网络类型 | Hello时间 | dead时间 |
---|---|---|
NBMA | 30 | 120 |
P2MP | 30 | 120 |
P2P | 10 | 40 |
Broadcast | 10 | 40 |
虚链路 | 10 | 40 |
5. 认证
包含认证类型和认证密码
认证类型分为不认证(00)、明文认证(01)、MD5认证(02),OSPF的认证放在ospf头部。
如果一边接口认证,一边区域认证,可以认证成功。
接口认证由于区域认证。
6. 掩码长度
影响广播、NBMA,不影响P2P、P2MP和虚链路
MA网路中掩码必须一致,因为MA网络中所有路由器共用一个网段,只有一个2类LSA的Network来描述当前的网络拓扑和网络号,所以当掩码不一致时,无法通过一个2类LSA描述不同的掩码。
P2P网络中掩码之所以可以不一致是因为P2P中有1类LSA的stub类型来描述每一个网络的掩码信息,并且在P2P网络在NCP阶段,两台路由器会互推自己的IP地址,并且以32位主机路由的方式加入自己的路由表,所以P2P网络中建立邻居不需要掩码一致。
7. 网络类型
能不能建立邻居需要看hello报文时间与发送方式;能不能建立邻接需要看是否有DR和BDR
双方网络类型不一致,不能建立FULL的邻接关系,但如果修改hello、dead时间,可以建立full的邻居关系(除了NBMA这种网络类型,NBMA即使修改时间也无法和其他网络类型建立邻居关系,因为其收发hello报文都是单播),Broadcast与P2P、P2MP修改时间可以建立FULL的邻居关系,但不能计算路由,因为后两者没有DR,即不能交互2类LSA。只有P2P和P2MP之间通过修改hello和dead时间之后能够建立邻接关系
8. 其他
- MTU:只影响邻接建立,不影响邻居建立
- 在广播或NBMA网络中DR优先级不能为零,否则DR选举不成功
- 静默端口:silence接口,不收也不发ospf报文
- 接口地址未宣告
- ACL
- 链路层故障
- 版本不匹配
OSPF的环路场景
- 虚连接导致的环路场景
- 外部路由引入导致的环路场景
- 将R5的lo0引入进ospf区域,指定cost设置为100(外部路由,使用5类LSA泛洪)
- 在AR3上ISIS引入OSPF的路由,AR3通告给AR4,AR4通告给AR2,在AR2上比较路由的优先级(ospf的外部路由为150,ISIS的路由为15)后,选择ISIS的路由,出现了次优路径,即AR2访问AR5上的路由走的是AR2--AR4--AR3--AR1--AR5
- 为了解决次优路径,需要在AR2上将isis路由引入到ospf,此时出环了。因为ospf引入外部路由默认cost为1,那么AR1上想要访问AR5的lo0,(类型都是默认的OE2)优先选择cost小的AR2,接下来的路由是AR2--AR4--AR3--AR1,即形成环路
OSPF的防环机制
- SPF算法只能保证同一个区域内无环
即1类和2类LSA的防环
- 多区域场景下,非骨干区域必须和骨干区域互联
- 3类LSA的防环:
- 源于虚链路的3类LSA不会再通告回虚链路的所经过的区域
虚链路属于区域0且至少一端连接非骨干区域,相当于至少存在一个ABR
- ABR生成的3类LSA不会在通告回始发区域
水平分割原则
- 真ABRABR在骨干区域中存在活动的邻接关系从非骨干区域收到3类LSA,只接收不选路
- 源于虚链路的3类LSA不会再通告回虚链路的所经过的区域
- 4类LSA的防环:
ABR生成的4类LSA不会通告回5类LSA的来源区域即4类LSA的作用是通告ASBR的位置,给ASBR所在的区域通告4类LSA完全无意义
- 5类LSA的防环:
- 5类LSA在ospf域内泛洪时,没有区域边界的限制,所以3类的防环规则对5类LSA不适用,但5类LSA能否进入路由表并导致环路,依赖于3类和4类LSA
- 5类LSA有FA地址,FA地址有效时,选路使用的是3类LSA的路由信息,FA地址无效时则是依据4类LSA选路,因此只要3类和4类LSA不出现环路,那么5类LSA就不会出现环路
- MPLS VPN场景:
- 通过DN位防止3类LSA环路。不接收DN位置位的LSA
- 通过TAG防止5类LSA的环路。在TAG中包含BGP的AS号,如果在TAG中包含本地的AS号,5类LSA不接收
OSPF接入MPLS VPN之后的防环机制:内部路由up/down比特设置、外部路由利用TAG防环(CE双归属等)
DN比特位防环问题
在CE双归属场景中,PE1、PE2、PE3都已建立iBGP连接,PE和CE之间使用OSPF路由协议;
假设PE1先接收到来自PE3的VPNv4路由,PE1会将BGP路由引入到左侧站点的OSPF区域,PE2从OSPF中学习到该路由,下一跳指向CE1;
PE上做了双向引入,所以PE2会将该OSPF路由引入到BGP形成VPNv4路由,同时将该路由通告给PE1;
这时PE1从PE2和PE3接收到了同一条VPN路由,在链路开销相同的情况下,假设PE2的RouterID小于PE3的Router-ID,那么PE1会优选PE2为下一跳,环路就产生了。
- 通过DN比特位防环
3/5/7类LSA的Option字段中DN比特位,用于表明路由是由PE向CE方向传递的;
PE发布给CE的路由(3/5/7类LSA)中DN比特位会被置1,同一用户站点的其他PE收到带有DN比特位置位的3/5/7类LSA时,不会进行SPF计算,更不会将其引入到BGP中;
RFC定义的DN比特位只会出现在3类LSA,但是华为在5/7类LSA中也设置了DN比特位
- DN位无法避免某些特定场景下的环路问题
CE双归属,CE1连接PE1的链路在Area0中,CE1连接PE2的链路在Area1中;
当PE1以3类LSA的形式向CE1发送OSPF路由时DN比特位置1,由于CE是ABR,当这条3类LSA经过CE再传递到Area1时,DN比特位置0,PE2接收后仍然会计算该路由,造成环路;
【防环策略】:
在华为设备中,5/7类LSA除了可以像3类LSA一样通过DN比特位来防环外,还可以通过Route-tag来防环;
设置了Route-tag的PE路由器将OSPF外部路由发布给CE之前会使路由带上Route-tag;如果同一站点的其他PE路由器收到该OSPF外部路由时发现路由携带的Route-tag跟本端配置的一样,就会忽略该路由;可以通过Route-tag命令来设置路由域标记。
OSPF无效路由场景
- 网络类型不一致导致的无效路由。一端是点到点网络类型,另一端是广播网类型
- 帧中继的hub-and-spoke场景,如果hub端不是DR会造成有LSA但是没有路由
- 真ABR非骨干区域中收到的3类LSA只接收不选路,即没有路由
- ABR通过虚链路接收到的3类LSA在虚链路的所经过的区域中不存在,3类LSA只接收不选路,即没有路由
参考虚链路特点7
- 5类LSA中FA地址所在网段域内或者域间不可达,会造成有5类LSA但没有路由
- 通过filter-policy import做路由过滤,有LSA但是没有路由
OSPF快速收敛机制
- OSPF按优先级收敛
在大量路由情况下,通过对不同的路由配置不同的收敛优先级,使重要的路由先收敛。 - I-SPF
增强型的SPF算法,当网络拓扑改变时,只对受影响的节点进行路由计算 - PRC
部分路由计算(只针对3、5、7类LSA有效果),当网络上路由发生变化时,只对发生变化的路由进行重新计算ospf中通告路由的LSA包含1、3、5、7类。在部署时,环回口的地址一般不使用network的方式,而使用import-route的方式,即保证接口down之后不去触发SPF,而是触发PRC,从而加速收敛
- 智能定时器
使用指数退避算法,包含3个计时器:初始延迟、增量延迟、最大延迟
通过智能定时器来控制路由计算的延迟时间(OSPF规定的延迟时间时固定的),既能对低频率变化快速响应,又能对高频率变化进行有效抑制。 - Smart-discover
路由器会周期性地(5秒)发送Hello报文,这种按固定周期发送报文的方式减缓了OSPF邻居关系的建立。
在以下场景中,使能了Smart-discover特性的接口不需要等待Hello Timer到时,可以主动向邻居发送Hello报文:- 当邻居状态首次到达2-way状态
- 当邻居状态从2-way或更高状态迁移到Init状态
补充
DR和BDR的作用
- 减少邻接关系的数量,从而减少链路状态信息以及路由信息的交换次数,这样可以节省带宽,减少路由器硬件的负担。
- 一个既不是DR也不是BDR的路由器只与DR和BDR形成邻接关系并交换链路状态信息以及路由信息,这样就大大减少了大型广播型网络和NBMA网络中的邻接关系数量
DR和BDR的选举
两端同时进入2-way,开始选举
- 首先所有的路由器都会变成DR Others,检查Hello报文中的DR字段和BDR字段是否为空,如果都为空(意味着没有DR和BDR),会首先选举出BDR,选举规则:比较优先级,越大越优(默认为1,取置范围为0-255,
0表示不参与选举,停留在2-way状态
);如果相同,比较Router ID,越大越优;BDR选举出后,会自动升级为DR,然后重新选举BDR,规则和之前一样 - 如果DR字段为空,BDR不为空,则BDR升级为DR,重新再选举出BDR;如果BDR为空,DR不为空,重新选举出BDR
DR选举成功后会生成一个2类LSA在本区域内泛洪,BDR不会产生;如果DR失效,BDR切换成BDR时也会生成
如果同一个网段中只有唯一的一台设备通告自己为DR或者BDR,则通告者为DR或者BDR,DR或者BDR角色不抢占
DR是必须的而BDR可以没有;在同一个网段中只能存在一个DR和一个BDR,如果在同一个网络中存在多个DR和BDR需要进行抢占,重新选举
OSPF特点
OSPF,Open Shortest Path First,开放最短路径优先
- 收敛速度快(比较耗资源)
- 无类路由协议,支持CIDR(无类域间路由)和VLSM(可变长子网掩码)
- OSPF支持负载均衡
- 支持区域划分
- 支持协议报文的认证(明文和密文)
- 支持触发更新(不仅防环,还能更快的收敛)
- OSPF的路由优先级分内外,内部路由优先级为10,外部路由优先级为150
- OSPF的度量值采用开销cost作为标准
- OSPF是没有环路的协议,但仅限于一个区域内,在一个区域内是绝对无环的,基于算法的天然无环。OSPF在区域内是链路状态协议,在区域间是距离矢量协议。
- OSPF要维护3张表:邻居表、拓扑表、路由表【配置好OSPF之后,设备之间先泛洪LSA构建邻居表,相互交换信息之后构建数据库LSDB,运行SPF算法形成路由表】
- 使用IP组播收发协议数据(组播地址:224.0.0.5AllSPFRouters,即所有开启ospf的设备都会监听此地址和224.0.0.6AllDRouters,所有的指定路由器,即DR和BDR会监听)
- OSPF为了确保链路状态数据库的同步,每1800秒(30分钟)更新一次
路由计算过程
- 建立邻居关系后泛洪LSA
- SPF算法计算最短路径树
- 计算路由形成路由表
OSPF设备角色和宣告
路由器分类
- 内部路由器(IR):内部路由器是指所有所连接的网段都在一个区域的路由器,属于同一个区域的IR维护相同的LSDB
- 区域边界路由器(ABR):区域边界路由器是指连接到多个区域的路由器,ABR为每一个所连接的区域维护一个LSDB,连接骨干区域和非骨干区域的设备
区分真假ABR的场景:真ABR从非骨干区域收到的3类LSA只接收(更新LSDB)、不选路(即不加入路由表)【因为真ABR是发送3类LSA的,如果接收后再选路可能会出现环路】;假ABR即接收又选路
- 假ABR:连接多个区域,并且有一个口宣告进了骨干区域
- 真ABR:满足假ABR的条件后,还需要在骨干区域中有一个活动的邻接关系
- 骨干路由器(BR):骨干路由器是指至少有一个端口(或者虚连接)连接到骨干区域的路由器,包括所有的ABR和所有端口都在骨干区域的路由器
- AS边界路由器ASBR:和其他AS中的路由器交换路由信息的路由器,这种路由器向整个AS通告AS外部路由信息。
ABSR一般是位于非OSPF区域和OSPF区域间互联的路由器,而ABR是OSPF多个区域连接区域0间的路由器
接口宣告方式
- 进程下通过network方式宣告
进程下network宣告时将所有符合条件的接口全部宣告进ospf,宣告格式为network 前缀 通配符
,例如network 192.168.1.0 0.0.0.255
宣告的是192.168.1.0/24这个网段内所有有效地址【ACL的反掩码中的1可以不连续,但是ospf中必须连续】 - 接口下宣告
严格宣告,只能将该接口宣告进ospf。如果存在大量接口的情况下会增加工作量。
【接口方式的选择】:如果地址不连续的情况下进行严格宣告(在接口下宣告),如果IP地址连续使用进程宣告方式
【宣告的作用】:1. 宣告的接口可以发送和接收ospf报文;2. 通告接口路由
Router ID如何产生?
- 手工指定
可在ospf进程下或者全局下配置,进程由于全局 - 自动选举
比较逻辑接口,选择地址最大的一个;如果没有逻辑接口,比较活动的物理接口IP,选择地址最大的。
如果修改RouterID,不会立即生效,需要重启OSPF进程;多ospf进程可以共用一个Router ID,但是这样会存在问题,如下:
RA运行ospf进程1和2,但是Router ID全部为1.1.1.1,RB运行ospf进程1,Router ID为2.2.2.2,会导致路由震荡,原因参考《影响OSPF邻接关系建立的因素》中的Router ID
接口状态机
Waiting和2-way有什么关联?
- waiting状态是接口状态机,是开始等待选举DR,设备正在判定网络上的DR和BDR
- 2-way状态开始选举DR和BDR
虚连接(虚链路)
特点
- 虚链路永远属于区域0
虚链路端点都将成为ABR并在区域间传递路由,可以执行聚合/区域间路由过滤
- 虚链路的始发区域永远是区域0,否则没有意义
- 虚链路通过单播的方式发送报文,即TTL=255
- 虚链路必须配置在两台ABR路由器之间
- 虚链路只能配置在普通区域中,不能配置在特殊区域中
即传送区域不能是一个末梢区域
- 虚链路的稳定性取决于其经过的区域的稳定性
- 虚链路的本质:虚链路就是通过非骨干区域打一条通道直接连接骨干区域,即通过一个非骨干区域连接一个区域(或者分段)到骨干区域
- 虚链路只能在同一区域内建立,不能跨区域建立
虚链路只能穿越一个区域,隧道可以穿越多个区域,虚链路需要有到达对方的路由
- 虚链路属于按需链路,需要将option字段中的DC位置位【但是华为是通过点到点的方式来维护的,不属于按需链路】
- 虚链路配置时需要指定邻居的RouterID,通过两次SPF算法确定目标地址和源地址,建立单播连接
- ABR通过虚链路学到的路由,虚链路所经过的区域也应该有此路由条目,否则为无效路由
如下图中路由1.1.1.1/32。在AR2上将去往AR3的1.1.1.1/32的lsa过滤掉,那个AR3上不存在1.1.1.1/32这个路由条目,又因为虚链路的所经过区域为区域1,所以AR4上没有1.1.1.1/32的路由。即使会有,那么AR4发给AR3也会出现路由黑洞,因为虚链路的流量最终也是通过物理链路转发的
- 虚链路的区域不存在区域0的汇总路由
即在所经过的区域内不能对区域0的路由进行汇总,和第7点原理相似,路由聚合之后就没有了路由明细
如果R2上聚合后产生3类LSA(包含路由10.0.0.0/8),R4上聚合后产生3类LSA (包含路由10.1.0.0/16), R3收到R2和R4通告的3类LSA后,R3上10.0.0.0/8路由下一跳指向R2,而10.1.0.0/16 路由下一跳指向R4,若R3收到访问10.1.3.1的数据包,R3路由报文到R4,R4上有虚链路,即R4路由表中有到达区域0中10.1.1.0/24、10.1.2.0/24、10.1.3.0/24的路由且下一跳R3,R4会送流量到R3,R3会送流量到R4,路由环路出现。
虚连接的远端地址:
虚连接的两个端点需要相互交换协议报文,但是虚连接的邻居是用RouterID来标识的,不能作为协议报文的目的IP地址。每个虚连接的端点都要计算两个最短路径树,一个是本地最短路径树,另一个是虚连接邻居的最短路径树。计算虚连接邻居的最短路径树之后,在最短路径树上查找如何到达本地路由器(通过RouterID来标识),虚连接邻居到达本地路由器的出端口的IP地址为本地路由器发送给虚连接邻居的报文目的IP地址。
好处
- 可以解决网络设计缺陷
- 可以当做后门链路使用,避免次优路径
缺点
- 不能针对来自于区域0的路由条目做汇总
- RID冲突或者修改RID会造成虚链路不稳定
- 会引发环路的问题
场景一:
为了实现区域2方位区域0,需要在AR1和AR4之间做虚链路。AR4向区域1通告一条3类LSA(5.5.5.5)给AR1【AR4也会给AR3通告一条3类LSA,但是AR3接收后不选路】,AR1会将这条3类LSA传递给AR3,所以AR3访问5.5.5.5走的是AR3--AR2--AR1--AR4--AR5【但物理链路是AR3--AR2--AR1--AR3】,因为做了虚连接,AR1想要访问5.5.5.5,必须走AR4,但是去往AR4,物理上必须经过AR3,但是到了AR3以后,AR3去往5.5.5.5,则把流量又转发到AR2,结果出环。
虚连接防环
- 不能将骨干区域的汇总发布到虚链路穿越的区域
- 虚连接所传递的1类LSA不会再传递回虚连接所经过的区域
- 源于虚连接的3类LSA不会再通告回虚连接所经过的区域
- 虚连接无法在所经过区域对区域0的路由汇总
应用场景
- 解决非骨干区域没有连接到骨干区域的问题
- 不能在AR3和AR4之间创建虚链路,因为这相当于将区域0分割了,即AR1/2之间和AR3/4上都配置了区域0
- 在AR2/3上创建虚连接相当于区域0被延伸,即AR1/2/3都属于区域0
- AR3上会收到来自AR1的1类和3类(只接受不计算)LSA
- AR1上的路由会通过3类LSA通告给哪些区域:只有区域2,因为区域1是这条3类LSA的所经过区域
- 解决骨干区域被分割的问题
- AR2和AR3是真ABR,只接受3类LSA但不计算路由,导致AR1和AR4不能互访
- 在AR2和AR3上创建虚链路,相当于AR2和AR3通过虚链路加入区域0,AR1用1类LSA通告给AR3(AR4会将1类LSA通告给AR2),然后AR3会通告给AR4【在AR3上通过计算1类和2类LSA,不再计算3类LSA,实现AR4和AR1互通】
通过虚链路收到路由条目 而 产生的3类LSA,不会再通告回虚链路的所进过区域
- 解决没有骨干区域的场景(可以建立虚连接充当骨干区域,即虚连接相当于骨干区域,只有华为设备可以,思科设备不支持)
- AR25针对区域1生成的3类LSA会通告给区域0和区域2;AR25针对区域2生成的3类LSA会通告给区域1
- AR26针对区域3生成的3类LSA会通告给区域0和区域2;AR26针对区域2生成的3类LSA会通告给区域3
- 保障骨干区域的健壮性(预防骨干区域被分割或者ABR只接受三类LSA不选路的问题)
- 解决次优路径问题(域内3类LSA优先级低于1类LSA,即内部OSPF优先级(AR19)>外部OSPF优先级(AR18))
- 场景是AR21访问AR15的10.10.10.10。做虚连接之前,AR21上针对10.10.10.10的LSA有两条,一是区域0中从右边链路通告下来的1类LSA,二是由AR18转换成3类LSA通告给AR20的,所以AR21走1类LSA的路由,即走右边
- 做虚连接之后,从AR16传给AR18的1类LSA,AR18也会传给AR20,这样AR20会收到关于10.10.10.10的两条1类LSA,然后cost越小越好,选择左边
SPF计算过程的两个阶段
只在一个区域内计算,即只涉及到1类和2类LSA
- 计算transit和p2p节点,忽略stub节点,生成一个最短路径树,即构建SPF树。依据Router-LSA和Network-LSA。
- 只计算stub节点,将stub网段挂到最短路径树上去,即计算最优路由。依据SPF树干和Router-LSA、Network-LSA中的路由信息
特殊区域
1. Stub
- 配置stub区域的目的:减少LSA的数量,即减少stub区域内部路由器上lsdb的规模和内存需求,从而避免资源的浪费,同时可以更好的控制LSA的传递和区域的管理(主要用于连接客户端的区域或者性能比较低的设备)
- 将区域设置为末节区域,需要在末节区域的所有设备上配置
stub
命令 - 末节区域会过滤五类LSA(四类LSA也会被过滤掉),ABR会向该区域下放一条默认路由(三类LSA),使其能够正常访问外部路由
- 无法配置外部路由(即便强行配置也无法配置上去)
2. Totally Stub
- 只需要在ABR上配置,区域内其他设备配置为末节区域即可
- 完全末节区域不仅会过滤掉四类和五类LSA,也会过滤掉三类LSA(通过ABR过滤的),同时ABR会向该区域下放一条默认路由(三类LSA),使其能够正常访问外部路由(一共有三类LSA:一类、二类和下放路由使用的三类)
Stub和Totally Stub的一些条件(特点)
- 建议该区域只能有一个出口,即只有一个ABR
- 虚连接不能跨越Stub区域(因为虚连接永远属于区域0)
- Stub区域不能有ASBR(访问外部路由是通过ABR生成的3类LSA通告的默认路由)
- 不能将骨干区域配置为Stub区域
- Stub区域发送的Hello报文中的E比特位会置0
- totally stub区域不接收3和5类,只需要在ABR上配置
3. NSSA
- 产生背景:OSPF规定Stub区域不能引入外部路由,这样可以避免大量外部路由对Stub区域路由器带宽和存储资源的消耗。对于既需要引入外部路由又要避免外部路由带来的资源消耗的场景,stub区域就不在满足需求,因此产生了NSSA区域
- 将区域设置为NSSA区域,需要在末节区域的所有设备上配置
nssa
命令 - NSSA区域会过滤五类LSA(四类LSA也会被过滤掉),同时引进七类LSA(即NSSA-LSA,是由五类LSA转换而成),同时ABR会向该区域下放一条默认路由(七类LSA)
- 七类LSA的优先级:ON1(类似OE1)和ON2(类似OE2)
- FA地址:对于五类LSA是可选项,但是七类LSA是必选项
- 在五类LSA中,FA地址只有满足那三个条件才会携带,携带的是下一条的地址
- 在七类LSA中,如果满足5类LSA的3大条件,FA地址是ASBR上外部路由的下一跳地址;如果没有将引入外部路由下一跳地址所在网段宣告进OSPF,则优选宣告进ospf的逻辑接口IP地址最大的一个;如果没有逻辑接口宣告进OSPF,则优选宣告进ospf中活动的物理接口地址较大的一个
4. Totally NSSA
- 只需要在ABR上设置,区域内其他路由设备设置为naas即可
- 过滤掉三类、四类和五类LSA,同时引入外部路由作为七类LSA存在,同时ABR会向该区域通告两条默认路由:一个是三类sum-net(优先级高),一个是七类nssa
Nssa和Totally Nssa的特点
- nssa区域可以包含ASBR,引入外部路由。为了实现可以过滤5类LSA的目的,会将引入的外部路由以7类LSA的方式来通告,7类LSA的传递范围是在NSSA区域内
- 在nssa区域中,ABR会以7类LSA通告一条默认路由
- 在totally nssa区域中,ABR会以3类和7类LSA各通告一条默认路由
LSA在各区域中传播的支持情况
区域类型 | Stub | TotallyStub | NSSA | TotallyNSSA | 普通区域(包含骨干和非骨干) |
---|---|---|---|---|---|
区域中LSA类型 | 1/2/3。ABR产生默认3类(0.0.0.0) | 1/2。ABR产生默认3类(0.0.0.0) | 1/2/3/7。ABR(ASBR)产生默认7类(0.0.0.0) | 1/2/7。ABR(ASBR)产生默认3类(0.0.0.0)和默认7类(0.0.0.0) | 1/2/3/4/5 |
ABR/ASBR | 不允许ASBR | 不允许ASBR | 允许部署ABR/ASBR | 允许部署ABR/ASBR | 允许部署ABR和ASBR |
OSPF通告默认路由的方式
- 普通区域:
通过default-route-advertise
命令通告默认路由:- 追加always参数后,如果本地不存在默认路由,则生成一条5类LSA通告默认路由。
- 不追加always参数,只有在本地存在一条除了OSPF以外其它协议通告的默认路由,才可以生成一条默认路由
- 特殊区域
- Stub区域和Totally Stub区域:由ABR设备生成3类LSA通告默认路由
- Nssa区域:通过
nssa default-route-advertise
命令通告一条7类的默认路由,但是在NSSA区域中没有always参数,说明在NSSA区域中必须在存在一条除了ospf以外其它协议通告默认路由的前提下,才能通告一条默认 - Totally Nssa区域:ABR会下放两条缺省的默认路由,分别是3类和7类LSA,3类LSA优先级更高
OSPF的聚合(汇总)和过滤
- 路由聚合
只能在ABR和ASBR上进行路由汇总,汇总之后,非本区域设备无法看到相应的明细路由
- 区域间路由汇总(ABR聚合):在ABR上完成,聚合AS内区域之间的路由,以网段为单位生成3类LSA。需要汇总的网段所在的OSPF区域中进行配置
- 外部路由聚合(ASBR聚合):在ASBR上完成,聚合OSPF引入的外部路由,对引入的聚合地址范围内的5类LSA进行聚合。在OSPF进程下配置
当配置了NSSA区域时,还要对引入的聚合地址范围内的7类LSA进行聚合,如果本地设备既是ASBR又是ABR,则对由7转5的LSA进行聚合处理
路由聚合后的cost值选择聚合之前最小值
- 路由过滤
OSPF可以使用路由策略route-policy、访问控制列表(access-list)和地址前缀列表(prefix-list)对路由信息进行过滤,OSPF路由过滤可以应用于以下几个方面:- 路由引入
OSPF可以引入其它路由协议学习到的路由,在引入时可以通过配置路由策略来过滤路由,只引入满足条件的路由。 - 引入路由发布
OSPF引入了路由后会向其它邻居发布引入的路由信息,可以通过配置过滤规则来过滤向邻居发布的路由信息,该过滤规则只在ASBR上配置才有效。
例如:在ASBR上通过filter-policy做export方向过滤,针对从路由表中重分发进OSPF的路由条目做过滤 - 路由学习
通过配置过滤规则,可以设置OSPF对接收到的区域内、区域间和自治系统外部的路由进行过滤。该过滤只作用于路由表项的添加与否,即只有通过过滤的路由才被添加到本地路由表中,但所有的路由仍可以在OSPF路由表中被发布出去。
例如:可以在所有设备上使用filter-policy做import方向过滤,只能过滤从OSPF加入到RIB路由表的路由条目,不能过滤入方向LSA,但是会影响3类LSA等发布。例如在ABR上的入方向配置此过滤,虽然不能影响接收LSA,但是会ABR的3类LSA的发布,因为此路由没有加入路由表,也就是说明这条路由无效,那么肯定不会发布包含此条路由的3类LSA。 - 区域间LSA学习
可以在所有设备上使用filter-policy做import方向过滤,只能过滤从OSPF加入到RIB路由表的路由条目,不能过滤LSA。如果该方法在普通设备上,只影响本地;如果在ABR上配置。还会影响其他设备,主要是通过影响3类LSA导致路由无法传递。
区域间LSA学习和路由学习之间的差异:区域间LSA学习直接对进入区域的LSA进行过滤;路由学习不是对LSA进行过滤而是对LSA计算出来的路由是否添加本地路由表进行过滤,学习到的LSA是完整的。 - 区域间LSA发布
在ABR上配置路由汇总不通告(即携带参数not-advertise
)或者使用filter命令过滤3类LSA,或者在所有设备的接口上配置ospf filter-lsa-out命令过滤接口上发送的3类、5类、7类
- 路由引入
OSPF的时间
1. LSRefreshTime(LSA定时刷新时间)
1800秒
为确保数据库的准确性,OSPF每隔30分钟对每条LSA记录刷新一次,每刷新一次序列号加1。
收到新的LSA后,LSA将重置计时器,又重新计算时间。如果1小时内,未被刷新,LSA将从数据库中删除。
有时序列号需要循环回最初的值,在这种情况下,LSA提前作废,(最大寿命定时器立即被设置 为1 )并被删除。然后,LSA重新使用序列号0X800001。
2. MaxAge(LSA老化时间)
3600秒
OSPF每隔1800s定时刷新一次LSA,如果LSA在3600s内未被刷新,LSA将从数据库中删除,即老化掉。
3. RxmtInterval(邻接重传LSA的间隔时间)
5秒
没有得到确认的情况下,重传OSPF packet所等待的时间长度,默认为5秒。
4. Hello相关的时间
- HelloInterval(发送Hello包的时间间隔):10s/30s
路由器接口上发送Hello包的时间间隔。 - RouterDeadInterval(未收到Hello后关闭Router的时间):40s/120s
如果在4倍于HelloInterval间隔里(40秒和120秒内)仍然没有收到来自邻居的新的Hello包,这个邻居将被宣告为无效(dead)。
5. WaitTimer(DR的选举等待时间):
40秒
先启动OSPF进程的路由器会等待一段时间,这个时间内没有启动其它路由的OSPF进程的话,第一台路由就认为自己是DR,之后再加进来的也不能在选举了,这个等待时间叫做WaitTimer计时器。
追问
one-way 是什么状态,如何进入 two-way
当收到一个Hello 包中,没有包含自己的router id时为one-way,当收到的HELLO包中包含自己的 router id则为two-way
DR的选举过程及时间
首先所有的路由器都会成为DR others,先选举BDR,BDR发现没有DR,自动成为DR,DR others发现没有BDR,再选举出来一个BDR。
DR的选举时间等于40秒(WaitingTimer),不可更改,只有在广播和NBMA中才会选举DR。
first DBD与DBD的区别
firstDD也称为空DD,作用是选举出主从,并且统一1个序列号,保证数据库同步过程的有序可靠
如何选举主从,选举主从的作用
选择router id大的为主,作用是统一接下来交互的DD报文序列号,保证同步数据库同步的有序可靠
OSPF协议的可靠性如何保证?
利用OSPF协议的显示确认(LSAck)和隐式确认机制(Hello、DBD、LSR+LSU)
邻居建立过程中,Hello报文回复对方时会携带对方的Router ID;
DBD报文选举主从后,只有主才能产生序列号,从会确认主的序列号;
发送LSR之后对方回应LSU,如果没有收到LSU,需要重传LSR(5秒钟)。
Retransmit Timer=5秒,这只针对DBD、LSR和LSU,hello和LSAck是没有重传机制的
Transmit Delay=1秒,转发延时,只用于LSA
除了LSA的确认机制外,针对发送的LSU还有没有其它确认机制
DR可以进行隐式确认,当DR收到DR others的LSU时,不需要回复LSACK,因为DR会向其他的DR others发送LSU的更新,这就进行了隐式确认DR others向DR发送更新为224.0.0.6,DR向DR others发送的更新地址为224.0.0.5
ospf协议为什么先进行BDR选举,然后才是DR
因为DR和BDR的切换状态机是:当DR失效时,BDR成为DR。
如果先选举DR,再选举BDR,那么当选举BDR的过程中DR失效,那么此时网络中既没有DR也没有BDR,切换将无法进行,状态机也就没办法做了。所以,先有BDR,后有DR是为了保证状态机能工作。
Hello报文中的DR和BDR字段为什么是接口地址而不是RouterID
DBD、LSR和LSU是可以通过单播方式发送的,单播报文需要的是DR others与DR或者BDR相连 的 DR或者BDR接口的IP(单播报文的目的地址),而通过RouterID是无法作为单播报文的目的地址的
收到LSA之后的处理流程
- 先查看本地是否是否存在此LSA
- 不存在:添加到数据库->回复LSAck->泛洪该LSA->使用SPF算法计算路由
- 存在:比较LSA的新旧
1. 新:添加到数据库->回复LSAck->泛洪该LSA->使用SPF算法计算路由
2. 旧:忽略该条LSA,发送本地更新的LSU给发送(LSA)方
3. 相同:忽略
OSPF路由的优先级
首先比较路由类型:O(一类和二类) > OIA(三类) > OE1=ON1(比较cost) > OE2=ON2(比较cost)【五类和七类的优先级相同,即华为不区分五类和七类LSA】
如果路由类型相同的情况下再比较cost值。
5类LSA为什么需要FA地址?
为了防止次优路径和环路
1. 次优路径
AR1/2/3通过交换机互联,只在AR1/2之间运行OSPF,在AR2上引入外部路由AR3的3.3.3.3。
AR2是ASBR,然后在区域内泛洪5类LSA,那么AR1想要访问AR3,如果没有FA地址的情况下,则路由为AR1--AR2--AR3,很明显这是次优路径。
如果存在FA地址,那么AR1收到5类LSA之后,只会计算到达FA地址(AR3物理接口地址)的距离矢量,那么路由为AR1--AR3,不需要经过ASBR(AR2)的转发。
2. 环路
在R1上引入外部路由1.1.1.0/24,默认为类型2,默认cost为1(即外部cost)
有FA地址的情况:R4访问1.1.1.0/24的路径为R4--R2--R1
没有FA地址的情况:R4访问1.1.1.0/24的路径为R4--R3--R2--R4(环路)
分析步骤如下:
默认情况下进行7转5选择的是RouterID较大的ABR,在此拓扑中为AR3(即AR3为ASBR),则NSSA区域内7类LSA的转发路径为R1--R2--R3。
如果正常携带FA地址,R3转换成的5类LSA携带正常的FA地址,那么R4收到5类LSA时,同时会通告给R2,R4会计算到达FA地址的cost(10+1),优选R1。
如果7类LSA不携带FA地址或者将7转5抑制掉,R2收到之后发现7类LSA中没有LSA,那么只计算到大ASBR的距离,通过5类(R4传给R2的5类LSA)到大ASBR的内部cost为2,通过7类到达ASBR的内部cost为10,所以优选5类LSA,即下一跳为R4。AR2访问1.1.1.0/24的路径为AR2--AR4--AR3--AR2--AR4,因此成环。
外部路由选路问题
在AR2和AR3上将rip路由引入OSPF,分以下场景
- 引入时不配置路由类型(默认为OE2)、不指定cost值(默认cost值为1),则在AR4上选路时会进行负载。
- 在AR2上指定cost值为2,AR3上指定cost值为1,路由类型都是默认的OE2,则AR4会选择AR3。
- 在AR2上指定路由类型为OE1(cost=2),AR3上为默认的OE2(cost=1),则AR4会选择AR2。
- 在AR2/3上指定路由类型为OE1,AR2的cost为2,AR3的cost为1,则AR4会选择AR3。
- 在AR2/3引入时保持默认,即路由类型为OE2,cost=1,将AR4的g0/0/1(与AR2相连)的cost改为10,g0/0/0(与AR3相连)的cost改为20,则AR4优选AR2
OE2在外部cost相同时比较内部cost
- 如果在5的基础上将AR2引入时的cost值改为2,则AR4优先AR3
先比较外部cost
- 在6的基础上将AR3引入的cost改为10、类型为OE1(AR2上cost=2,OE2,内部cost10;AR3上cost为10,OE1,内部cost20),AR4优选AR3
首先比较路由类型OE1>OE2
- AR2和AR3上均为OE2、cost=1、内部cost=10,现在将AR2的g0/0/0宣告进ospf,则AR4优选AR3
AR2在通告的5类LSA中会携带FA地址,FA地址为引入外部路由下一跳地址,即AR1的g0/0/0接口地址,那么AR4计算到达FA地址的距离10+1=11;而AR3通告的5类LSA没有FA地址,那么只计算到达AR3的距离10,所以会优选AR3
引入12.1.1.0/24和12.1.1.0/30两条外部路由,会通告几条5类LSA?
两条。
通过判断头部type、ADV和LS ID来判断是否为同一条LSA,这两条5类LSA,通告12.1.1.0/24的前缀仍然为12.1.1.0,但是通告12.1.1.0/30的前缀变为12.1.1.3,即本网段的广播地址,然后通过5类LSA中的网络掩码来恢复地址,即如果出现LSID冲突,会使用本网段的广播地址来替代网络前缀来通告本网段。
不同进程下学到同一条路由(类别和开销都相同)
路由表中会进行负载。如果ASBR1引入时路由类型为OE1,ASBR2引入时为OE2,也是负载,因为不同进程下是不会进行路由类型比较的,由路由表决定,先比较优先级,再比较cost值。R1会从2个进程收到同一条路由,每个进程下各自选路装进路由表,等同于两个路由协议之间选择哪条路由进入路由表,决定权在路由表。
如何减小ospf的lsdb的大小
- 分区域设计:1类和2类LSA只在本区域泛洪,分区域后可以减少每个区域1类和2类LSA的数量
- 特殊区域:特殊区域无法传递5类,可以减少ospf域中5类LSA的数量
- 过滤的方式有三种:
- filter命令过滤3类LSA,在区域下使用,可以在 import和export方向
- filter lsa out命令过滤3类、5类、7类或者全部LSA
- filter-policy,在ospf执行了SPF计算后,对加入路由表的路由进行过滤
- 汇总:summary+not-advertise,汇总也可以执行过滤。需要注意做了虚链路的区域不能针对区域0的路由进行汇总,否则可能会产生环路
- 2类LSA也可以减小ospf的LSDB,但这不属于我们控制范围
OSPF的路由选路原则以及负载的场景
- 选路原则:区域内>区域间>区域外(类型1>类型2
(默认外部路由类型)
) - 外部路由选路:
类型1(cost为内外之和)>类型2(cost内外分离,先看外再看内)
1. 类型1:cost越小越优 > 优选非骨干 > 区域号越大越优
2. 类型2:外部cost越小越优 > 内部cost越小越优 > 优选非骨干 > 区域号越大越优
外部路由负载条件:cost和区域一致
举例:R4与R5上分别引入外部路由,问R1如何去往这两条外部路由
- 分析4.4.4.4/32外部路由:
R4引入这条外部路由,会在区域0和区域1均发布一条5类LSA但不会发布4类LSA,R1也可以在区域0和区域1收到5类LSA,对于该路由ASBR是R4,R1可以通过区域内路径到达,此时有两条区域内路径,R1按如下顺序优选:默认为类型2且外部cost一样,首先选择内部cost值较小的,其次优选非骨干,如果以上均相等,则负载分担。经过比较优选R3。 - 分析5.5.5.5/32这条路由:
R4收到R5发布的5类LSA会向区域0和区域1转发,同时产生一条4类LSA,该4类LSA会向区域0和区域1泛洪。R1在收到5类LSA之后需要根据4类LSA计算路径,R1可以收到两条4类LSA,分别通过区域0和区域1,由于R1自己也是ABR,它不会使用从非骨干区域(此时是区域1)接收到的3类和4类LSA做选路即4类的防环机制:真ABR对从非骨干区域接收到额3类和4类LSA,只接收不选路
,这是OSPF防环设计决定的,因此R1优选R2为下一跳。
外部路由选路原则详解
RFC1583与RFC2328是针对外部路由由不同选优方式:
X(内部开销)=内部设备到转发地址(FA)的开销(FA为0时,X为到ASBR的开销)
Y(外部开销)=外部路由重分发进来时LSA携带的开销值
RFC2328与RFC1583总结:
- 对于外部路由,type1优于type2
- 如果只是type1选优
- RFC1583优选X+Y最小的,X+Y相等则负载,只比较X+Y,不单独比较X大小或者Y大小
- RFC2328先比较X的区域,非骨干优先,其次再比较X+Y
即非骨干优先,X+Y越小越优
- 如果只是type2选优
- RFC1583优选Y最小,如果Y相等,则比对X,优先X最小,X也相等则负载
- RFC2328先比较X的区域,非骨干优先,再根据RFC1583比对,如果通过RFC1583对比结果是多条都是最小开销,则选择学习到的这些LSA的区域里AreaID最大的
即非骨干优先,外部开销越小越优,内部开销越小越优,区域ID越大越优
- 如果只是type1选优
X的区域比较只当前路由器去往转发地址(FA)的路由(如果FA=0,则是去往ASBR的路由)是否经过骨干区域,而无关ASBR是否在骨干区域
正常场景(默认OE2)
下面场景可以按照cost最小考虑,即忽略非骨干优先
非正常场景,需要验证(默认OE2)
OSPFv2和v3的异同点
相同点
- 网络类型和接口类型
- 接口状态机和邻居状态机
- 链路状态数据库
- 泛洪机制
- 相同类型的报文:Hello报文、DBD报文、LSR报文、LSU报文和 LSAck报文
- 路由计算基本相同
不同点
- v3基于链路,而不是网段
v3运行在IPv6协议上,IPv6是基于链路而不是基于网段的。
在配置v3时,不需要考虑是否配置在同一网段,只要在同一链路,就可以不配置IPv6全局地址而直接建立联系 - v3上移除了IP地址的意义
v3上移除了IP地址的意义,1类和2类LSA中不再有网络信息,这样做的目的是为了使“拓扑与地址分离”。
v3可以不依赖IPv6全局地址的配置来计算OSPFv3的拓扑,IPv6全局地址仅用于虚连接接口 - v3的报文及LSA格式发生改变
v3报文不包含IP地址,v3的1类和2类LSA里不包含IP地址,IP地址部分由新增的两类LSA(Type8: Link-LSA;Type9: Intra-Area-Prefix-LSA)宣告。
v3的Router ID、Area ID和LSA Link State ID不再表示IP地址,但仍保留IPv4地址格式。
广播、NBMA及P2MP网络中,邻居不再由IP地址标识,只由RouterID标识 - v3的LSA报文里添加LSA的洪泛范围
v3在LSA报文头的LSA Type里,添加LSA的洪泛范围,这使得v3的路由器更加灵活,可以处理不能识别的LSA,v3可以存储或泛洪不识别的报文,而v2只丢弃不识别的报文。
v3允许洪泛范围为区域或链路本地,并且设置U位(报文可按泛洪范围为链路本地来处理)的不识别报文存储或通过stub区域。
例如,R1和R2都可识别某类LSA,它们之间通过R3连接,但R3不识别该类LSA,当R1洪泛此类 LSA时,R3虽然不识别,但还是可以洪泛给R2,R2收到后继续处理 - v3支持一个链路上多个进程
一个v2物理接口,只能和一个v2实例绑定,但是一个v3的物理接口,可以和多个v3实例绑定,使用不同的实例ID进行区分。
这些运行在同一条物理链路上的多个v3实例,分别与链路对端设备建立邻居及发送报文,且互不干扰,充分共享同一链路资源。 - v3利用IPv6链路本地地址
IPv6使用链路本地地址在同一链路上发现邻居及自动配置等。运行IPv6的路由器不转发目的地址为链路本地地址的IPv6报文,此类报文只在同一链路有效。链路本地单播地址从FE80/10开始。
v3是运行在IPv6上的路由协议,同样适用链路本地地址来维持邻居、同步LSA数据库。除虚连接外的所有v3接口都使用链路本地地址作为源地址及下一跳来发送v3报文。
这样做的好处是,不需要配置IPv6全局地址,就可以得到v3拓扑,实现拓扑与地址分离。通过在链路上泛洪的报文不会传到其他链路上,来减少报文不必要的泛洪来节省带宽。 - v3移除所有认证字段
v3的认证直接使用IPv6的认证及安全处理,不再需要其自身来完成认证,使用协议时只需关注协议本身即可 - 新增两种LSA
- Link LSA(8类,链路LSA):
用于路由器宣告各个链路上对应的链路本地地址及其所配置的IPv6全局地址,仅在链路内洪泛。
该类型LSA仅在本链路上传播,具有以下3种目的:向本链路上的其它路由器提供路由器的本链路地址;向本链路上的其它路由器通告IPv6地址前缀,使其与本链路相关联;允许路由器在该类型LSA中插入一些选项比特,与为本链路产生的网络LSA相关联。 - Intra Area Prefix LSA(9类,区域内前缀LSA):
用于向其他路由器宣告本路由器或本网络(广播网络及NBMA)的IPv6全局地址信息,在区域内洪泛。
该类型LSA在本区域内传播,具有以下两种功能之一:通过参考网络LSA把IPv6地址前缀与传递网络(transit network)相关联;或者通过参考路由器LSA把IPv6地址前缀与路由器相关联。一台路由器可以为给定的区域产生多个该类型的LSA,这些LSA使用链路状态ID字段(Link State ID)区分。DR 为它所代表的链路产生一个或多个该类型的LSA,向整个区域内通告该链路的地址前缀。
- Link LSA(8类,链路LSA):
- v3只通过路由器ID来标识邻居
v2在广播、NBMA及P2MP网络中是通过IPv4接口地址来标识的。
OSPFv3只通过Router ID来标识邻居,这样即使没有配置IPv6全局地址,或者IPv6全局地址配置都不在同一网段,v3的邻居还是可以建立并维护的,以达到“拓扑与地址分离”的目的