OSPF包是怎样建立的
首先向所有邻居发送hello 包,建立邻居并放在自己的邻居表中。
然后在向邻居发送LSA,收到这个LSA的邻居,把LSA放进自己的数据库,运行
SPF算法,以自己为根生成一个最短路径树,这个最短路径数有两个特点,一
个是最短,一个是无环,最后计算机出来的最优路径放进路由表里边。
OSPF的5种报文:
 1)Hello:发现建立维持邻接关系。选择DR-BDR。
 2)DBD:包含路由的摘要信息。选主从关系,用于描述LSA报文的头部。
 3)LSR:链路状态请求。用于请求真正的LSA。
 4)LSU:它里面包含真正的LSA。
 5)LSAck:用于确认你收到的LSU。因为IP是不可靠的。
ospf 包是直接封装在IP包里的,协议号是89
有了这个98有什么用,我们就可以匹配OSPF的包了。
例如:
r2(config)#access-list 101 per 89 any any
r2#sh access-lists 101
Extended IP access list 101
    10 permit ospf any any
整个OSPF包头
version number    2
type 1 代表hello
type 2 代表DBD
type 3 代表LSR
type 4 代表LSU
type 5 代表LSACK
packet length
Route ID 标识你是哪台路由器
area ID  标识你是哪个区域的
check-sum
authen-tication type
authen-tication
data

当你的TYPE=1 的时候
hello 包里面有哪些字段
Router id
Hell and dead intervals *
Neighbors
Area id *
Router priority
DR ip address
BDR ip address
Authentication password *
Stub area flag *
* 为建邻居的必要条件。
如果要更改hello与 dead有如下方法:
例如:
r1(config)#int s1/0
r1(config-if)#ip ospf hello-interval 11 改R1的HELLO时间
r1(config-if)#ip ospf dead-interval 40  改R1的dead时间
改了HELLO时间 ,dead时间会跟着改;
改了DEAD时间,HELLO时间是不会改的。

回忆一下eigrp 包的协商的过程 ,EIGRP在IP头部协议号为88  。
AB两台路由器,首先检查自己的HELLO包里的K值,AS号,认证是否一样,如果
一样放进的邻居表,UPDATE包发送路由更新,QUERY 查询邻居的路由信息,
REPLY ,应答邻居的请求,ACK,确认可靠的包。
 
OSPF 包:
一 DOWN state   表明还没有起来
二 Inite state  表明HELLO包初使的时候开始交换,AB两台路由器,A开始并不知道  B是它的邻居,于是发给你B,B收到到后检举HELLO里的四个字段,并且A加 到自己的邻居表中,后在发一个HELLO包给A。
三 TWO-WAY state 当A或B检测到对方发过来的HELLO包里有自己的时候,就形
成TWO-WAY state。TWO-WAY state也是有先有后的。TWO-WAY是双向连接,表
明邻居关系已经建立了。   TWO-WAY state 还要选   DR/BDR。
四 Exstart state 用于交换DBD数据包,选择主从关系。检测MTU。从第一个DBD包开始,表明邻接状态开 始建立。第一个DBD包是不包含LSA头部的,后面的每个包里面都包含了LSA头部的。如果我发给你的  DBD 包 没有LSA头部,你就会向我请求(LSR),然后呢我会发真正的LSU给你。你收到LSU以后还要回应我LSACK。
打个比方:
比如婚庆介绍所,你想找女朋友结婚。
你首先打电话跟婚庆介绍所建立好邻居关系,HELLO包建立。
然后婚庆介绍所就会把女孩的信息介绍给你,第一个女孩上海的,人怎么样,
一些基本的信息。第二个老外,人怎么怎么样,在校生,在这边读士的。一个
一个基本信息。这是头部信息,在DBD里面的。
那你收到这个DBD基本信息,很感兴趣,那你要向我请求它的详细信息了,这
是LSR,比如说:这个女孩的电话号码是多少,怎么约出来见面。这些详细信
息。那么这个时间婚庆介绍所就要把这些详细告诉给你吧,这是LSU里面有真正的LSA,就把全部信息都告诉给你了,但是婚庆介绍所这些信息不是全部免费的,肯定不是,那么你还要给你付出服务费吧,LSACK,用于确认这些信息。
五 Exchange State 交换DBD,LSU
六 Loading state 把自己放进拓扑表中进行计算。
七 Full state 表明邻接关系已经形成。
 
