您的位置:首页 > 职场人生

OSPF 知识点

2008-03-27 16:35 197 查看
分层与汇总

OSPF的分层结构意义在于:

1)减小SPF算法的运算量,使SPF运算只涉及Area内的链路。
2)缩小LSA的洪泛区域,有效利用带宽
3)在边界易于做流量控制,比如汇总和过滤。

OSPF要求所有普通区域(Regular Area)都要与骨干区域(Transmit Area)直连,也就意味着Area间的流量都必须经过Area 0,这样一方面便于进行流量控制,另一方面也是出于避免环路的考虑。

因为虽然OSPF是一种链路状态路由协议,但是仍然运用距离矢量的算法来查找Area间路由,Area 0 内的路由器收到ABR通告的一条网络汇总LSA,并不进行SPF运算,只是简单的加上自己到ABR的路径开销,就记录进路由表,这是典型的DV行为。

由此可以总结出这样的观点:

OSPF路由器对自己所属Area的了解是“链路和拓扑”,而对其他Area的了解仅仅是“可达的路由”,ABR比较特殊,同属两个Area,所以对两个Area的拓扑都了解,但是对其他Area也是仅仅知道路由而已。

OSPF有两种汇总:Area间路由汇总(Area summary)和外部路由汇总(AS summary)

Area summary 在ABR执行:area 1 range address mask

AS summmary (指重发布进OSPF的路由)在ASBR上执行:summary-address address mask 。

OSPF的汇总一定要精确,如果有交叉,比如Area间的路由汇总包含了外部路由的明细条目,这样会出现LSA 5通告的转发地址不可达的现象。而另外要注意的是,当一个Area存在冗余的ABR,ABR之间应该有直连链路,并将该链路通告到骨干区域中使其得到充分利用。

Virtual-link 是在网络设计有误或出现故障的情况下,Area 0本身出现分离或者有区域没和Area 0直连,通过Virtual-link来进行补救,再就是出于冗余链路的考虑使用。

Virtual-link 配置的前提是必须在共享一个Area 的两台Router之间建立,且至少有一台连接着Area 0 。

Virtual-Link的Cost等于其依托的物理链路实际Cost的总和,如果存在多条链路则选Cost最小的。注意如果Area 0 配置认证,Virtual-link也要配,否则会Down掉,因为Virtual-link逻辑上是Area0 的一部分。

OSPF邻居

Router-id 是用IPv4地址在OSPF区域内唯一的标识一台路由器,自动选取ID的价值观为:首选数值上最高的Loopback 地址,若没有则选择最大的接口IP地址。注意,选取作为Router-id 的IP地址不必启用OSPF,但接口一定要处于UP状态,如果Down掉了或IP地址被删除,会在重启OSPF进程之后重新选取,如果没能及时预见,网络很可能因此而混乱。

其实最省事省心的方法就是先手工定义好Router-id,这也是一个网络工程师的好习惯,在network 命令之前就敲上,免得接口开始发Hello。而且该IP地址在网络中其实都不必存在,只要规划好定义好,邻接表就会清晰明了,也方便排错。

在OSPF的Hello 数据包中的字段涉及:

始发路由器的Router ID,始发路由器接口的Area ID,始发路由器接口的地址掩码,接口的认证类型和认证信息,接口的Hello-Interval 和Dead-Interval,接口的Priority,DR和BDR的ID,以及所有形成邻接关系的路由器的Router ID。

OSPF路由器要形成邻接关系,Hello中要求匹配的信息有:Hello and Dead intervals ,Area ID,Authencation Password,Stub and Flag 。在OSPF V2中还用加上一项:发送端IP与本端IP是否在同一子网内。不过如果接口地址是 ip unnumbered,会忽略该检查,而OSPF V3根本就不存在该机制 。

OSPF五种分组类型:

Hello分组:用于建立邻接关系,很多字段需要两端匹配。
DBD分组:类似于清单,包含一系列LSA的头部,为路由器所知道的LSDB的摘要信息。
LSU 分组:LSU是信封,信纸是LSA,LSA可以有很多张,而且有各种格式。
LSR 分组:用于请求具体LSA条目,看完对方的DBD后就知道自己想要哪些LSA了。
LSAck分组:用于收到LSA后给发送方确认,针对的是每一个LSA,而不是LSU。

OSPF邻居状态: (1.1.1.1)Router A ------------------------------ Router B(2.2.2.2)

Down状态:邻居会话的初始状态,指明在最近一个DeadInterval时间内还没有收到任何Hello分组。我们这里假设路由器A先发了一个Hello给B。

