一、ospf的基本知识
ospf 开放最短路径优先协议 链路状态类路由协议
属于3层,没有使用上层的tcp或者udp,所以没有确认机制。但是使用自己的lsack来确认更新
五个包,hello,DBD,LSR,LSU,LSACK。

二、spf算法
一句话简短的概括:节点以自己为根节点,计算确定到目标节点的最短路径。
路由器创建三个库。用来运行spf算法。
1、树数据库:通过向数据库中添加分支实现向最短路径树中添加链路(分支),最终这个库描述最短的路径
2、候选对象数据库:按顺序从链路数状态数据库向该库中复制链路,作为向树中添加的候选对象
3、链路状态数据库:这个数据库中,存有所有的链路

spf运行过程:
路由器以自己为根节点,先从链路状态数据库中,取出离自己最近的几台(他的邻居)路由器,将他们放到候选对象数据库,在候选对象数据库中,计算到他们的代价,把最小的代价   的“一条”链路放到树数据库中。这里之所以说是“一条”,假如说上面候选对象数据库中有三条链路,但是他们前往的是不同的目标,但是只放“一条”,然后再重复查找候选对象数据库,再找”一条“最短的候选对象,放到树数据库。当在候选对象数据库中有两条到同一目标的候选对象,将花费最小的放到树数据库,其他的删除。
然后再以根节点最近的那几台路由器(上一步中假设的三台路由器)为跟节点,重复上面的步骤。
这样一级一级的扩散,感觉上类似于RSTP那样,一级一级的扩散。直到最后计算完成。
在SPF算法计算完成后
候选对象数据库应该是空的。
链路状态数据库不变,里面依然有所有的路径
树数据库中应该有到达所有目标的最佳路径。(就是路由表中的路径)

三、区域的概念
在距离矢量路由协议中,路由更新是扩散在整个AS中的。这样浪费了很多的带宽,白白消耗了资源(如cpu、内存),广播(组播)范围很大。而且没有层次结构。不适合大型的网络拓扑。
这些缺点,在ospf中都得到了克服。因为ospf引入了区域的概念。
在一个ospf区域一般情况是不希望超过50台路由器。因为区域内路由器的数量和路由器的性能有很大的关系。比如,路由器需有用spf算法计算路径,CPU的性能就比较重要,路由器数很多,要求的cpu就比较高。内存中存着ospf中的数据库,如果路由器很多,对内存的要求也比较大
注:在这里再说一下,在一个区域内,是路由器是根据LSDB中的信息,确定路径。但是在区域间,是依赖中间路由器来确定相应的路径。这就不是链路状态了,而是距离矢量了。

四、ospf主要的四类区域
1、广播:多路访问广播网络,如:以太网。
2、点到点:将一对路由器连起来的网络。
3、虚链路:默认所有的普通区域都要和骨干区域(area 0)相链,如果有个别区域因为没规划好,没有办法和骨干区域相连,就要建立虚链路。
4、NBMA:非广播多路访问。感觉上一般是应用的帧中继环境上。(ATM、X.25都属于NBMA)
5、点到多点:属于NBMA中一个特殊的情况。

五、路由器端口的角色、邻接关系、邻居关系
这里主要说多路访问环境
1、多路访问环境:
路由器端口会选举DR、BDR。DR的职责是同步该多路访问环境中的链路状态数据库(下面称LSDB),这个在后面还会细说。BDR是在DR的备份,当DR挂掉的时候,BDR直接接管DR的工作。DRother会去像DR同步LSDB
这里需要强调几点:

a、DR,BDR是基于端口的。为什么这么说,假如一台路由器跨越两个区域(ABR),两个区域的端口是独立选举DR的。
b、DR的选举规则,是先比较优先级,cisco默认为1,越大越优先。如果优先级为0,那么相当于主动放弃DR选举的权利。当优先级相等,那么再比较routeID,越大越优先。routeID的选举规则为,手动指定>环回接口>IP最大的活动的物理接口。
c、刚开还没收敛的时候,每一个路由器都宣告自己是DR,收敛完成以后,选举出一个DR。
d、DR具有不抢占特性。当一个多路网络环境选举完DR以后,再接入一个优先级更大的路由器,不会改变DR。除非重启区域内所有的ospf进程,才会从新选举。
DRother之间,建立双向关系(2-way),这种关系称为邻居关系。他们之间不同步LSDB
DRother和DR,DRother和BDR之间,处于full状态。这种关系称为邻接关系。他们之间同步LSDB

