ospf建立邻居关系到全ospf区域收敛完毕,可以互相通信,ospf的报文就是维护ospf区域之间联通的必然因素。
让我们来看看ospf的各种报文以及他们的作用吧:
先来topology:

R1与R2:12.1.1.0/24

R2与R3: 23.1.1.0/24

R3与R4:34.1.1.0/24

R1与R5:15.1.1.0/24

R5与R6: 56.1.1.0/24

R3 loopback 0:3.3.3.3/24

R4 loopback 0:4.4.4.4/24

R5 loopback 0:5.5.5.5/24

R6 loopback 0:6.6.6.6/24

 

 

当然R2与R3先要问个好,先发hello包了

这里说下ospf建立neighbor关系的必要条件与报文格式:

ospf Header:

 

versionmessage typelengthRouter ID

Area

ID

checksum

auth

type

auth

 

Data

 

version:为8个bit,v1用于实验,v2用于ipv4,v3用于ipv6

message type:为8个bit,用于标识packet的内型。共有5种

1表示hello packet

2表示database description packet

3表示request packet

4表示update packet

5表示ack packet

length:为16个bit,表示ospf报文的头部与数据部分的长度

Router ID:为32个bit,用于表示该packet由谁发出的,router-id在ospf整个区域具有唯一性,至于怎么选出的:

1、手工指定router-id

2、最大的ip地址的loopback接口的ip地址

3、最大的ip地址的物理接口的ip地址

Area ID:为32个bit,用于表示发出这个packet的router属于那一个area。

checksum:为16个bit,做个校验呗

auth type: 为16个bit。认证内型,分3种:

0、没有认证

1、明文认证

2、MD5认证

auth:为64个bit,认证密钥。

Data:这个没有固定的length,因为各个packet包含的数据并不一样,看下面的hello packet就是知道了

想要建立neighbor的2台运行ospf的router,必须要求下面参数一致:

1、hello 与 dead time

2、Area ID

3、Auth

4、stub and flag

这个是配置成stub的R2发出的hello packet

 

再看看Area1没有被配置成stub area之前R2发的hello packet

 

大家看到没有?NO External Routing Capability(没有外部路由能力)

就这点上面不同。

在看看area1中R2在配置成stub 前后的发出的hello packet:

前:

 

后:

 

 

在这里正好说说运行ospf的router的状态变化:

在配置成stub之后,R2与R3之间的邻接关系会处于down的状态,看ospf是怎样从down状态(谁不认识谁)到达full状态(都是老朋友了,自己与对方地图一致)的

先是 down ---》 init

只要运行ospf的router,都会从down到init状态,只要发送hello packet到达组播地址就可以了。

init---》2way

当收到对方router的hello packet里面发现自己的router-id,就从init到达2way了,看到上面那幅图(R2前)没有,看到有active neighbor, 这里neighbor关系就建立起来,R2认识了R3.但是不熟,不与你共享我的LS 信息。当然hello packet不是neighbor建立起来就不发了,他还是每10s发一次(一般情况,有的环境是30s),如果40s(如果hello时间是30s,那 dead时间就是120s)没有收到neighbor发过来hello packet,neighbor就会被重置

从这里就要分network内型了:p2p与multi-access

p2p到这步,肯定就会到达full状态,邻居一定就会成邻接

MA到这步,hello应该是选出DR/BDR了,DROTHER只会与DR/BDR建立邻接关系,DROTHER与DROTHER之间就到此为止了,这是为了防止共享的LS信息重复,占用掉DROTHER同学的cpu与mem资源,以及link的bandwidth。

2way---》exstart

这里就是database description packet的作用了,他会先选择出一个主动发送自己database description的router,R2与R3都要抢这个权限,但是这个也是有要求的,谁的router-id大谁就是master,谁的 router-id小只能是slave了。这个就是DBD first packet的作用。

看第一个DBD packet(当然这个不论谁先发送):

这里是由R2先发的:

看DB Description,这里还有一个参数,接口mtu的值,在这里要提醒一句,如果MTU值不一致或者一个区域内的多台路由器的router-id被配置成相同也会导致邻接关系建成不起来。ospf状态就会卡在这里。

ospf DB Description这个字段大小是8个bit。

 看到0x07吧,看到init bot is set了没有,这是第一个DBD多,后面还有(More=1),我当然为主了(ms=1),还有一个重要参数:DD SEQ。后面会说道他的作用。

在看看R3发的:

 

看DBD:也是0x07,也是第一个(i=1),后面还有packet(m=1),我认为我是主(ms=1),DD SEQ=4434

