注册 | 登录 忘记密码? 51cto首页 | 博客 | 论坛 | 招聘
热点文章 [业内传闻]今天,7月25日..
 帮助

OSPF三步曲之一基础篇


2008-03-01 16:47:38
 标签:网络 ospf   [推送到技术圈]

                                                        OSPF三步曲之一基础篇
 
 
 ospf协议号是 89,也就是说在 ip包的 protocol中是 89,用 ip包来传送
数据包格式:
OSPF路由协议的数据包中,其数据包头长为 24个字节,包含如下 8个字段:
* Version number-定义所采用的 OSPF路由协议的版本。
* Type-定义 OSPF数据包类型。OSPF数据包共有五种:
* Hello-用于建立和维护相邻的两个 OSPF路由器的关系,该数据包是周期性地发送的。
* Database Description-用于描述整个数据库,该数据包仅在 OSPF初始化时发送。
* Link state request-用于向相邻的 OSPF路由器请求部分或全部的数据,这种数据包是
在当路由器发现其数据已经过期时才发送的。
* Link state update-这是对 link state请求数据包的响应,即通常所说的 LSA数据包。
* Link state acknowledgment-是对 LSA数据包的响应。
* Packet length-定义整个数据包的长度。
* Router ID-用于描述数据包的源地址,以 IP地址来表示,32bit
* Area ID-用于区分
OSPF数据包属于的区域号,所有的 OSPF数据包都属于一个特定的 OSPF区域。
* Checksum-校验位,用于标记数据包在传递时有无误码。
* Authentication type-定义 OSPF验证类型。
* Authentication-包含 OSPF验证信息,长为 8个字节。
FDDI或快速以太网的 Cost 12M串行链路的 Cost 4810M以太网的Cost 10等。
所有路由器会通过一种被称为刷新(Flooding)的方法来交换链路状态数据。
Flooding是指路由器将其 LSA数据包传送给所有与其相邻的 OSPF路由器,相邻路由器根据其接收到的链路状态信息更新自己的数据库,并将该链路状态信息转送给与其相邻的路由器,直至稳定的一个过程。
当路由器有了一个完整的链路状态数据库时,它就准备好要创建它的路由表以便能够
转发数据流。CISCO路由器上缺省的开销度量是基于网络介质的带宽。要计算到达目的地
的最低开销,链路状态型路由选择协议(比如 OSPF)采用 Dijkstra算法,OSPF路由表中最多保存 6条等开销路由条目以进行负载均衡,可以通过"maximum-paths"进行配置。
如果链路上出现 fapping翻转,就会使路由器不停的计算一个新的路由表,就可能导致路由
器不能收敛。路由器要重新计算客观存它的路由表之前先等一段落时间,缺省值为 5 秒。在 CISCO配置命令中 "timers spf spf-delay spy-holdtime"可以对两次连续 SPF计算之间的最短时间(缺省值 10秒)进配置。
 路由器初始化时 Hello包是用 224.0.0.5广播给域内所有 ospf路由器,选出 dr
在用 224.0.0.6 drbdr建立邻接。
 dr 224.0.0.5广播给 drother lsa bdr也是 drother 224.0.0.6广播 lsa dr bdr
dr是在一个以太网段内选举出来的,如果一个路由器有多个以太网段那么将会有多个 dr选举;DR的选择是通过 OSPF Hello数据包来完成的,在 OSPF路由协议初始化的过程中,会通过 Hello数据包在一个广播性网段上选出一个 ID最大的路由器作为指定路由器 DR(如果设置优先级的话那么首先看优先级,优先级为 0不参加举)并且选出 ID次大的路由器作为备份指定路由器 BDRBDR DR发生故障后能自动替代 DR的所有工作然后重新选择 BDR。当一个网段上的 DR BDR选择产生后,该网段上的其余所有路由器都只与 DR BDR建立
相邻关系。见下图
 
 
图二、没有选举DR时的邻接关系                  图三、选举DR后时的邻接关系
 
