OSPF的网络类型

2022-11-23 186192 编程学习


根据路由器所连接的物理网络不同,OSPF将网络划分为四种类型:广播多路访问型(Broadcast
multiAccess)、非广播多路访问型(None Broadcast
MultiAccess,NBMA)、点到点型(Point-to-Point)、点到多点型(Point-to-MultiPoint)。 

广播多路访问型网络如:Ethernet、Token
Ring、FDDI。NBMA型网络如:Frame Relay、X.25、SMDS。Point-to-Point型网络如:PPP、HDLC。

designated
router(DR):多路访问网络中为避免router间建立完全相邻关系而引起大量开销,OSPF在区域中选举一个DR,每个router都与之建立完全相邻关系.router用Hello信息选举一个DR.在广播型网络里Hello信息使用多播地址224.0.0.5周期性广播,并发现邻居.在非广播型多路访问网络中,DR负责向其他router逐一发送Hello信息

  backup designated
router(BDR):多路访问网络中DR的备用router,BDR从拥有adjacency关系的router接收路由更新,但是不会转发LSA更新

  OSPF areas:连续的网络和router的分组.在相同区域的router共享相同的area
ID.因为1个router1次可以成为1个以上的区域的成员, area
ID和接口产生关联,这就允许了某些接口可以属于区域1,而其他的属于区域0.在相同的区域的router拥有相同的拓扑表.当你配置OSPF的时候,记住必须要有个区域0,而且这个一般配置在连接到骨干的那个router上.区域扮演着层次话网络的角色

  boradcast(multi-access):广播型(多路访问)网络.比如以太网,允许多个设备连接,访问相同的网络;而且提供广播的能力.在这样的网络中必须要有1个DR和BDR

  nonbroadcast multi-access(NBMA):这类网络类型有帧中继(Frame
Relay),X.25和异步传输模式(Asynchronous Transfer
Mode,ATM),这类网络允许多路访问,但是不提供广播能力
  point-to-point:点对点网络.一个物理上的串行电路连接或者是逻辑上的,不需要DR和
BDR,邻居是自动发现的
  point-to-multipoint:点对多点网络.不需要DR和BDR

[page]
Open Shortest Path First (OSPF,开放最短路径优先协议) 

OSPF是动态连接状态路由协议,其保持整个网络的一个动态的路由表并使用这个表来判断 
网络间的最短路径,OSPF是内部使用连接状态路由协议,协议通过向同层结点发送连接状态信 
息(LSA)工作,当路由器接收到这些信息时,它就可以根据SPF算法计算出到每个结点的最短 

路了。其他相临路由器通过使用OSPF的Hello协议每10秒发送一个问候包给224.0.0.5,然后接 

收这些路由器发回的信息。一个OSPF的hello信息包头可以通过iptraf来嗅探到,如下所示: 

OSPF hlo (a=3479025376 r=192.168.19.35) (64 bytes) from
192.168.253.67 to 224.0.0.5 on eth0 

192.168.253.67边界路由器发送一个helo信息包给多播(224.0.0.5)来告诉其他路由器和主机怎样从192.168.19.35联系区域a(a=3479025376). 

一旦路由器接受到Hello信息包,它就开始同步自己的数据库和其他路由一样。 

一个LAS头包括以下几个部分: LS age, option, LS type, Link state ID, Advertising
Router ID, LS sequence number, LS checksum, 和
length. 


这5种类型形式上的差异在于:

 

1)是否选举DR  

2)是否自动发现邻居 

3)更新时间

 

这5种NBMA类型应用上的差异在于:

 

1)NBMA拓扑是否是Full-Mesh 

2)NBMA接口是否在同一IP子网

3)Frame-Relay 在定义Map时是否支持广播,即是否加了关键字broadcast。

 

       
默认情况下OSPF 不能通过NBMA接口自动与邻居建立邻接关系,RFC
2328为OSPF在NBMA拓扑中的运行定义了两种模式:NBMA和点到多点,分别对应的接口模式为:

 

ip  
ospf  
network  
non-broadcast  
/   point-to-multipoint

 

       
在Non-Broadcast 模式下是模仿OSPF在广播型链路中的运行,通常在Full-Mesh 者Partial-Mesh
使用,如果不是Full-Mesh必须手动选举DR/BDR。路由器接口处于同一IP子网,手动指定邻居,选举DR/BDR且必须与DRother在VC上直连。

 

       
在 Point-to-Multipoint 模式下是将NBMA视为一系列点到点的集合,通常用于Hub-and-Spoke
者Partial-Mesh,接口处于同一IP子网,使用OSPF组播自动发现邻居,不选举DR/BDR。

 

Cisco为NBMA多设计了三种模式,分别为广播,点到多点非广播和点到点。

 

ip  
ospf  
network  
broadcast 

 

ip  
ospf  
network   point-to-multipoint
non-broadcast 

 