DBD包包含三个位 第一个DBD包用于协商主从关系。
DBD
I  M  M/S
1  1    1  
I位 代表初使位,当你是第一个包的时候就是1 ,后面的包就是0了。
M位 叫后继位,或者你把它理解成more 更多的意思,如果说这不是最后一个包,就是1,如果是最后一个包就是为0。
M/S位 叫主从位,叫master/slave位,一开始我并不知道别人,别也不知道我,都会认为自己是老大,一开始就是主,所以说111 就是7 所以就说开始的flag 就是7。
大家可以用debug 查看一下:
*Mar  1 05:28:30.366: OSPF: Rcv DBD from 2.2.2.2 on Serial1/0 seq 0xEC2 opt 0x52 flag 0x7 len 32  mtu 1500 state INIT
*Mar  1 05:28:30.366: OSPF: 2 Way Communication to 2.2.2.2 on Serial1/0, state 2WAY
*Mar  1 05:28:30.370: OSPF: Send DBD to 2.2.2.2 on Serial1/0 seq 0x888 opt 0x52 flag 0x7 len 32

OSPF里有两种确认方式,一种叫做显示确认,一种叫隐示确认。
显示确认就是说有一个单独的包,专门用来确认的,相以于EIGRPACK包就是用去确认的。在ospf 里面有一个LSACK专门用去确认LSU的。
DBD的这种就叫隐示确认,就是说发过来的DBD包它的seq 0x104c,我呢就发
给你的seq 0x104c跟你一样,就表你收到你的包了。到底和谁一样,和主的一
样。
怎样选主从关系:
用rotuer-id 来选主从关系的,router-id 大的为主,router-id小的为从。
还用接口地址大小,接口地址大的为主,接口地址小的为从。
 
比方说我两边端口不在同一个网段上面,子网掩码不一样能否建立邻居关系,
能不能,卷一上面写的不能完成对,是不完全的,有时呢,是可以的。
比如R1 s1/0 --------------------  R2 s1/0
R1:int s1/0                           R2: int s1/0
   ip add 10.0.0.1 255.0.0.0             ip add 10.0.0.2
255.255.255.0
   router ospf 1                          rotuer ospf 1
   router-id 1.1.1.1                      router-id 2.2.2.2
   netw 10.0.0.0 0.255.255.255 a 0        netw 10.0.0.0 0.0.0.255 a
0
r1#sh ip ospf nei
Neighbor ID     Pri   State           Dead Time   Address        
Interface
2.2.2.2           0   FULL/  -        00:00:33    10.0.0.2       
Serial1/0
r2#sh ip ospf nei
Neighbor ID     Pri   State           Dead Time   Address        
Interface
1.1.1.1           0   FULL/  -        00:00:31    10.0.0.1       
Serial1/0
现在看一下MTU对OSPF的影响,
MTU有两种,一种是MTU,一种是IP MTU
MTU 是二层的容量的概念,是指二层对三层留了多大的一个位置,就是说你三层的数据包下来的时候最大不能超过来。二层的MTU是1500 bytes。
IP MTU是一个三层的概要概念,就是说我把三层的包切成多少的包放到你二层,就是说我在接口分片包是多少。IP MTU受限于MTU,默认情况下三层跟二层是一样的。 MTU is 1500 bytes。
sh int s1/0 看接口二层信息
sh ip int s1/0 看接口三层信息
在建立邻接的时间会比较MTU,两边的MTU 必须一样。邻接建立成功后,更改
MTU是没有什么影响的。
比如R1 s1/0 -------------------- --------      R2 s1/0
R1:int s1/0                           R2: int s1/0
   ip add 10.0.0.1 255.255.255.0            ip add 10.0.0.2
255.255.255.0
   router ospf 1              rotuer ospf 1
   ip mtu 1300                           router-id 2.2.2.2
   router-id 1.1.1.1                   
   netw 10.0.0.0 0.0.0.255 a 0       netw 10.0.0.0 0.0.0.255 a 0