当然谁master,谁slave很清楚了,谁router-id大谁就是master,这里当然是R3是master,R2是slave了。

确定了主从,

exstart---》exchange

 R2发出

 看到R2的DD Destination字段没有,这不是我第一次发DD packet(i=0),后面还有更多的packet(m=1),我是slave(ms=0),我宣布我是从R3是主(DD SEQ=4434

在看看是LSA Header的内容:

 

LS Age这个应该指的是link state运行或者传输的时间

注意do not age 一会到不规则区域就会看到它的存在

下面就很简单了,

1、宣告者是谁

2、宣告那条route

3、宣告的是那类的LSA

4、LSA的SEQ(这个SEQ主要看大小,如果同号就是同一条LSA,router就直接丢弃的,如果比自己database里面的序列好大就新 的,就会放入database,然后发ack确认,然后flood,在进行spf计算,然后放进路由表,如果比自己的小,则告诉宣告者,我这个比较新,用 我的)

5、LSA的checksum

6、LSA的length。(这里长度我算了一下,很奇怪,前面ospf header一共32个字节,也就是说LSA header是从33个字节开始的,而且这个LSA是20个字节,我觉得可能是LSA的length,而这里只是一个描述截取的部分)

看看R3发出DBD packet

 

DD SEQ,对收到对方DBD packet做个一个隐式回应,我R3是master,收到你的packet了,你R2是slave,只能回应我发出的SEQ。如果我在一段时间内没有收 到你的DBD packet,我会在发一遍同样DBD packet。master/slave就是这个作用。

这里在看LS SEQ Number: 因为是配置stub才重置邻居关系,所以R3有2.2.2.2的路由,但是SEQ比R2那个要小,所以R3还是会向R2发request的。

 再看R2与R3交互DBD packet的结果

R2的主动告诉R3,这是我最后一个DBD packet了,我发完了(m=0)

R3回应 

我也发完了(m=0),我是master(ms=1),DD SEQ=4436,你R2(谁让你是slave)在给我确认一个,你不确认我在发,你确认我就不发了。

R2做出的最后确认,您R3是master,我听您的,谁让我是slave呢,SEQ=4436.(这个我觉得就像ack)其实呢,这个并不是立即就回复给R3的,而是发送一个LS Request之后。

 DBD packet说完了,下面到了request packet上场。

exchange---》loading

  DBD交互完成就到,该互相发送request,这里exchange状态就开始想loading状态发展了,loading顾名思义---加载LSA中。。。

R3首先发送LS Request packet:

我要LSA-1,宣告者为2.2.2.2的路由拓扑信息

    LSA-3,宣告者为2.2.2.2,路由为0.0.0.0,12.1.1.0,5.5.5.5,15.1.1.0的信息

看到没有没有external LSA(4/5)

 


R2也发出LS Request。

我要LSA-1,宣告者为3.3.3.3的路由拓扑信息

 

 R3回应给R2的LS Update packet,大家可以与DBD packet比较有那些不同,

DBD packet就是将完整的LSA,从LSA header里面的LS-type到length给截取下来了,length表示这条LSA的长度。少了整整16个字节,当然不是每个LSA都少这个个固定的字节数。

 

 


我在截个所有字节的显示的packet

首先是Number of LSAs:这个Update包含了5条LSA

      flag:我是ABR

      Number of link:一条link,拓扑以及路由:我直连的是一个stub network,我是通过23.1.1.0/24连接的,到该接口的metric是64.

在看看LSA-3,有什么不同

 

就多了一条路由:0.0.0.0,metric为1的。

 

看到没有LSA-3中并没有拓扑信息。只有路由信息,这也是为了节约link开销,与cpu,mem资源,减少接口震荡有关系,ospf本着只要各部门搞好自己的一亩三分地,整个ospf公司就好的。

再看看R3发给R2的LS Update packet

 

  

  R3告诉R2,我这里有2条type-1的LSA,都是stub 区域的,一条是23.1.1.0/24的,metric为64,没有配置ip tos字段,一条是3.3.3.3/32,我到达的metric是1.

R2与R3都把自己知道的LSA传给对方,那肯定要确定一下,对方收到没有,ack packet最后压轴登场了。

R2发送的ack packet,包含刚才R3发来的Update packet,就是对这个做的确认

R3发送的ack packet,包含刚才R2发来的Update packet,就是对这个做的确认

loading ---》 full

邻接关系建立成功,R2与R3交互了LSA。ospf在以自己为根,通过spf计算出到达destination的最优route,以达到link的收敛完毕。