OSPF的常规:
*通过Hello包来建立邻居关系。
*邻居关系分为两种:
One:邻居就是指旁边并不熟悉的邻居,这里指还没有进入数据同步的状态之前。
Two:邻接就是值旁边已经熟悉的邻居,这里指已经有进入数据同步并且完成以后的状态。
*更新包里面包含的是一些可以算出路由的信息。而不像RIP或者EIGRP的更新包里面都是具体的信息,具体的路由。
*当收到更新包的时候,会把收到的信息放到链路状态数据库里面Link-State Database,通常称之为LSDB。
*OSPF也会有一个算法,叫做“最短路径优先算法”用SPFAlgorithm来表示。
而通过这算法可以算出一个以自己为树根到达目的地的最短最优的路径放到“路由表Routing Table”里面。
OSPF的基本特性:
*它也会维护三张表,分别是:
邻居表Neighbor table
形成邻居或者邻接关系的信息。
拓扑表Topology table
路由表Routing table
OSPF的网络类型:
*Transit areas传输区域
*Regular areas非骨干常规区域
如右图所示:
1.A和B是骨干区域路由器,也称为BackboneArea 0 路由器。
2.而C,D,E三台路由器称之为区域边界路由器也称为ABR
3.最后的F,G,H则就是常规的路由器了。
4.如果F的后面有一个运行RIP的路由器,那么F就是“ASBR”自治系统边界路由器。
划分区域的好处:
1. 可以减少路由表条目,因为比如F它就只用维护本区域内的路由条目。
2. 当拓扑发生改变的时候,也只影响本区域内的路由器的数据库。
3. 每隔30分钟会泛洪一次,也只在本区域泛洪。
4. 很有多区域类型。
SPF最短路径优先算法:
首先,hello更新包里面包含LSA叫做链路状态通告,然后通过LSA来算出路由。
1.当接收到一个更新包时,查看数据库里面有没有这条更新包里面的路由。
2.如果没有那么就会添加到自己的数据库里面
3.然后返回一个确认包给发送端。
4.然后接下来会把这个LSA泛洪给自己的邻居。
5.最后运行SPF最短路径优先算法,算出最佳路由并放到自己的路由表里面。
当然如果查到在自己的数据库里面有这个更新包里面的LSA,
那么它就会先比较数据库里面的LSA和接收到的LSA的序列号是否一致,
如果相同,则不学这条LSA,进行忽略掉。
如果不同,则看谁的LSA的序列号高,取高的LSA序列号的一边放入数据库里面。
然后泛洪给邻居,在给发送方一个确认,重新运行SPF最短路径优先算法,算出最佳路由放到路由表里面。
如果是自己的数据库里面的LSA序列号大的话,就把自己数据库里面的LSA发送给源。
LSA序列号的范围:0x80000001~~~0x7FFFFFFF,每隔30分钟泛洪一次,序列号是会增加的,所以序列号越大,LSA越新。
OSPF的报文类型:
1. Hello
用来建立邻居或这邻接、用来维护邻居关系
每隔10秒发一次,死亡时间是40秒。
如果是点到多点的情况,则是每隔30秒发一次,死亡时间是120秒。
2. Database description
数据库描述包,简称DBD。包含数据库里面LSA的摘要信息。
3. Link-state request
链路状态请求包,用来请求未知的LSA
4. Link-state update
链路状态更新包,包含具体的更新LSA
5. Link-state acknowledgment
链路状态确认包,只用来确认更新包。
OSPF的报文结构:
首先封装的IP Header,而在IP头部里面有一个协议号,如果协议号protocol是88就是EIGRP的路由协议,如果是89就是OSPF的路由协议。
Version number:目前我们所用的ipv4下OSPF版本号是2.
Type:类型就是那种五种报文类型。
Packet length:数据包包长度
Router ID:在区域内是唯一的。实际上就是一个IP地址。
用来标识一台运行OSPF路由器的序列号。
1.可以手工指定
2.路由器会自己选回环口最大一个IP地址来作为
RouterID,比如:1.1.1.1<2.2.2.2
3.如果没有配置回环口,那么它就会自动选择物
理接口里面最大的一个地址来作为Router ID。
4.如果没有路由一个IP地址都没有,肯定就没有办法来运行OSPF了。
Area ID:区域ID,一个接口可以属于一个区域。
Check0-sum:效验和
Authen-ticationtype:OSPF的认证类型,分为两种,一种是明文的,一种是加密的,可以手工指定。
Authen-tication:认证的密码
Data:数据,可以算出路由的一些信息了。
OSPF建立邻居的过程:
Hello包里面包含的信息:
1. router ID
2. hello anddead intervals*hello时间和死亡时间
3. neighbors 列出的是邻居的routerID
4. Area ID*
5. Router priority 路由优先级,用来选DR和BDR
6. DR ip address DR是指定主路由器
7. BDR ip address BDR是次级路由器
8. Authenticationpassword*认证类型密码
9. Stub areaflag* 末梢区域路由标记
两台路由建立邻居的时候,这四条带*号的标红的都必须是一样的。
OSPF建立邻居的具体过程演示:
下面是两台路由器建立邻居的具体过程。
OSPF的目的地址是224.0.0.5。EIGRP是224.0.0.10。RIP v2是224.0.0.9
1.首先第一个状态是Down状态,还没有运行OSPF协议前的状态。
2.当A发hello包出去的时候,它就会进入初始状态init state,而它发的这个hello包是一个224.0.0.5的一个组播包。
当B收到A的hello包的时候,B会把A的信息放到它的邻居表里面。
然后回应一个hello包给A,回应的这个包是一个单播包。
同样,当B把这个Hello包发出去的时候,B也会进入初始状态。
*当自己发送出去的hello包,包含自己的routerID的时候,就会进入TWO-Way state状态
而TWO-Waystate就是邻居关系,而与此同时会选择DR和BDR。
1. 先比较接口的优先级
2. 比routerID,看谁大
最后B的routerID大,所以B是DR,而A是BDR。
1.下来就会进入到准启动状态exstart state
而在准启动状态会选择主从。是通过FirstDBD包来选的。
因为第一个DBD包里面没有摘要信息,只是用于来选主从的。
当A给B发了一个DBD包,说我想当主。然后B一看,自己的routerID大,而自己是主。
选主从只是比较routerID 而不看优先级。
2.然后进入到exchange state交互状态。
这个时候路由器B“主”就会发送一个DBD包给A,而这个DBD包里面才包含LSA的摘要信息。
当“从”收到这个DBD包的时候,会给主一个回应。
1.进入到loading state加载状态
在这里开始同步数据库。
在这里,A发现在B的数据库里面有一条172.16.6.0/24的路由,自己没有,所以就会给B发送一个请求包。
当B收到这个请求的时候,B就会把这条172.16.6.0/24的路由放到更新包里面发给A.
然后A给B一个确认包:thanks for the information!
2.当数据库同步完成就进入到了Full state 完全状态。也就是邻接关系。
(而前面说的路由器每隔30秒会把自己的路由信息泛洪出去,但是仅限于泛洪给已经建立邻接关系的路由器。)
OSPF建立邻接关系以后可以减少路由信息:
一、看左边的手动画出的5个路由器。
1. 如果是每个路由器都建立邻接关系,那么应该像第一副图一样。
2. 但是当选完DR和BDR以后,就是第二幅图了。
首先必须相连的有:
DR------BDR
DRother-----DR
DRother-----BDR
(而除了DR和BDR以外,其他的路由器都是DRother)
这样邻接关系的路由器数量就少了。而OSPF每隔30分钟会泛洪一次LSA给邻接关系的路由器。所以在有DR和BDR关系的路由器下,泛洪的数量就少了,就会减少链路带宽。
二、在看下图的例子:
1.当路由器A发现自己左边的链路down掉了,就会发送LSU更新包给DR和BDR
而发送的目的地址是224.0.0.6,这样它发送的更新包就只有DR和BDR能
够收到。
2.当DR收到这个更新包的时候,会把这个更新包LSU发送给其他的路由器也
就是DRother,比如这长图中的路由器B。而DR发送给
DRother的目的地址是224.0.0.5,同样的也只有DRother路由器
才能够接收到。
所以OSPF会用到两个组播地址:只用于DR和BDR接收的
224.0.0.6,以及只用于DRother接收的224.0.0.5.
OSPF的实验:
回环口可以来模拟PC机。它是路由器上面虚拟出来的端口,它永远不会down掉,除非手工shutdown,它才会关闭。
R1(config)#interfaceloopback 0
R1(config-if)#ipaddress 1.1.1.1 255.255.255.0
R1(config-if)#no shutdown
配置OSPF:
R1(config)#routerospf 100 后面跟进程ID,路由器间的进程ID可以不一样(理论上),但建议最好配置一样的进程ID。
手工指定routerID:
R1(config-router)#router-id1.1.1.1
通告网段所属区域:
R1(config-router)#network2.1.1.0 0.0.0.255area 0
R1(config-router)#network1.1.1.0 0.0.0.255 area 0
回环口如果通告到OSPF里面,那么它的掩码在路由表里面就是32位的,当然可以通过手动配置来把它变回24位。
可以通过改网络类型改变它的掩码:
R1(config-if)#ip ospf networkpoint-to-point 在回环口下面敲这个命令就可以还原它的掩码了
OSPF的metric值:
这个“3”就是OSPF的metric值,而在OSPF里面,我们称之为cost值。也就是花销、花费值。
Cost=108/BW(bps) 也就是在K的基础上再乘以1000
路由传递方向经过的的所有入接口cost值累加。
For example:108/100M*1000k*1000bps=1
所以三个入接口的cost值都是1,那么所有入接口累加在一起就是3.
一个广播域要选一个DR和BDR。取routerID最大的为DR。
产看接口的命令:
R1#show ip ospf interfaceloopback 0
R1#show ip ospfinterface f0/0
1.如果不返回特权模式而使用show命令的话,需要在前面加个do。
如:R2(config--router)#do show ip ospf neighbor
2.如果在routerID已经比其他routerID小的情况下,想让哪台路由器当DR或者BDR,可以用命令来更改这台路由器的优先级(取优先级最大):R1(config-if)#ip ospf priority 100
但是在OSPF里面的DR和BDR是不可以抢占的,即使你更改了当前路由器的优先级,所有在什么情况下才可以抢占呢?所以除非是之前的DR已经down了。
只查看OSPF的路由信息:
R1#show ip route ospf