DR的选举过程:这里可以以选举村长为例
选举的时候用 hello包中的 dr字节来标识,开始的时候都是标识的自己,一旦选
举出一个 dr来那么即使后来再有优先级更高的进来也不重新选举(因为一旦重
新选举那么所有的邻接关系都要重新建立)
ospf启动的过程:
 
 
down
init发送       hello224.0.0.5dr字段为全零(因为还没有选出 DR),
单通状态,我能收到对端的 hello报文,但对方没有收到我的报
文,怎么知道对端有没有收到我的报文呢,通过 Neighbors Seen
2way          2 ospf路由器从 hello中发现互相的 router id(本地路由器最大
ip,一般是 loopback)建立邻接在这个阶段已经知道谁是 dr
exstart          预启动状态,ospf路由器建立主从关系(看谁的 routerid大)然后协商一个序列号(因为 ip是不可靠的传输采用确认+超时重传就可以)准备传送,头两个 dd报文为空,不包含 lsa的数据
Router 1
DD seq=x,I=1,M=1,MS=1
I是第一个报文
M more表示还有后续报文
MS是表示 Router 1 Master
 
Router 2
DD seq=y,I=1,M=1,MS=1
I是第一个报文
M more表示还有后续报文
MS是表示 Router 2 Master
 
究竟谁是 master呢,就会选一个 router id大的作为 master
谁当了 master序列号就用谁生成的那个数,在这里应该
Router 2 y dr开始交换数据,master先发送
Exchange      lsdb报文,此报文只是一个 index(如同一本书的目录)不包含实际的路由数据, slave也发送报文,看谁的序列号高,序列高的数据新,相邻路由器可以根据数据库描述数据包的序列号与自身数据库的数据作比较,若发现接收到的数据比数据库内的数据序列号大,则相邻路由器会针对序列号较大的数据发出请求,并用请求得到的数据来更新其链路状态数据库。
Router 1先发送 dd报文序列号用 master的并且 MS字段为 0
Router2回应报文把序列号加 1表示已经收到了刚才的 dd报文并且也包含自己的
dd报文,下一个 Router 1 dd报文还用 y1来表示因为 slave无权把序列号加 1。如果
dd报文中的 M0那么表示 dd报文发送结束
 loading       装入状态,如果新加入的路由器的从 dd报文中看出那个是自己
需要的路由数据,则发送 lsr报文,请求发送数据,对端发送 lsu报文,此报文包含所需的全部数据。
Full           收到 lsu报文后发送确认,完成充满状态。
 
hello ttl值是 1,在以太网中每
10秒发送一次,而且不穿过路由器,通常 ospf协议报文的 ttl都是 1(虚连接除外)
link status flood整个 area(麦子说 flood是由区域内所有路由器接力完成)
一个 dd报文可以含有很多个 lsa的头部信息
init――――loading是路由器第一次交换信息的时候才出现,到了
full以后如果在有路由变化那么就只发送 lsu
邻居状态机(灰色为可以长期存在的状态,白颜色为短暂状态)
2way 2 drother之间可以有这种状态
 
OSPF五种协议报文:
 
 
lsa 类型
type 1又被称为路由器链路信息数据包(Router Link),所有的 OSPF路由器都
会产生这种数据包,用于描述路由器上联接到某一个区域的链路或是某一端口的
状态信息。路由器链路信息数据包只会在某一个特定的区域内广播,而不会广播
至其它的区域。
在类型 1的链路数据包中,OSPF路由器通过对数据包中某些特定数据位的设定,
告诉其余的路由器自身是一个区域边界路由器或是一个 AS边界路由器。并且,类型 1的链路状态数据包在描述其所联接的链路时,会根据各链路所联接的网络类型对各链路打上链路标识,Link ID。表一列出了常见的链路类型及链路标识。
 
链路                  具体描述链路标识                       链路标识
 