Init 状态:路由器B收到邻居A的Hello分组后回应一个Hello,在这个Hello的邻接字段中写上A的Router-id,表明自己知道对方的存在,同时将自己和A的邻接状态设为Init。

Two-way 状态:路由器A收到B的Hello分组,发现邻居字段含有自己的Router-id,这时A会将自己和B的邻接状态设为Two-way,开始发送一个空的DBD分组(没有LSA的头部,只用于确立主从关系)并标记其序列号为x,MS位为1(宣称自己是主路由器)。

PS: 如果在Init状态从邻居路由器那里收到一个DBD分组也会直接进入该状态。

Exstart 状态:路由器B收到A的DBD分组,就将自己和A的邻接关系设置为Exstart,发现对方的Router-ID并没有自己高,就回应一个空的DBD分组,标记序列号为y,MS位为1,说明自己才是主路由器,A在收到后会表示认同,其认同的方式就是发送一个空的DBD分组,该分组的序列号是y(以B的序列号为准),MS位为0(表明自己是从路由器)。

简单来讲,在Exstart状态就是确定路由器的主从关系(主路由器先发有内容的DBD分组),以及DBD分组的序列号,该状态下发的DBD分组都是空的。

Exchange 状态:路由器B收到这个空DBD分组,就将自己和A的关系置为Exchange状态,开始发送DBD分组,序列号为y+1,依次增加。对于每一个DBD分组,A都会发送含有自己LSDB信息的DBD分组用来确认,且序列号是相同的。B在发最后一个DBD分组的时候会将M位设为0(之前的都是1)表明自己的LSDB已经描述完。

同步完成的标志:自己发送了M位标记为1的DBD分组,并且收到对方发送的这样的DBD分组,由于从路由器必须确认主路由器发送的DBD分组,所以他最先知道同步完成了。

Loading 状态:路由器B收到同步完成的通知后,会发送LSR请求那些在链路状态请求列表中的LSA条目,同时将自己和A的邻接关系置为Loading状态,A对B也是如此。处于Loading状态的过程就是相互交换LSA,用LSAck给予回应,直到双方的链路状态请求列表都为空。

Full 状态:路由器A和B发现自己的链路状态请求列表为空,就将自己和对方的关系设为Full,即形成完全的邻接状态。

DR/BDR

OSPF区域中,物理上直连的路由器不一定会形成邻居。具体分析来看,Point-to-Point和Point-to-Multipoint网络肯定是和直连路由器建立Full邻接,因为这样的链路上不存在DR/BDR。

但是在Broadcast 和 NBMA 网络中,DRother只和DR/BDR建立Full邻接,DRother之间只会停留在Two-way状态,这样设计成逻辑上的星型拓扑,可以有效的防止LSA洪泛时没有必要的带宽占用。

在多址访问类型的链路上,DR/BDR与DRother的通信是借助两个组播地址完成的。DR/BDR 监听“大”地址224.0.0.6,DRother将LSA通过这个地址发给DR;而DRother监听“小”地址,DR将LSA发送到这个地址。

DR/BDR选举的价值观是:选优先级最高的接口,如果相同则选Router-id最高的路由器的那个接口,这里要强调的是DR只是一个接口概念,优先级可以用命令 ip ospf priority 修改。

DR的本质就是网络中活得最久的路由器,用于存储一个广播环境下所有的链路信息,谁有LSA请求就拷贝一份给他。

OSPF路由

在OSPF协议中,去往一个目的地,途径的每一条链路的Cost计算是在发送时加上该端口Cost,接收时不加。

比如要对R1去往12.1.1.2的路由的Metric进行修改,那么一个可行的方法就是修改R1本地出口的带宽值,修改对端接口不会使Cost值变化。修改的命令为(config-if)# bandwith 1000(kbit)

OSPF中的度量值Cost = 100Mb / Bandwith,如今带宽已发展到G比特时代,以100M作为参考值会使大于100M的链路开销都为1,因为OSPF不识别小数(四舍五入为1),这样不利于选路,建议用命令改为10G :(config-router)# auto-cost reference-bandwith 10000

OSPF在选路时的优先级:O > O IA > O E1 > O E2

即当去往一个目的地存在多条路径时,Area内路由 > Area间路由 > 外部路由类型1 > 外部路由类型2, 同等路由类型时再比较Cost大小,这样的规则不顾实际的带宽而只按优先级行事,有可能造成次优选路。

另一个造成次优选路的原因是信息缺失,就以OSPF中的Stub和Total Stub来具体分析一下(NSSA和Total NSSA可分别与其对应)。

