在学习OSPF建立邻居关系之前我们再来回忆一下RIP协议建立邻居的过程。在运行RIP协议的路由器A启动之后会向邻居路由器B发送一个请求报文,邻居收到后回应一个确认报文。然后路由器A将自己已知的所有报文发送给路由器B,并且每隔30秒周期性的向自己的邻居发送。那么这样一个看似简单的过程有什么弊端呢?首先,RIP协议每个30秒周期性的发送是为了确保一台路由器发生故障后能够更新路由表。所以这每隔30秒周期性的发送报文包含了大量的路由信息实际上是一种浪费。因为如果网络没有发生变化,这些报文是没有实际意义的。OSPF把维护路由信息报文和更新的路由报文这两种报文分开来发送。如下图所示:
RT1启动之后发送一个Hello报文,Hello报文中包含了DR的地址,以及是否发现了邻居。在此图中,Neighbors Seen=0说明还没有发现邻居。RT2收到RT1发送来的Hello报文后,也向RT1发送一个Hello报文,这个报文中告诉RT1,DR为RT2,同时告诉RT1已经发现了RT1是自己的邻居。RT1收到RT2发回来的回应报文后,这种状态我们称之为邻居关系。在建立了邻居关系后,RT1就开始向网络发送LSA。但实际上,在网络连接起来后,每台路由器中的大部分路由都是相同的,这个时候如果RT1仍旧将自己所知的所有LSA发送给RT2那么也会造成浪费。
所以,在RT1向RT2发送LSA之前,会告诉RT2那些路由是自己需要的,那些是自己不需要的。在前面我们讲到过在OSPF发送报文的时候会在LSA报文前加一个Head,在这个Head中包含了LSA的标示,就可以区分每条LSA。所以,RT1只需要向RT2发送Head就可以了,从而大大减少了发送的信息量。当RT2收到所有的Lsa的Head后会与自己本地的LSA中的Head进行比较,如果有不同的则向RT1发送请求。
然而, LSA报文是基于IP的报文,IP的特点是不可靠尽力而为的转发。所以LSA必须建议一种机制来确保对方能够准确无误的收到了自己发送的报文。所以LSA建立了一种类似TCP的确认和超时重传机制,来保证报文的准确无误的发送和接收。在图示中,RT1向RT2发送一个DD报文,在第一次发送的DD报文中不包含任何LSA信息,i代表了这时RT1发送给RT2的第一个报文,M代表了后面还有更多的报文,而MS则告诉RT2自己是主发送,而谁的MS大谁就决定了使用谁的发送次序(Sq),只有MS才能够在发送报文是将序号加一,在上图中我们可以发现RT2成为了MS。当发送报文中的字段M=0得时候,就可以确认报文已经发送完。此时,RT1才会向RT2发送LS requese报文。RT2收到LS request报文后,发送LS Update报文,最有由RT1发送LS ack确认报文。通过这一系列的报文发送,每台路由器就可以形成一个相同的LSDB。