并不是ospf网络上一定存在DR和BDR,ospf根据链路层媒体不同可以划分为四种网络类型(或者叫接口工作模式)。
1、  如果路由器接口连接的是ethernet网络,那么默认ospf网络类型是Broadcast。该类型的网络支持DR和BDR。不需要手动设置邻居关系,自动选举DR和BDR。这种网络以组播地址(224.0.0.5网络上的所以路由器,224.0.0.6网络上的DR和BDR)发送协议报文。
2、  如果路由器接口连接的是X.25、Frame Relay网络,那么默认ospf网络类型是NBMA。该类型的网络选举DR和BDR。但是需要手动设置邻居关系,自动选举DR和BDR。这种网络以单播方式发送协议报文。
需要说明一下的是,NBMA网络必须是全连通的。
3、  如果X.25、Frame Relay网络不是全连通的,可以设置ospf接口的网络类型为point-to-multipoint。该类型的网络不选举DR和BDR,以组播地址(224.0.0.5)发送协议报文。
如果X.25、Frame Relay网络不是全连通的,但是某个路由器与其他设备全连通,我们也可以使用默认的NBMA网络类型,但是我们必须手动设置该路由器为DR,并手动在该DR上配置邻居关系。并不是非全互联网络上就一定没有DR。
4、  当链路层协议是PPP,HDLC,LAPB时,OSPF缺省认为网络类型是Point-to-Point。在这种类型网络中, 以组播地址(224.0.0.5)发送协议报文,不支持选举DR,BDR。
5、   网络类型是可以在路由器接口上进行设置的。
 
不同的网络类型所形成的Router LSA条目(一个LSA包含多个条目)中包含的内容略有不同。。。。
下面我们就来看看他们之间有什么不同:)
首先说明,Router LSA中有一个LINK TYPE字,指明链路类型:1=点到点、2=广播或者NBMA、3=末梢网络、4=虚连接
 
1、对于ppp网络,RTA生成的Router LSA内容如下:
本地信息:
Link ID = 20.0.0.0 ;本网段的地址
Link Data = 0xff000000 ;本网段的掩码
Type = 3 ;连接的是 stub network
对端信息:
Link ID = 20.0.0.2 ;邻接点RTB的路由器标识(router id)
Link Data = 20.0.0.2 ;邻接点RTB的IP地址
Type = 1 ;连接的是 point-to-point network
metric = 9 ;从该接口发送报文的花费值
 
这样就可以无歧义的生成路由。
 
2、对于X.25网络,RTA生成的Router LSA内容如下(BroadCast网络和NBMA网络的LSA内容相同):
Link ID = 30.0.0.2 ;本网段中DR的IP地址
Link Data = 30.0.0.1 ;RTA连接到本网段的接口的IP地址
Type = 2 ;连接的是 NBMA network
metric = 9 ;从该接口发送报文的花费值
 
路由计算时,如果查找的type=2的Route LSA,需要根据DR生成的Network LSA来计算路由。(我猜的)
 
3、对于Frame Relay网络,RTA生成的Router LSA内容如下:
本地信息:
Link ID = 40.0.0.1 ;本接口的IP地址
Link Data = 0xffffffff ;本网段的掩码
Type = 3 ;连接的是 stub network
metric =2 ;从该接口发送报文的花费值
 
对端信息:
Link ID = 40.0.0.2 ;邻接点RTF的路由器标识(router id)
Link Data = 40.0.0.2 ;邻接点RTF的IP地址
Type = 1 ;连接的是 point-to-point network
metric = 9 ;从该接口发送报文的花费值
 
Link ID = 40.0.0.3 ;邻接点RTE的路由器标识(router id)
Link Data = 40.0.0.3 ;邻接点RTE的IP地址
Type = 1 ;连接的是 point-to-point network
metric = 9 ;从该接口发送报文的花费值
 
这样就可以无歧义的计算路由。
 
4、上图中RTA的10.0.0.0网段没有连接任何RT(或者连接的RT的接口都没有运行ospf),这种网络叫做STUB,RTA为STUB网络产生的router LSA内容如下:
Link ID = 10.0.0.0 ;本网段的地址
Link Data = 0xff000000 ;本网段的掩码
Type = 3 ;连接的是 stub network
metric =2 ;从该接口发送报文的花费值
 
在路由器向其他设备通告LSA的时候还需要加上一个头(head)。以下是Head的结构。
  Type: Router                /LSA的类型,可以看出此例是异地中情况的LSA/
  Ls ID:1.1.1.1               /LSA的标示/
  Adv rtr: 1.1.1.1               /生成LSA的路由器/
  Ls Age:   40                  /本条LSA的老化时间/
  Length:   108                 /LSA的长度/
  Seq#     70000001             /LSA的序号/
  Cksum:   0x3543               /校验和/
  Link Count:7                  /本条LSA中包含的连接个数/
 
从上面的描述我们可以发现,不同的网络类型生成的Router LSA内容不同。我们还可以发现,所有的Router LSA中都有一个Type字段,该字段对计算路由很有用,那么路由到底如何计算呢?Type字段又起到什么作用呢?下面我们简单说说:
 
当路由器初始化后,会根据邻居信息以及本地配置信息生成Router LSA发送出去,路由器根据LSA形成LSDB。当区域中所有路由器的LSDB同步后,会根据spf算法计算路由。
每一台路由器都已自己为根节点来使用SPF算来计算路由。拿上图来举例说明:RTA收到每台路由器传来的LSA后形成LSDB,然后打开LSDB进行每一段的搜寻。当检索到Type字段为StubNet(Type=3)的时候,RTA知道描述的是一条路由,于是将这条路由添加到自己的路由表中(实际上,这些路由是RTA的本地接口路由)。当检索的LSA中Type字段为Router(Type=1)的时候,RTA知道它是与一台路由器相连(从这条LSA中可以获知相连路由器的接口地址和Router ID以及到达相连路由器的花费)。这个时候,路由计算会停止,RTA会根据Link ID寻找与其相连路由器生成的LSA。因为在LSA的Head中有Router ID,所以,RTA会以Router ID为关键字进行检索从而计算出到RTB的路由,并添加到路由表中。假设RTB还与RTC相连,那么RTA在查找由RTB生成的LSA时,会发现RTB生成的LSA中Type字段也为Router,这个时候RTA停止计算,重新以RTC的Router ID为关键字在LSDB中检索,然后将RTC的路由添加到自己的路由表中,同时RTA得知通过RTB可以到达RTC,在添加路由Metric值时就将RTC到RTB,RTB到RTA的Metric值相加,得到RTA到达RTC的Metric。
 
根据上面的描述,我们发现,路由计算的过程中,遇到Type=3的LSA会生成一条路由;遇到Type=1的情况,会根据Link ID寻找与其相连的路由器的LSDB,进行路由计算。这大概就是Type字段的作用吧。只有遇到Type=2的LSA条目如何处理,个人觉得可能需要查找DR生成的Network LSA来生成路由。
 
对于point-to-point、point-to-multipoint、stub网络,路由器都会生成一条Type=3的LSA,用于路由计算时生成到该网段的路由。至于BroadCast和NBMA网络的路由如何生成,还有待学习。