2、点到点环境:
这个相对简单一点,两台路由器之间通过串行线链接在一起,他们不选举DR或者BDR。但是他们建立邻接关系(full),所以他们之间一定会同步LSDB。


六、ospf的两个组播地址
allrouteradress:224.0.0.5 所有路由器地址。这个地址接受者是所有的路由器,一般是由DR,BDR发出
allDRadress:224.0.0.6   DR地址,这个地址接收者是DR,一般是DRother发给DR用的
注:在广播(多路访问)环境中,使用的是两个组播来进行发送路由更新,hello
在点到点链路中,通过使用224.0.0.5这个组播来发送更新和hello
在虚链路,NBMA中,是通过单播来进行通信的。

七、细说五个包:
1、hello:
作用:发现邻居、路由器间几个基本信息的确认、确定邻居活着、选举DR、BDR。

hello中的信息:

a、自己的routeID
b、自己的区域ID
c、始发接口地址
d、认证信息
e、hello、dead时间
f、路由器优先级
g、指定DR、BDR
h、邻居的routeID
在多路访问环境下,默认hello是10秒。dead时间默认是hello的4倍。
在非广播环境中,hello时间默认是30s,dead默认也是4倍。
2、DBD
数据库描述包
作用:DBD中保存着LSDB中的摘要信息。空的DBD用在exstart状态,确定邻接关系间主/从关系用
DBD中一般保存这LSA的头部信息。可以唯一的确定LSA
3、LSR
链路状态请求包
当收到的DBD中发现有LSA不在自己的LSDB,或者自己的LSDB中的LSA已经太旧了。那么就会发送需要的LSA的头部,去请求LSA。
4、LSU
链路状态更新包
主要是通告链路状态信息
可以回应LSR,也可以主动去泛洪。LSU里面一般包含多条LSA。
5、LSACK
用来完成确认。一般是由单播来发送的。
注:这里需要注意一点,在广播环境中,虽然LSU一般是通过组播发送的。但是当有一台路由器没有回发LSACK的时候,会从新使用单播,单独的去发LSU给没有回复确认的主机。

八、ospf进程启动,邻居的建立过程。十分重要

ospf邻居建立过程

邻居建立过程中,总过有七个状态,分别是

1down state 停止状态

2init state 初始状态

3two-way state 双向状态

4extart state 准启动状态

5exchange state 交换状态

6loading state 加载状态

7full state 邻接状态

1、停滞状态:两个路由器没有发送任何hello

2、初始状态:路由器AB发送hello包(每10s),发送顺序是任意的,通常谁先network谁先发送hello

3、双向状态:路由器B收到Ahello包,检查四个必要条件(hello deadarea-id、认证、stub area flag)如果匹配。将A加入自己的邻居表,并向A发送一个hello包。

