OSPF协议总结
OSPF的五个包:
1.Hello:9项内容,4个必要
2.DBD:数据库描述数据包(主要描述始发路由器数据库中的一些或者全部LSA信息),主要包括接口的MTU,主从位MS,数据库描述序列号等);
3.LSR:链路状态请求数据包(查看收到的LSA是否在自己的数据库,或是更新的LSA,如果是将向邻居发送请求);
4.LSU:链路状态更新数据包(用于LSA的泛洪扩散和发送LSA去响应链路状态请求数据包);
5.LSACK:链路状态确认数据包(用来进行LSA可靠的泛洪扩散,即对可靠包的确认)。
Hello包作用:
1.发现邻居;
2.建立邻居关系;
3.维持邻居关系;
4.选举DR,BDR
5.确保双向通信。
Hello包所包含的内容:
路由器id |
Hello&Dead间隔 * |
区域id * |
邻居 |
DR |
BDR |
优先级 |
验证 * |
末节区域 * |
注:1.“*”部分全部匹配才能建立邻居关系。
2.邻居关系为FULL状态;而邻接关系是处于TWO-WAY状态。
Hello时间间隔:
在点对点网络与广播网络中为10秒;
在NBMA网络与点对多点网络中为30秒。
注:
保持时间为hello时间4倍
虚电路传送的LSA为DNA,时间抑制,永不老化.
OSPF的组播地址:
DR将使用组播地址224.0.0.5泛洪扩散更新的数据包到DRothers
DRothers使用组播地址224.0.0.6发送更新数据包
组播的MAC地址分别为:0100.5E00.0005,0100.5E00.0006
OSPF的包头格式:
| 版本 | 类型| 长度 | 路由器ID | 区域ID| 验证和 |验证类型 |验证 |数据|
| 1 byte |1 |2|4|4| 2|2|8 | variance|
OSPF支持的验证类型:
OSPF支持明文和md5认证,用Sniffer抓包看到明文验证的代码是“1”,md5验证的代码是“2”。
OSPF支持的网络类型:
1.广播
2.非广播
3.点对点(若MTU不匹配 将停留在EX-START状态)
4.点对多点
5.虚电路(虚电路的网络类型是点对点)
虚链路必须配置在ABR上,
虚链路的配置使用的命令是area transit-area-id virtual-linkrouter-id
虚链路的Metric等同于所经过的全部链路开销之和
DR /BDR选举:
1.优先级(0~255; 0代表不参加选举;默认为1);
2.比较Router-id。
次者为BDR。
在Point-to-Point,Point-to-Multipoint(广播与非广播)这三种网络类型不选取DR与BDR; Broadcast,NBMA选取DR与BDR。
先启动OSPF进程的路由器会等待一段时间,这个时间内你没有启动其它路由的OSPF进程的话,第一台路由就认为自己是DR,之后再加进来的也不能在选举了,这个等待时间叫做WaitTimer计时器,CISCO规定的WaitTimer是40秒。这个时间内你启动的路由是参与选举的,所以真实工作环境中,40秒你大概只启动了两台,DR会再前两台启动的路由中产生,工作一段时间以后,活的最久的路由最有可能成为DR
OSPF over FRAME-RELAY 的配置:
(1) NBMA :在HUB上指定邻居;SPOKE上设置优先级为0。
(2) P-TO-P: 接口下配置命令 ip ospfnetwork point-to-point。
(3) P-TO-MULT P:接口下配置命令 ip ospf network point-to-multipoint。
按需电路配置:
接口下配置命令 ip ospf demand-cricuit。
孤立区域问题解决:
1.虚电路 (虚电路穿过的区域一定是标准区域,标准区域一定是全路由的)
2.隧道
3.多进程重分发
注:如果中间间隔区域为stub区域,则只能用隧道解决.
OSPF分区域的原因:
1.LSA数据过大,造成带宽负载过大。
2.计算全网拓扑,对cpu要求过高。
3.数据库过大,对内存要求过高。
OSPF的区域类型:
骨干: LSA:1 2 3 4 5
标准: LSA:1 2 3 4 5
stub:LSA1 2 3
nssa:LSA1 2 3 7 7(default)
AREA 1 NSSA DEFAULT INFORMATION-ORIGINATE
(ABR上产生默认路由LSA 7)
total-stub: 1 2一条默认3
total-nssa: 1 2 7一条默认3
LSA的类型:
类型1: 路由器链路信息
内容包括:路由器链路Router-id; 接口地址; 接口网络; 接口花费
可使用show ospf database router命令查看。
类型2: 网络链路信息
由DR通告,如果是点对点的网络类型,没有LSA2
类型3、4:汇总链路(都是ABR通告)
3号通告ospf区域间信息
4号通告asbr的router-id信息(通告nssa区域的abr)
类型5: 通告外部路由
类型7: nssa区域外部路由
类型11: 用于打标签
类型代码 | 类型名称 | 描述 |
1 | 路由器LSA | 每台路由器都会产生,在区域内泛洪 |
2 | 网络LSA | DR产生,在区域内泛洪 |
3 | 网络汇总LSA | ABR始发,在整个OSPF域中泛洪 |
4 | ASBR汇总LSA | ABR始发,在整个OSPF域中泛洪 |
5 | AS外部LSA | ASBR始发,在整个OSPF域中泛洪 |
6 | 组成员LSA | 标识OSPF组播中的组成员,不做讨论 |
7 | NSSA外部LSA | ASBR始发, |
8 | 外部属性LSA | 没有实现 |
9 | Opaque LSA(本地链路范围) | 用于MPLS流量工程,不做讨论 |
10 | Opaque LSA(本地区域范围) | |
11 | Opaque LSA(AS范围) |
OSPF邻居建立过程:
A-------------------------B
down
initB收到A 发来hello进入init状态
two way hello 4个“*”匹配,选举DRBDR ;A在hello中发现自己的Router-id;
exstart交换DBD;确立主从关系(多路访问Router-id高为主,低为从;串行接口下接口地址大的为主)
exchange 交换数据DBD (主的先发)
loading 交换完整数据包LSR LSU
full
注:
每个LSA由序列号确认为最新的更新。
当路由器收到LSA之后的处理过程:
(1)如果数据库有这样的,再查看序列号,如果序列号相同,忽略这条LSA;如果序列号偏大,将其转到数据库,并进行SPF,更新路由表;如果序列号偏小,将一个包含自己的LSA新信息发送给发送方。
(2)如果数据可没有这样的,将其加到数据库表,并发一个ACK返回,并运行SPF,更新路由表。‘
OSPF的Metric值:
Cost=10的8次方/带宽,简便记做100Mb/带宽值。Metric值是由cost值逐跳累加的。
环回口的路由,掩码为/32,既我们所说的“主机路由”。在实际应用中,环回口以32位的居多,用作ospf的管理接口。但是如果你想让环回口模拟一个网段,我们可以通过以下配置来消除。
R1(config)#int loopback 0
R1(config-if)#ip ospf network point-to-point
环回口只能配置成point-to-point这种类型,不可以配置成其它的类型。
其他:
1.当一个路由器既是ABR又是ASBR时为了不让巨量外部路由分发进nssa区域使用命令:area 1 nssano-redistribution default-information originate
2.配置命令show ip ospf database router用来查询拓扑
3.一个路由器在理论上支持65535个OSPF进程,在实际环境中一个路由器可支持的OSPF
进程数量与其可用物理接口数量相等。(这个我对老师说的有疑问,如果我启用了很多环回口,每个环回口一个区域不可以吗?)
OSPF汇总
在OSPF骨干区域当中,一个区域的所有地址都会被通告进来。但是如果某个子网忽好忽坏不稳定,那么在它每次改变状态的时候,都会引起LSA在整个网络中泛洪。为了解决这个问题,我们可以对网络地址进行汇总。
Cisco路由器的汇总有两种类型:区域汇总和外部路由汇总。区域汇总就是区域之间的地址汇总,一般配置在ABR上;外部路由汇总就是一组外部路由通过重发布进入OSPF中,将这些外部路由进行汇总。一般配置在ASBR上。
区域汇总:
area area-id range ip-address mask
外部路由汇总:
summary-address ip-address mask
我设计的两个试验,把几个知识点串起来
试验一
用一个试验总结一下ospf over 桢中继的时候,OSPF几种网络类型的差别。
封装好FR,DEBUG看到的几种情况
情况一:两边只起了OSPF进程,其它全部默认
这种情况下邻居需要手动配置!
R2(config)#router ospf 10
R2(config-router)#neighbor 12.1.1.3
选举了DR,BDR
hello的间隔是30s
OSPF的数据包是单播传送的。
情况二:两边的网络类型改为Broadcast(命令接口下ip ospfnetwork broadcast)
这种网络类型下是不需要手动配置邻居关系
有DR与BDR的选举。
Hello时间间隔为10s。
使用224.0.0.5这个组播地址传送数据包。
情况三:网络类型改为Point-to-Point(命令接口下ip ospf netpoint-to-point)
不需要手动指定邻居
没有DR/BDR的选举
Hello时间间隔为10s
使用224.0.0.5这个组播地址传送数据。
情况四:Point-to-Multipoint(命令接口下ip ospfnetwork point-to-multipoint)
不需要手动指定邻居
没有DR和BDR的选举
Hello时间间隔为30s
以224.0.0.5这个组播地址发送数据
情况五:非广播的Point-to-Multipoint
(命令接口下ip ospf network point-to-multipoint non-broadcast)
邻居需要手动指定,但是邻居只要在一边指定即可。
没有DR和BDR的选取
Hello时间间隔为30s
使用单播传送OSPF数据
列出一张表,方便看
网络类型 | 邻居自动发现 | 有无DR选举 | Hello间隔 | 传输方式 |
默认 | 否 | 有 | 30s | 单播 |
Broadcast | 是 | 有 | 10s | 组播 |
Point-to-Point | 是 | 无 | 10s | 组播 |
Point-to-Multipoint | 是 | 无 | 30s | 组播 |
Point-to-Multipoint(非广播) | 否,单边指即可 | 无 | 30s | 单播 |
试验二
OSPF的认证总结:
OSPF的认证有2种类型(不验证也算的话是3种),使用DEBUG可以看到type0表示无认证,type1表示明文认证,type2表示MD5认证。明文认证发送密码进行认证,而MD5认证发送的是报文摘要。
OSPF的认证可以在链路上进行,也可以在整个区域内进行认证。另外虚链路同样也可以进行认证。
同样也是分情况来讨论。
情况一:R1和R2明文验证
R1(config)#int s1/0
R1(config-if)#ip ospfauthentication(启用认证)
R1(config-if)#ip ospf authentication-keycisco(配置密码)
不配置R2的话
通过debug工具我们可以看到如下信息:
*Aug 15 22:51:54.275: OSPF: Rcv pkt from 10.1.1.2,Serial1/0 : Mismatch Authentication type. Input packet specifiedtype 0, we use type 1
这里的type0是指对方没有启用认证,type1是明文认证。
在R2上配置认证,使得邻居关系恢复。
R2(config)#int s1/0
R2(config-if)#ip ospf authentication
R2(config-if)#ip ospf authentication-keycisco
*Aug 15 22:54:55.815: %OSPF-5-ADJCHG: Process 10,Nbr 1.1.1.1 on Serial1/0 from LOADING to FULL, Loading Done
情况二:在R2和R3的串行链路上进行MD5认证的:
R2(config)#int s1/1
R2(config-if)#ip ospf authenticationmessage-digest(定义认证类型为MD5)
R2(config-if)#ip ospf message-digest-key 1 md5cisco(定义key和密码)
R3(config)#int s1/0
R3(config-if)#ip ospf authenticationmessage-digest
R3(config-if)#ip ospf message-digest-key 1 md5cisco
情况三:增加R2和R3上串行链路的MD5认证的密码:
在R2原有的配置上加上下面这条命令:
R2(config-if)#ip ospf message-digest-key 2 md5openlab
R2#sho ip ospf neighbor
Neighbor IDPriStateDead TimeAddressInterface
3.3.3.30FULL/--11.1.1.2OSPF_VL0
1.1.1.11 FULL/BDR00:00:3421.1.1.1FastEthernet0/0
1.1.1.10 FULL/-00:00:3710.1.1.1Serial1/0
3.3.3.30 FULL/-00:00:3111.1.1.2Serial1/1
邻居关系没有丢失。
增加新的密码钥匙,然后在将原来的密码删除,候邻居关系不受影响。
情况四:在Area0上进行区域认证(以前没做过吧)
R1(config)#router ospf 10
R1(config-router)#area 0 authentication
还没有写下一步,就是刚启用,还没设置密码,邻居就down掉了
同样,R2上启用一下,邻居就恢复
或者都设置相同的密码也可以。
情况五:Area0上进行区域认证以后。。。
R2#clear ip ospfpro清进程,A2区域的学不到邻居了。R3是通过虚链路连接到骨干区域的。因为virtual-link属于Area0,因此在R2配置完成Area0区域认证后,R3也需要相应的配置。
R3(config)#router ospf 10
R3(config-router)#area 0 authentication
这样就可以了
情况六:单纯的虚链路的认证(这个以前也没做过吧)
明文认证,MD5认证。配置命令如下:
明文:
R2(config-router)#area 1 virtual-link 3.3.3.3authentication-key cisco
R3(config-router)#area 1 virtual-link 2.2.2.2authentication-key cisco
MD5:
R2(config-router)#area 1 virtual-link 3.3.3.3authentication message-digest
R2(config-router)#area 1 virtual-link 3.3.3.3message-digest-key 1 md5 cisco
R3(config-router)#area 1 virtual-link 2.2.2.2authentication message-digest
R3(config-router)#area 1 virtual-link 2.2.2.2message-digest-key 1 md5 cisco
另外通过实验知道虚链路在建立起来后是DNALSA(不老化LSA),所以如果没有重启OSPF进程的话,即使一端配置了认证,虚链路也是不会断开的。
后面是sniffer抓得包
Hello包
Lsu包
LSACK包
上面是一般情况,下面是明文验证的几个包
Hello
DBD
LSR
LSU
LSACK
下面是MD5加密认证得包
Hello
DBD
LSR
LSU
LSACK