类型
1               用于描述点对点的网络                     相邻路由器的路由器标识
2             用于描述至一个广播性网络的链路              DR的端口地址
3            用于描述至非穿透网络,即 stub网络的链路          stub网络的网络号码
4             用于描述虚拟链路                           相邻路由器的路由器标识
链路类型 31 0或者 Stub网络)的链路状态描述――link id10.0.0.0 /网段/
data:255.0.0.0 /掩码
type:StubNet (3) /类型/
metric:50 /度量/
链路类型 1(点对点)的链路状态描述,首先要描述一下接口的路由信息:
link id:20.0.0.0 /网段/
data:255.0.0.0 /掩码/
type:StubNet(3) /类型/ 此处还是 3,因为 ppp类型分成 2部分,首先把它想象成
一个 10也就是类型 3的网络这么做是为了描述接口的
路由,20.0.0.0,第二步在描述对端连接的那台路由器
metric:5 /度量值/
对对端路由器的描述:
link id:2.2.2.2 /对端 RouterID/
data:20.0.0.2 /对端路由器的接口地址/
type:Router (1) /类型/
metric5
对帧中继(点对多点)链路状态的描述:首先也是先描述接口网段的路由
link id:40.0.0.1 /网段/描述的是自己的接口地址,不是网段
data: 255.255.255.255 /掩码/
type:StubNet3 /类型/此处还是描述成 1 0的网段
metric: 5 /度量值/
link id: 3.3.3.3 /对端 routerF id/因为是连接多点的,所以有多段描述
data:40.0.0.1 / router F相连的接口地址/
type:Router(1) /类型/
 metric:5 /度量值/
link id:4.4.4.4 /对端
routerE id/
data:40.0.0.1 / router E相连的接口地址/ 此处描述的是 routerA的接口地址,
并不是 Router E的接口地址,没关
系因为点对多点连接的接口地址
都在一个子网内
type:Router(1) /类型/
metric:5 /度量值/
对广播型网络链路状态的描述:不描述接口网段的路由了
link id:30.0.0.3 /网络中 DR的接口地址/
data:30.0.0.1 /本接口的地址/
type:TransNet(2) /类型/
metric:50 /花费/
每个路由器只生成这些信息,缺少的信息有 dr补齐,这样会节省很多的描述信息,如果不是的话假如这里有 100台路由器那么得生成 100段描述信息。 DR会单独生成一条(也就是说不管 drother有多少条)lsatype 2)描述掩码和
这个网段中有那些路由器
/DR(6.6.6.6)生成的 lsa/
Net mask:255.255.255.0
Attached 30.0.0.1 router
Attached 30.0.0.2 router
Attached 30.0.0.3 router
以上的这些描述信息还要加上 lsa的头(head
type:Router /lsa的类型/此处的 Router表示是 lsa类型 1
ls id:1.1.1.1 /lsa的标识/
adv rtr: 1.1.1.1 /生成该 lsa的路由器/表示这条 lsa是谁生成的
ls age:4 /本条  lsa的老化时间/每隔 1秒这个数字会涨 1
len: 108 /lsa的长度/
seq#:80000001 /lsa序列号/
link count:7 / lsa中包含的连接个数/
此时 RouterA路由器完成自己周边链路状态的描述
flood lsdb后就要用 spf生成路由表了,见下图:(以 Router A为例)
首先每个路由器都已自己为根计算路由,以 Router a为例它把每一个 lsa打开,分析每一段,碰到 StubNet这种类型的 lsa就知道这是描述的一条网段路由,于是就直接加到路由表中比如上图中的 10.0.0.0 20.0.0.0就直接加到路由表中不过这两条是本路由器直接相连的网段所以意义不大,那么看第三段,这段描述的是一个点对点的类型,路由器看到这段就会先停止计算,它会去找 RouterB生成的 lsa(因为这段描述的到 router b的点对点连接)因为每个 lsa都有 router idadv id)路由器就会以 2.2.2.2为关键字检索就会找到 router b lsa,找到以后在打开看它有什么信息,router b中有一个直连网段 50.0.0.0,这个网段对于 router a是未知的,所以就加入路由表中下一跳就指向 20.0.0.2(因为此 lsa Router b告诉我的)Metric值相加 50555,这样这条路由就完全加入到路由表中了。如果 Router B lsa中还连着一个 Router W,那么路由器还继续去找 Router W lsa找到后在继续算 Router w的路由(因为是 RouterB连接的 RouterW下一跳还是 RouterBMetric在相加)。 RouterA通过递归和回朔算完所有的 lsa的路由,所有的路由都是从每个 router lsa StubNet这种网络中得出路由的,因为 StubNet才是描述接口网段的路由,才是我们最终需要的路由信息,那么 TypeRouter只是描述的是下一跳地址。
 
