OSPF中有4种基本的网络类型:BMA,NBMA,P2P,P2MP。在这4种网络里,OSPF的5种报文所采取的单播或者多播的发送方式是不同的,分别如下:BMA网络:一般情况下,以组播形式发送Hello报文、LSU报文和LSAck报文,以单播形式发送DD报文和LSR报文。

2. NBMA网络:所有报文都以单播形式发送。

3. P2P网络:所有报文都以多播形式发送。

4. P2MP网络:Hello报文以多播形式发送,其他报文以单播形式发送。

其中BMA网络也就是广播类型的网络,这种网络类型最为常见,报文的发送形式也稍微复杂一些,下面也着重介绍一下广播类型网络下的报文发送形式。

上面说到在BMA网络里“一般情况下”是这样的,那么不一般的情况下是什么样的呢?这里面以LSU报文最为特殊,如果大家抓包分析一下应该会发现,LSU报文有的时候是单播的,有的时候是多播的,那么什么时候是单播的什么时候是多播的呢?

当路由器主动发送LSU来更新网络的链路信息时,发送的LSU是多播的,因为如果是DR/BDR主动发送LSU,肯定是希望网络中所有的DRother都能收到,如果是DRother主动发送LSU,也肯定希望网络中的DR和BDR都能收到,而DR/BDR和DRother的地址都是多播地址。

当路由器是响应LSR来发送LSU时,发送的LSU的单播的,因为此时路由器已经知道具体是哪个路由器向自己请求的LSA,所以回复时采用单播LSU,发送LSR的路由器收到LSU后,再以组播的方式将汇总的LSU泛洪到网络里。

这里再补充一下LSAck为什么是组播的。

LSAck是对LSU中LSA的确认,分两种情况:DR/BDR连接的链路发生变化。(这里以DR连接的链路发生变化举例子)此时DR将LSU以224.0.0.5的组播地址泛洪给DRother和BDR,而后DR和BDR都需要DRother发送LSAck以确认收到了LSU报文,从而DR和BDR都知道DRother收到了LSU。而DRother也会要求BDR发送LSAck以确保BDR收到了DR发送的LSU,进而知道DR和BDR的链路状态数据库是一致的,所以DRother以224.0.0.6的组播地址发送LSAck,BDR以224.0.0.5的组播地址发送LSAck。

DRother连接的链路发生变化。此时DRother A将LSU以224.0.0.6的组播地址发送给DR和BDR,DR收到后会把LSU重新封装后发给网络内的DRother,最初发送LSU的DRother A也会收到这个新的LSU,此LSU内包含之前A发过的LSA信息,从而使得DR向A隐含确认了。BDR收到A发来的LSU,会发送目标地址为224.0.0.5的LSAck报文来向所有的DRother确认,以说明BDR和DR都有A发的LSU里的LSA的信息,从而保证了链路状态数据哭 库的一致性。