4、准启动状态:再次交换hello包,确定DRBDR主从关系(谁ID大,谁是master,否则为slave

5、交换状态:master先发送DBD包,slave收到主的DBD包之后再发送DBD包。路由器会相互发送包含LSA头部的DBD,用来同步LSDB的摘要。

6、加载状态:masterslave之间,在拓扑表中与收到的DBD包相对比,找到缺少的条目后向对方发送LSR数据包,请求对方回复一个LSU收到LSR的路由器,回复请求的完整的LSU给对方。同步整张LSDB。

7收到LSU的路由器,回复一个LSack,表明收到该LSU。此时进入FULL state。完全邻接状态。


1、down状态:这是邻居建立的最初始状态。在最近一个dead时间内,还没有收到hello包。但是在这个状态,应该已经开始发送hello包了。这个hello包里面,DR字段为0.0.0.0,因为还没有选DR,而且邻居字段为空。还没有邻居的信息
注:down状态完了以后,还有一个attempt状态。这个状态只用在NBMA状态。这个状态不太重要,忽略了
2、init状态:在这个状态中,路由器收到邻居发送的hello包。但是收到的这个hello包里面邻居信息还是空的。
3、2-way状态:在这个状态中,收到了邻居的hello包,但是在这个阶段,收到的hello包中,已经有自身的信息,说明邻居已经获得了自己的信息。这就说明完成了2-way状态。一般情况下,DR是在这个状态中选举完成的。
4、exstart状态:在这个状态中,DRother和DR/BDR之间确立主从关系。具有最高routeID的路由器将称为主路由器。主路由器优先发送空的DBD,宣告自身为主,收到空DBD的路由器会查看对方的routeID和自己的,如果自己的大,那么发送空的DBD宣告自己为主,如果对方的大,那么承认对方为主。主路由器只是优先发送DBD,仅此而已。
注:DBD中有三个位,I、MS、M 。I为1,标识这个是初始的DBD,第一个DBD。协商DBD序列号,或者一般确立主从关系的那个空DBD会标注i=1。MS位标识是主从关系,如果自己是主的话,这里MS=1,M标识DBD包是否发完了,如果M=0,标识这是最后一个DBD包,后面没有了。这个过程一般是在exchange中,才会标识为M=0。
5、exchange状态:这个状态中,路由器会相互发送包含LSA头部的DBD,用来同步LSDB的摘要。
6、load状态:这个状态中,路由器会根据DBD同步好的LSDB去发送LSR,LSU,同步整张LSDB。
7、full:在这个状态下,DRother和DR/BDR之间建立了完全邻接状态(full)

九、LSA泛洪的三个重要的参数:序列号,校验和,老化时间
我大概摘要的说一下:
序列号:每一个LSA都会有一个序列号,这个序列号主要的作用是用来标识这条LSA是否为最新的LSA。当有更新的LSA的时候,序列号会自动增加1。序列号是32位有符号数,初始的号貌似是随机的。假如说达到最大的值的时候,就会删除LSDB中老的LSA,LSA老不老,是根据老化时间来看的。
老化时间:LSA最大的生存时间是3600秒,就是一个小时。ospf不是30分钟就会泛洪一次LSA么,这个目的是为了保证LSDB中的LSA是同步的,没有错的,现在还有效的。这个时候,老化时间就会清零。保证老化时间没有达到3600秒。当需要删除老的LSA的时候,就会把该条LSA的老化时间设置为3600秒,泛洪这条老化时间为3600的LSA,像其他路由器表示清除这条LSA。
这里需要注意的是,LSA没过30分钟就会泛洪一次,这个工作是由该LSA的始发路由器先泛洪的,泛洪给DR,然后再由DR泛洪给所有的路由器。而且这个泛洪,是基于每一条LSA的。也就是说,每一条LSA都有一个自己的计时器,30分钟就泛洪。这么多的目的是为了防止每个30分钟,链路的路由流量就会统一泛洪,对网络造成影响。还需要补充的一点是,为了增加LSA泛洪的效率,每次泛洪一条确实不利于网络的利用(每个包都有一个包头,内容却只有一条LSA,不太好)。所以LSA泛洪设置了一个抖动时间,默认是4min,这么做的好处是,一条LSA泛洪,在36-34分钟内,如果有其他的LSA也泛洪,那么他们可以放在一起泛洪。
校验和:16位的整数,计算了除老化时间(因为老化时间是不停变化的)以外LSA的所有部分。每过5min就校验一次,用来保证路由器里面存储的LSA的正确性。


十、LSA新旧比较的方法
1、先比较LSA的序列号、大的说明更新
2、序列号相同,比较校验和,如果校验和大,说明更新(我也不明白为什么)
3、校验和相同,比较老化时间,如果老化时间为3600,那么说明这条LSA是最新的LSA(因为要删除这条LSA。)
4、如果两条老化时间相差大于15min,选择老化时间最小的那条LSA
5、上面的都比不出来,说明两条LSA是一样一样的。

十一、引用RFC2328、邻接关系的创建过程
A-------------------B
1、A:hello:DR=0.0.0.0,已知邻居,0
A发出hello,说不知道DR是谁,已知邻居为0,告诉B
2、B:hello:DR=B,已知邻居,A
B发出hello,说我比较出来,发现咱们来之间我是DR,我已经知道了A这个邻居
这时候A收到了B发出的hello包,发现B已经知道了自己这个邻居。
3、A:空DBD:seq=x,I=1,MS=1,M=1
A发出空的DBD,说明自己的序列号为x,是初始的DBD(i=1),自己是主路由器(MS=1),这不是最后一个DBD(M=1)
4、B:空DBD:seq=y,i=1,MS=1,M=1
B发出空的DBD,声明自己的序列号为y,是初始的DBD(I=1),我的routeID更大,我才是真正的主路由器,你一边完蛋去(MS=1),这不是最后一个DBD,后面还有(M=1)。
5、A:DBD:seq=y,i=0,MS=0,M=1
A发出DBD,A承认B为主路由器,所以A为从,序列号遵循B给的序列号y,确认一下(我认为这个包就是这样的作用)
6、B:DBD:seq=y+1,i=0,MS=1,M=1
B发出DBD,开始发送LSDB的摘要,实际是LSA的头部信息。LSA头部信息已经足够标识每个LSA了
7、A:DBD:seq=y+1,i=0,MS=0,M=1
A发出DBD包,使用的还是B刚发过来的这个序列号,表示确认刚才收到的数据包。
8、A、B之间重复上面6、7的过程,不停的发送DBD,用来同步LSDB的摘要。直到B发出M=0的包,说明没有更多的摘要了,LSDB的摘要已经发完了。然后A回复一个摘要,说OK,我知道了,M=0。
9、A:LSR
A发送LSR,根据自己的刚来的LSDB的摘要(DBD),请求相关的信息LSA,来填充自己的LSDB。
10、B:LSU
B发送LSU,根据A发来的LSR,回复相应的完整的LSA。
11、重复9.10两个步骤。
12、LSDB同步完成,进入完全邻接状态。

这个知识点只是对于第八个知识点的又进一步的说明。根据上面的情况,大概可以这么对照起来
down:1之前应该是,或者包括1。 这个地方没有详细的说明。我觉得分的不是很明确。(这里我用我觉得最明确的解释来说明)
init:实际上是过程1的时候B的状态。(收到了没有包含自己信息的hello包)
2-way:在2阶段。A就进入了双向阶段。实际上,后面这里虽然没有解释B是不是进入2-way状态,自己想想,A、B之间的hello是在不停的发送的。所以B肯定也很快进入了2-way状态,只是这里没有详细说
exstart:3、4、5。用来确定主从关系的。
exchange:6、7、8。交换DBD包,同步LSDB摘要
load:9、10、11。通过DBD交换的摘要信息,来发送LSR,LSU。填补整张LSDB
full:12

上面这个虽然是RFC给的标准例子,但是看完以后,我有了很多困惑
在exstart阶段,确立了主从关系,A为从,B为主。主(B)主动的发送DBD,让B去同步。但是B不一定就是DR啊,主从关系是根据routeID来选举的。但是DR最先考虑的是优先级,也就是说假如B的优先级大,但是routeID小,那么B就是DR,但是并不是主。或者整个广播型网络已经收敛完成了,DR已经选举好,这时候又加进来一台路由器。他肯定不是DR,因为DR已经选举了,并且不能抢占。这时候新加进来这台路由器,她应该向DR同步DBD,也就是说DR先发送DBD,但是假如新加进来的这台路由器是主。那主拿什么去同步给DR啊。
这个我做实验,而且也验证了,debug ip ospf adj。上面的情况确实发生了。而且也是严格按照RFC的那样,去发送包的。所以我认为可以这么理解主从关系:主从关系只是确立了谁先发送DBD数据包。但是同步实际上是双向同步的。

十二、ospf的路由更新过程总结概括(多路访问)
通过上面那些解释,现在可以明白。实际上,所有的路由同步,都是在full状态下同步的。也就是说,只有建立邻接关系的路由器之间才能同步LSA。2-way之间不发送LSA。
当一台路由器的路由信息发生改变,它会发送LSA,使用allDRadress地址224.0.0.6。去发送给DR和BDR,然后DR再去同步给其他的所有DRother。这个情况也可以适用于新进来的一台路由器。

十三、LSA泛洪
概括的说,ospf虽然是触发更新,依靠hello保持邻居关系。但是每条LSA在每隔30分钟的时候,还是会泛洪一次。这个前面也已经说了。

十四、路由器收到LSA后的行为
1、DRother发现收到的LSA比自己的更,那么添加到自己的LSDB中去,并且发送回去一个LSACK,用来确认。如果DR收到了,还要泛洪该条LSA,给所有的DRother。
2、路由器收到了一条LSA,和自己的LSA一样。丢弃该条LSA,并且回复LSACK。用来确认
3、路由收到一条LSA,比自己的LSA更,那么丢弃这条LSA。并且发送自己的LSA给发来的路由器。这个貌似DR,DRother都适用。

十五、常用的6种LSA,这个就很重要了
1类LSA。路由器LSA:自己的routeID,自己直连的链路信息。每一个路由器都会发送。
2类LSA。网络LSA:自己的端口IP和掩码,以及多路访问所链接的所有路由器。只有DR可以发送。
3类LSA。区域汇总LSA:向不同区域宣告区域间的信息。由ABR发出
4类LSA。ASBR汇总LSA:只是通告了ASBR的信息,ASBR的IP,掩码为0.0.0.0,以及度量值。由离ASBR最近的ABR发出。
5类LSA。自制系统外部LSA:宣告自制系统外部的路由信息。由ASBR发出。需要注意的是,5类本身是可以穿越整个ospf系统的。
7类LSA。NSSA外部LSA:作用和五类的LSA一样。但是只能在NSSA区域传播。在ABR上,7类会转变成5类,然后在别的区域内传播

1LSA:router lsa

a、位于ospf自制系统的每台路由器都可产生(所有路由器)

b、自报家门,介绍自己直连的链路信息,以及自己的router id

c、仅仅在本area区域传播

show ip ospf datebase

show ip ospf date route

2LSA:network lsa

a、由广播型的DR产生(只有DR才能产生)

b、宣告DR的位置和router id

c、仅仅在本区域传播,不能穿越ABR

show ip ospf datebase network

3LSA:network summary lsa

a、只能有ABR产生

b、将本区域的路由信息通过ABR传到其他区域

c、可以穿越整个ospf自制系统

show ip ospf date summary

4LSA:ASBR summary lsa

a、由离ASBR最近的ABR产生

b、宣告ASBR的位置以及router id

c、传播至整个ospf自制系统

show ip ospf date asbr-summary

5LSA:EXternal lsa

a、由ASBR产生

b、宣告非ospf自制系统的路由信息

c、传播至整个ospf自制系统

show ip ospf date external

7LSA:NSSA LSA

a、只有位于NSSA区域的路由器才可以产生

b、将和NSSA区域相连的external自制系统的路由器转变为7型的LSA穿过stub区域,到达ospf自制系统

c、仅仅在NSSA区域传播,当其传播至ABR时,会由7型转变为5型。

   NSSA区域:屏蔽5LSA,产生7LSA



十六、ospf区域类型
1、普通区域,这个我就不说了,1-5类都是可以传播的
2、stub区域。可以传播1-3类的LSA,在stub区域上,ABR将使用汇总LSA(3类)向这个区域宣告一条简单的缺省路由,到ospf外部的AS。stub区域不能有ASBR
3、totally stub区域(cisco私有):可以传播1、2类的LSA,在完全stub区域上,ABR将使用汇总LSA(3类)向这个区域宣告一条缺省路由,不光到外部AS,到其他的区域,也会使用这条缺省路由
4、nssa区域。可以传输1-3类以及7类LSA。没有生成缺省路由
5、totally nssa区域(cisco私有):可以传播1、2、7类LSA,我印象中也是可以生成缺省路由的。好想是到ospf其他区域的信息走缺省路由,到ASBR外部的走ASBR宣告进来的路由。

astub区域:

位于stub区域的路由器会将5型的LSA全部过滤掉,即不接收external自制系统的路由。  自动形成一条o*IA的缺省路由

router ospf 110

area 1 stub

stub区域的工作原理:通过拒绝5LSA实现拒绝其他自制系统的路由,从而可以坚少性能比较低的边缘路由器表的大小,从而节省路由器的cpu及内存等的开销。

stub区域的条件:

该区域不是area 0

该区域里面没有ASBR

该区域不要创建虚链路

btotally stub区域

过滤掉5型的和34型的LSA,自动形成O*IA的缺省路由

router ospf 110

area 1 stub no-summary

cNSSA区域

当位于末节区域的路由器连接一个小的external自制系统,且该路由器想将external自制系统里面的路由传至ospf里面,此时需要使用NSSA区域,用7型的LSA传送路由。

注:由于NSSA区域上游路由器不会自动向该区域注入缺省路由,所以需要手工注入缺省路由。

router ospf 110

area 1 nssa

router ospf 110

area 1 nssa default-information-originatenssa区域注入缺省路由。

只有NSSA区域不会产生缺省路由

dtotally NSSA区域

过滤345LSA,会自动形成缺省路由

router ospf 110

area 1 nssa no-summary

凡是带有totally的特殊区域都是cisco私有的。