这个问题网上一搜答案一把,不过这里稍微增加一些细节内容。
路由器开启OSPF之后会和相邻路由器建立两种关系:邻居关系和邻接关系。邻居关系是路由器状态机停留在2way状态,邻接关系是路由器状态机达到full状态。
一、成功建立邻居关系需要达到2way状态,说明路由器双方完成了交互hello报文,而观察hello报文的头部字段即可知道路由器建立邻居关系的条件:
1.router-id唯一
2.区域号相同,如:同属area 0
3.认证方式相同
4.网络掩码相同
5.hello报文的发送间隔时间相同
6.路由器死亡时间间隔相同,一般是hello报文发送间隔的4倍
还有一个比较特殊,即路由器优先级,在广播网络里,如果路由器的优先级都是0,说明路由器是DRother,而DRother之间只能达到2way状态即建立邻居关系,是不能达到full状态的,即不能建立邻接关系。
二、达到2way状态后,路由器之间开始交互DD报文,而DD报文头部字段里有一项MTU,思科路由器是需要比较MTU的,如果两个路由器的MTU不同,是不能建立邻接关系的,只能停留在2way状态,而华为路由器之间是不比较MTU的。如果是思科路由器和华为路由器互联,MTU需要保持一致,否则不能建立邻接关系。
刚开始学习OSPF时想到一个问题,如果两个路由器通过网线相连,而互联接口的地址一个配置为1.1.1.1,另一个配置为2.2.2.2,其他建立邻接关系需要的条件都满足,由于上面所述条件中并没有要求互联接口的地址必须在同一个子网里(当然实际上肯定是需要的),所以这种情况下到底能不能建立邻居关系和邻接关系呢,事实上肯定是不能建立的,那么到底为什么不能建立呢?你需要的条件我都满足了啊,问题到底出在哪里呢?于是通过实验做了一番研究。
将互联接口地址配置为1.1.1.1/24和2.2.2.2/24并将网段发布出去之后,在链路上抓包,发现路由器之间可以正常发送hello报文,但仅此而已,连2way状态都没有达到,甚至init都没有。
将2.2.2.2修改为1.1.1.2后再重新发布后可以正常建立邻接关系了,观察抓的包发现,发送DD报文前路由器会先发送一个ARP报文,进一步研究发现,原来hello包的目标地址是组播224.0.0.5,而DD包的目标地址是单播的,所以需要ARP解析来得到对端的MAC地址,但这应该并不影响邻居关系的建立,可是为什么刚才连2way状态都没有到呢?进一步想到OSPF报文是封装在IP报文内的,并进一步封装在数据链路层的,而数据链路层是以太网,以太网的本质是共享介质的,共享介质就要求路由器要在同一个子网下,路由器收到hello包,发现发送端源地址跟自己不在同一个子网 ,于是将hello包丢弃,所以是无法到达2way状态的。