OSPF 是典型的链路状态型路由协议.它使用COST(开销)作为度量,根据拓扑表通过SPF算法获得以自己为根的到达目标的最优路径.它使用三张表:邻居表,拓扑表,路由表,通过这3张表,每个路由器都能独立的获得前往每个目标的路径,而不象距离矢量协议那样依靠邻居来发现路由.确保了路由的真实可靠.

邻居neighbor与邻接关系adjacency:
邻居:如果两台路由器共享一条公共数据链路,并能够成功匹配它们各自的hellp报文里的一些指定参数,那么它们就构成了邻居
邻接关系:在邻居的基础达成的更深一层关系,邻接关系建立后,将在彼此之间发送LSA信息.
(邻居未必构成邻接关系,但构成邻接关系的一定是邻居.)
具体的连接关系建立方式根据OSPF网络类型的不同而有所差异,对于广播型网络(如LAN)需要先选举出DR/BDR路由器后,所有非DR/BDR的路由 器(DRother)与DR/BDR构成邻接关系,并将LSA信息发送给DR和BDR,随后DR再将这个LSA复制给所有其他路由器,实现LSA在整个网 络区域里的泛洪.对于点对点网络类型,则路由器之间自动就形成了邻接关系,不需要选举DR/BDR.对于NBMA(非广播多路访问)网络类型,则需要手工 指定邻居,然后选举出DR/BDR(全互连不不要人工干预,部分互连需要人工干预将与所有路由器都有直联链路的路由器指定为DR).还有另外2种OSPF 网络类型就是点到多点(广播)和点到多点非广播,对于点到多点广播型(point-to-multipoint)可以将多点看成一系列的点到点类型,这样 支持了广播就不需要手工指定邻居,也不需要DR/BDR,对于点到多点非广播类型(point-to-multipoint non-broadcast),因为没有了广播,所以要手工指定邻居,但不需要DR/BDR.
这里要提示一点:
FRAME-RELAY 有点到点子接口类型(point-to-point)和多点子接口类型(multipoint)两种,默认情况下cisco认为点到点子接口的侦中继是 OSPF中的点到点网络类型,也就是说配置了interface serial s0.1 point-to-point命令后,相当于在接口上默认配置了ip ospf network point-to-point命令.侦中继多点子接口默认则对应了OSPF网路类型里的NBMA网络类型,因此需要选举DR/BDR以及手工指定邻居.当 然你完全可以在配置好frame-relay的multipoint后 在子接口上指定ospf网路类型为ospf的点到多点(广播) 命令是:ip ospf network point-to-multipoint,指定成点到多点(广播)那就不需要DR/BDR了,邻居也能自动发现了.

OSPF分组类型:
1.hello 2DBD数据库描述 3LSR连路状态请求 4LSU连路状态更新 5LSack确认分组
这5种分组都被封装到ip分组里,协议类型用89表示.

HELLO分组:作用:建立和维持邻居,利用它包含的信息进行DR/BDR的选举.在广播型链路上缺省间隔10秒,NBMA网络缺省30秒.可以通过ip ospf hello-interval来更改.HELLO报文包含以下内容:
1.ROUTERID
2.AREAID
3.DR/BDR的ip地址
4.hello间隔和失效间隔
5.邻居(在失效时间内被收到hello报文的邻居)
6.路由器优先级
7.身份验证密码
8.末节区域标记
蓝色部分表示要建立邻居双方路由器的hello信息里必须匹配的,否则无法建立双向通信(2way)

邻居状态机:
在成为邻居或邻接状态之前,路由器要经历的几个状态
1.(Down)失效状态.邻居会话的开始状态
2.(Attempt)尝试状态,该状态仅适合NBMA网络,在NBMA网络里,邻居是手工指定的,具有DR资格路由器会把邻居路由器的状态转换为Attempt状态.(此时用hello间隔代替poll间隔)
3.(Int)初始状态,这个时候还刚开始准备建立2-way双向通信状态,邻居路由器在死亡间隔内收到了hello信息,并且把所有发送这个hello信息的路由器ID放倒自己hello信息里的邻居字段中发送出去.
4.2-way状态,双向通信状态,当路由器从邻居路由器收到的hello信息里发现自己的RID后,双向通信就建立了.
注意:在建立双向通信状态后,邻居路由器就可以有资格成为DR/BDR了.另外:如果在初始状态下收到一个LSA报文,那么就会直接进入2-way状态.
建立2-way状态后,路由器已经成为邻居了.
5.(Exstart)预启动状态,也叫信息交换初始状态,在这个状态下路由器建立主从关系,创建DBD报文初始序列号,为DBD交换做好准备.具有高接口ip地址的成为主路由器.
6(Exchange)信息交换状态,在这个状态下路由器将向邻居路由器发送自己LSDB(链路状态数据库)的DBD(数据库摘要)报文,同时并发LSR请求.
7.(Loading)信息加载状态,这个状态下路由器向邻居发送LSR信息,向邻居请求获得LSA通告.其实这一步在第6步的时候已经开始了.
8.(Full)建立完全邻接关系.
其实个人认为:从2-way状态开始后的预启动,交换以及加载3个状态完全针对需要形成邻接关系的设备之间,如广播型网络上的DRother与 DR/BDR之间, 普通的邻居不会有第8种关系(建立2way就够了).,普通的DRother之间只是用hello信息进行keeplive工作以及要成为邻居的基本几个 要素的判断(hello间隔/失效间隔/vareaid/验证密码/末节区域标记)

LSU的扩散过程:
路由器发现链路状态发生改变后,使用多播地址224.0.0.6将LSU分组发送给DR/BDR,LSU中包含更新后A的LSA条目.根据
DR/BDR都接收到LSU,DR使用224.0.0.5多播地址将更新发送给其他路由器.当然前提是DR是要对始发LSU的路由器进行确认的,通过在广 播网络上进行再分发LSU的方式进行了隐式确认(始发路由器也会收到扩散的LSU从知道DR已经收到了它发送的LSU),当然DR也可能通过发送明确的确 认报文来确认.如果得不到确认那么就会重传这个报文.
路由器收到LSU后根据里面的LSA信息来更新其LSDB(如何保证正确的更新,下面将会讲到).然后通过SPF算法重新计算路由.

可靠的泛洪及可靠的LSDB更新:
3个机制:序列号,校验和,老化时间
序列号确保不乱传LSA
校验和确保不错传LSA和不留错误LSA在数据库里
AGE老化时间确保LSA不是过期无效的,协助序列号复位时,(通过将LSA的AGE设置成最老时间,然后泛洪这个LSA,所有路由器确认后就可以重新泛洪新的LSA,就可以让所有路由器使用新LSA).只有始发路由器可以提前设置老化时间.
LSDB更新机制:
1.比较序列号,大的认为始更新的.
2.如果序列号相同.比较校验和,大校验和的LSA认为是新的
3.如果序列号 校验和都一样,比较老化时间,如果差别多于15分钟,认为小的老化时间的是新的.另外,如果只有一条LSA拥有最大生成时间的老化时间,认为这个LSA是新的.(初始序列号或者想清除某一条LSA时候用?没大搞懂)
4.上面都不能辨认新旧,那就认为一样新吧.