-------------------------------------------------------------------
r1#sh ip ospf nei
Neighbor ID     Pri   State           Dead Time   Address        
Interface
2.2.2.2           0   EXSTART/  -     00:00:38    10.0.0.2       
Serial1/0
r2#sh ip ospf nei
Neighbor ID     Pri   State           Dead Time   Address        
Interface
1.1.1.1           0   EXSTART/  -     00:00:37    10.0.0.1       
Serial1/0
-------------------------------------------------------------------
---------
可以在接口下输入一个语句让它忽略MTU的比较。
int s1/0
ip ospf mtu-ignore 语句在mtu小的上面的输入。输入完建立成功。(不建立
打)
r1#sh ip ospf nei 
Neighbor ID     Pri   State           Dead Time   Address        
Interface
2.2.2.2           0   FULL/  -        00:00:37    10.0.0.2       
Serial1/0
OPSF包跟三层的包大小有关系,跟二层的没有关系。
maintaining routing information
我们刚才实验是串口直边发的是224.0.0.5,在多访问链路会选出DR,BDR所有的设备都和DR,BDR形成邻接关系,在它们这间交换LSU。所有路由器发往DR BDR的地址是224.0.0.6。而所有的DR BDR发往其它路由的是224.0.0.5.我们来打个比方,这条链路就相当于一个村落,而DRBDR相当于里面的村长副村长,村长副村长住在村委办室里,这个里面的是224.0.0.6 那其它的村民呢,在外面住DRother,它们是224.0.0.5,村民要去找村长,要到224.0.0.6 里面,村长副村长要下来视查工作的时候要到224.0.0.5 里面。
村长副村长怎么选出来的,
靠三点选出来的 
1点
wait-time 等待时间 ,就是说一开始认为人人都是是村长,比如有一个人,
有多少时间没有人反对它当村长,那它就是村长。这个时间跟Dead时间是一样
的。
r2#sh ip ospf int s1/0
Serial1/0 is up, line protocol is up
  Internet Address 192.168.12.2/24, Area 0
  Process ID 1, Router ID 2.2.2.2, Network Type POINT_TO_POINT,
Cost: 64
  Transmit Delay is 1 sec, State POINT_TO_POINT,
  Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit
5
    oob-resync timeout 40
    Hello due in 00:00:04
  Supports Link-local Signaling (LLS)
  Index 1/1, flood queue length 0
  Next 0x0(0)/0x0(0)
  Last flood scan length is 1, maximum is 1
  Last flood scan time is 0 msec, maximum is 4 msec
  Neighbor Count is 1, Adjacent neighbor count is 1
    Adjacent with neighbor 1.1.1.1
  Suppress hello for 0 neighbor(s)
我们修改Dead这个时间会跟着变。
串口的网络类型是对点对
以太口网络类型是广播

2点
优先级 ,默认优先级是0 ,在接口下更改ip ospf priority (0-255)优先级
越大,越容易成为村长,当优先级为0 的时候不参加任何选举。
3点
router-id ,router-id 大的为村长。
那我们这个router-id 又是哪来的呢?第一个手工指定,第二个如果没有环回口就是最大的物理接口地址,如果有环回口就是环回口接口地址。
在多址网络,子网掩码必须要一样。

如果有个255优先级的路由加到我原本有DR-BDR的网络,是不能抢占DR-BDR角
色的,是不行的。当DR消失的时候,BDR马上接替成为DR.那个255优先级的人
现在可以成为BDR。
建好邻居就可以向邻居发送DBD,DBD里包含LAS头部,如果你有兴趣就会像我
发送LSR吧,如果我接收到这个LSR就会向你发送这个LSU吧,LSU里机包含真正
的LSA。最后你收到这个LSU要给我发一个LSACK。最后这个LSACK包含LSA头。
收到LSA以后就会放进自己的LSDB里面。
通过序列号来比较LSA,序列号是32位,有4个字节表示。一共从0x80000001到
0x7fffffff.
查看 r1#sh ip ospf database
            OSPF Router with ID (1.1.1.1) (Process ID 1)
                Router Link States (Area 0)
Link ID         ADV Router      Age         Seq#       Checksum Link
count
1.1.1.1         1.1.1.1         1086        0x80000005 0x0048DB 2
2.2.2.2         2.2.2.2         1091        0x80000007 0x0034E0 2
                Net Link States (Area 0)
Link ID         ADV Router      Age         Seq#       Checksum
192.168.12.2    2.2.2.2         1092        0x80000005 0x008723
每一个区域都有一个自己单独的数据库,在同一个区域内部,所有的路由路它
们的database 相同。
我们在数据库的时候要注意以下几个地方:
1区域号,2类型,3Link ID,4  ADV Router 5 age 老化时间
因为OSPF是周期性的更新,每30分钟会更新一次,其实为什么会有30分钟更新
一次呢?如果不定义周期性的更新,到时这个更新就没有用了,过期了。什么
时间过期呢,是它的age时间超过3600秒的时候。在它快要老化时候我就把它
泛洪一次,序列号加1 。这个序列号总有一天会、7fffffff的时间,它会发
一个age时间为3600秒的0x7fffffff出去,大家收到之后会删除这个条目,那
下次不管发给你多少,你都会接收了吧。我在从0x80000001发一个相同的条目
出去。这就是序列号与AGE时间联合使用。