Stub区域缺失的信息是外部路由,所以当Stub路由器有数据发往外部的时候,只能依靠ABR,而当一个Stub区域存在多个ABR的时候,会选择最近的ABR作为出口(等距的话就会形成负载均衡,前提是关闭CEF),但是这样并没有考虑到各ABR到ASBR的开销,即用部分cost代替整体cost来选择路径,显然是片面的;而Total Stub由于只有本Area的信息,对ABR更为依赖,即使在Area间路由的时候也可能会发生这样的次优选路。

简单来讲,Stub路由器进行AS外部路由,Total Stub路由器进行AS外部路由和Area间路由时都认为:总Cost = 自己到最近的ABR的Cost

当其他IGP协议重发布进OSPF时用的命令是 redistribute rip subnets metric-type 1/2 ,关键字“subnets” 使OSPF接受重发布进来的无类路由,如果不加,就只会发布主类网络,比如3.0.0.0/8可以重发布进来,而13.1.1.0/24就会被Pass掉。

而重发布的路由类型可以是E1或E2,E1要优于E2,因为E1加上了本地到ASBR的Cost,信息更准确,E2就没有考虑这些,所有重发布进来的路由默认Cost都是20。

PS:/32位主机路由

从路由的角度来看,不需要/32主机路由,但是从OSPF的SPF来看,如果在point-to-point,point-to-multipoint网络中收到的LSA的ADV是本接口网络的路由器,但又没有形成相应的邻接关系,就会认为“no reachable 不可达"。产生/32位的主机路由就是让SPF的运算网开一面,即使在“一个网络里”邻居没形成全,对应有/32路由的情况下,也认为ADV已经可达。

OSPF认证

OSPF协议数据包形式是:在OSPF数据外先封装一层OSPF报头,然后在OSPF报头外封装IP报头,并在IP报头的协议号字段中标明为89。OSPF报头中的AuType字段可以有三种选择:为0将不检查这个认证字段;为1就是普通认证,这个字段将包含一个最长为64位的口令;为2就是MD5认证,这个认证字段将包含Key ID,认证数据长度以及加密序列号。

OSPF的认证就启用范围而言,可以分为区域认证和链路认证,区域认证命令为(config-router)# area 0 authentication ,那么该路由器所有所属 Area0 的接口都会启用认证。需要注意的是,区域认证并没有密码,只是宏观上的,之后可以继续针对具体链路配置密码。

链路认证在接口下启用,记得链路两端都要配,命令为两组。每组的两条命令都必须敲上,因为每一条命令的效果是不一样的,只配密码并不起作用。举例来说,启用认证的命令ip ospf authencation message-digest 是让该接口在发送OSPF 数据包时将AuType字段标记为2,对端路由器收到后会先看这个字段是否和自己接口的一致,进而再去检查是否有相同的key-id & password映射。

(config-if)# ip ospf authencation

ip ospf authentication-key password

(config-if)# ip ospf authencation message-digest

ip ospf message-digest-key key-id md5 password

key-id 可以配多对,两端只要有一对映射(key-id & password)相同就行,这实际上是非对称加密算法。key-id 匹配检测的顺序是从小id 到大id ,大id 被称为youngest-id。利用这个特性可以配多组 key-id & password 来实现密码更换的平滑过渡,而不至于造成邻居丢失。

另外要注意的是,只启用认证,没设密码是空密码,而不是没有密码,两边都为空密码验证也能通过,认证都没启用的话是连空密码都没有。

最后说一些基本知识,认证的作用是识别身份,A给B发的信息可能被C截获,再伪造另外一份信息发给B,B会以为是A发的。显然这不是很安全。那么以MD5认证为例,A给B发的信息带有用ID和Key算出的Hash值,B收到这个值后,用自己知道的ID和Key再Hash出一个值,如果两个值相同,就视为认证通过,由此B可以相信该信息确实是A发给我的。至于这个信息在途中有没有被截获和查看,并不是认证所能解决的问题。

SOMETHING ELSE:

当使用命令 debug ip ospf packets ,会有一些字段的输出,下面做一下解释

V: OSPF版本

t:OSPF数据包类型,对应数字 1-Hello 2-DBD 3-LSR 4-LSU 5-LSAck

l:OSPF包长,单位为字节

rid:OSPF路由器ID

aid:OSPF区域ID

chk: OSPF校验和

aut:OSPF验证类型,对应数字 0-不认证 1-明文认证 2-MD5认证

keyid:MD5口令ID

seq:序列号
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息