每台路由器都有义务描述自己周边的链路状态(包括自己直连的路由器)见上图
每台路由器把周边的链路状态都发送到整个 area,这样,所有的路由器都存有一张同样的 lsdb信息,在由这个库算出来 spf路由。
 
当一台路由器的连接的某一个网段发生故障,那么就会产生一个 lsa flood到整个区域,所有的路由器都要在计算一边 spf路由,因为路由器不知道这条 lsa会影响那个路由,所以要重新把所有的 lsdb重新计算一遍,耗时并且占 cpu
 
type 2 DR发送,指定路由器产生用于描述所处的网段的链路数据包 network link,该数据包里包含在该网段上所有的路由器,包括指定路由器本身的状态信息
指定路由器 DR只有在与至少一个路由器建立相邻关系后才会产生网络链路信
息数据包,在该数据包中含有对所有已经与 DR建立相邻关系的路由器的描述,包括 DR路由器本身。类型 2的链路信息只会在包含 DR所处的广播性网络的区域中广播,不会广播至其余的 OSPF路由区域。
 
type 3 4类型 3和类型 4的链路状态广播在 OSPF路由协议中又称为总结链路信息数据包(Summary Link),该链路状态广播是由区域边界路由器或 AS边界路由器产生的。Summary Link描述的是到某一个区域外部的路由信息,这一个目的地地址必须是同一个 AS中。Summary Link也只会在某一个特定的区域内广播。类型 3与类型 4两种总结性链路信息的区别在于,类型 3是由区域边界路由器产生的,用于描述到同一个 AS中不同区域之间的链路状态;而类型 4是由 AS边界路由器产生的,用于描述不同 AS的链路状态信息。
Type 3类型的特点是每一条 type 3 lsa都对应一条路由
值得一提的是,只有类型 3 Summary Link才能广播进一个残域,因为在一个残域中不允许存在 AS边界路由器。残域的区域边界路由器产生一条默认的 Summary Link对域内广播,从而在其余路由器上产生一条默认路由信息。采用 Summary Link可以减小残域中路由器的链路状态数据库的大小,进而减少对路由器资源的利用,提高路由器的运算速度。
 
abr会把各端口所属的各个区域的 lsa type 1阻断,如:type:Router1)的 lsa
那上图中 area3如何知道 area 0 中的路由呢,abr会把 area 0中所有的路由信息,比如有 100条路由,会以 100 type 3类型的 lsa发送到 area 3中并且下一跳是 abr本身。这样可以减少 lsa的容量,如果 area 0 中有一条路由 down了,那么在 area3 中直接可以把这条路由删掉就可以了,不用像以前那样重新计算
 
在区域间的路由器上不再描述链路状态而是采用 dv算法
 
type 5类型 5的链路状态广播称为 AS外部链路状态信息数据包。类型 5的链路数据包是由 AS边界路由器产生的,用于描述到 AS外的目的地的路由信息,该数据包会在 AS中除残域以外的所有区域中广播。一般来说,这种链路状态信息描述的是到 AS外部某一特定网络的路由信息,在这种情况下,类型 5的链路状态数据包的链路标识采用的是目的地网络的 IP地址;在某些情况下,AS边界路由器可以对 AS内部广播默认路由信息,在这时,类型 5的链路广播数据包的链路标识采用的是默认网络号码 0.0.0.0
 External 外部路由又分成了 External 1 2 两种情况
1:把外部进来的路由传进来 cost area中要叠加的(一般情况)
  2:进来的时候 cost是多少那么就一直是多少,不管经过多少路由器(负载均衡时用)
 
type 4类型只是描述如何到达 asbr,见上图
网段写的是 asbr router id,下一跳指向
abr 为什么不把它当成 type 3那样处理呢?直接生成 type 3的路由信息
因为是避免自环,因为外部路由是不可靠的,所以第五类的路由的优先级不一样,
这些路由在路由表中标识出 ase,优先级很低
 
LSA都有有它自己的老化计时器,承载在 LS寿命域内。缺省值为 30分钟
 
 
Lsa的分类
 
 

 
区域的类型:
 
1backbone骨干域