ip  
ospf  
network  
point-to-pioint

 

       
1.
如果说non-broadcast是在模仿广播型链路,那么broadcast就是将NBMA完全当成广播型链路,使用OSPF组播Hello来自动发现邻居,而不是像non-broadcast为每个PVC提供一个LSA拷贝。应用这种模式的前提是NMBA拓扑为Full-Mesh,且在FR
Map中使用了关键字broadcast。

 

       
2.
如果在VC上没有启用组播和广播功能,即定义Map时没有使用关键字broadcast,那么就要应用point-to-multipoint
non-broadcast 相应的取消组播hello功能,代以手动配置邻居。

 

       
3.
如果链路中涉及多个子网,那么一定要用到Point-to-Point类型,也一定会用到子接口。子接口分为两种模式,点到点和点到多点,其中点到多点子接口和主接口配置方式一致,而点到点子接口则有些变化:

 

interface
Serial0/0                                                  
interface Serial0/0.2 multipoint

encapsulation
frame-relay                                     
ip address 20.1.1.1 255.255.255.0

frame-relay lmi-type 
ansi                                     
ip ospf network point-to-point

interface Serial0/0.1
point-to-point                       
frame-relay map ip 20.1.1.2 105 broadcast

ip address 10.1.1.1
255.255.255.0      

如何解决Python中NumPy无法处理非数值型数据的问题_通过object类型定义

NumPy数组拒绝字符串或字典,因其默认dtype(如float64)要求同构数值类型;混入异构元素会强制转换失败或静默转为'U'丢失结构,设计初衷是高效数值计算而非通用容器。 NumPy数组为什么拒绝字符串或字典? 因为默认的dtype(如float64、int32)只接受同构数值,一旦混入字符串、None、列表或自定义对象,NumPy会尝试强制转换——失败就报ValueError:settin...

Pandas 批量转换 ASCII 列的正确方法:避免数据丢失与类型污染

使用df[cols].apply(lambdax:x.map(chr))会导致意外丢弃NaN行和非目标列,根本原因是apply(axis=0)在混合类型下触发隐式类型对齐与广播;应改用applymap()(pandas<2.1)或map()(pandas≥2.1)配合filter()安全处理。 使用`df[cols].apply(lambdax:x.map(chr))`会导致意外丢弃nan行...

为什么Python 3.9之后的类型注解更好用_使用内置容器类型替代typing

Python3.9起可用list[str]替代List[str],因PEP585使内置类型原生支持泛型,消除typing导入负担,提升可读性与类型检查稳定性。 直接用list[str]而不是List[str]是因为语法更直白 Python3.9之前,你必须从typing模块导入大写类型名,比如List、Dict、Tuple,哪怕你实际操作的是小写的list()或dict()。这种大小写割裂让新人困...

Python 中解决类相互引用时的 MyPy 类型检查失败问题

在Python类相互引用场景中,直接使用未定义的类名作为类型注解会导致MyPy报错(如“Namealreadydefined”)。本文介绍两种标准、兼容且类型安全的解决方案:字符串字面量前向引用和from__future__importannotations。 在python类相互引用场景中,直接使用未定义的类名作为类型注解会导致mypy报错(如“namealreadydefined”)。本文介绍...

如何在不复制类型提示的情况下复用外部函数的参数类型进行类型推断

通过typing.typealias提取并复用外部函数参数类型,可避免硬编码类型、提升类型一致性与可维护性,尤其适用于无法修改源码的第三方库场景。 通过typing.typealias提取并复用外部函数参数类型,可避免硬编码类型、提升类型一致性与可维护性,尤其适用于无法修改源码的第三方库场景。 在Python类型检查(尤其是mypy)实践中,常遇到这样的需求:你调用一个来自外部库的函数(如inne...

如何在Python中实现PyTorch的生成对抗网络_构建Generator与Discriminator

PyTorch中GAN的Generator和Discriminator需严格对齐数据维度、通道数、尺寸与归一化策略:Generator输出通道CH必须等于数据集通道数(如MNIST为1、CIFAR-10为3),最后一层用Tanh或Sigmoid;Discriminator输入尺寸和通道数须与Generator输出完全一致,并在forward开头加assert校验;BatchNorm2d在Gener...

Python中如何判断异常是否为特定类型_使用issubclass进行异常类比对

判断异常实例类型应使用isinstance(exc,ValueError),而非issubclass(type(exc),ValueError);后者冗余且易错,isinstance语义清晰、支持子类、性能更优。 用isinstance判断异常实例类型,别用issubclass 直接说结论:判断一个异常对象是否属于某类(比如ValueError或其子类),该用isinstance(exc,Valu...

如何正确处理 Python 中的文本流与字节流类型兼容性问题

本文解析因混用TextIO与IO[bytes]类型注解导致的AttributeError:'_io.StringIO'objecthasnoattribute'buffer'错误,指出根本原因在于sys.stdout是文本流(TextIO),其.buffer属性仅在底层字节缓冲区可用时存在,而某些环境(如pdoc、测试中使用的StringIO)不提供该属性。 本文解析因混用`textio`与`io...