第17章OSPF路由协议的软件模拟与设计要点

上传人:s9****2 文档编号:493311268 上传时间:2023-11-12 格式:DOC 页数:61 大小:1.41MB
返回 下载 相关 举报
第17章OSPF路由协议的软件模拟与设计要点_第1页
第1页 / 共61页
第17章OSPF路由协议的软件模拟与设计要点_第2页
第2页 / 共61页
第17章OSPF路由协议的软件模拟与设计要点_第3页
第3页 / 共61页
第17章OSPF路由协议的软件模拟与设计要点_第4页
第4页 / 共61页
第17章OSPF路由协议的软件模拟与设计要点_第5页
第5页 / 共61页
点击查看更多>>
资源描述

《第17章OSPF路由协议的软件模拟与设计要点》由会员分享,可在线阅读,更多相关《第17章OSPF路由协议的软件模拟与设计要点(61页珍藏版)》请在金锄头文库上搜索。

1、第17章 OSPF路由协议的软件模拟与设计第 17 章 OSPF 路由协议的软件模拟与设计Internet 是一个分组交换网络,一个源节点应用程序所产生的数据分组要到达目的节点的 对等层应用程序, 通常要经过若干中间交换节点的转发中继, 除非源和目的节点既在同一条数 据链路上又在同一个子网中。 如果转发设备是路由器或三层交换机, 则设备中的数据链路层协 议负责将待转发数据帧沿给定的数据链路传递到相邻的下一个节点, 而网络层协议则要负责路 由选择,即从可达目的节点的多条转发链路中选择出一条最佳的数据链路。路由有两种类型: 静态路由和动态路由。静态路由即网络管理员手工配置的路由,这种路由有两个主要

2、的缺陷: 一个是不能对路由设备或链路的失效以及网络拓扑的变化做出反应, 一个是不适合于具有复杂 拓扑结构的大规模网络(可扩展性) 。因此,当需要管理的网络不是小型网络时,就需要使用 动态路由。动态路由是路由选择协议根据网络中所有路由器及其接口链路的当前状态自动计算 生成的。 路由选择协议能够自动检测路由设备及其接口链路的状态,能够自动适应网络拓扑的变化。开放最短路径优先协议( OSPF, Open Shortest Path First )是一个基于链路状态算法、适 合大型复杂网络、 具有高效健壮特性的动态内部网关协议 (工业上将路由器被称为网关) 。“开 放最短路径优先” 的名字来源于以下事

3、实: ( 1)这个协议基于 Dijkstra 的最短路径优先 ( SPF, Shortest Path First)路由算法。(2)开放”反映了这个标准是开放的标准而不是一个私有的标 准,这与一系列由特定厂商专有的或专用于某种特定网络的链路状态协议形成了对比,如 Novell Netware 的链路服务协议 NLSP(Netware Link Servise Protocol )、IBM SNA 的高级对等 网络协议 APPN(Advanced Peer-to-Peer Networking )和 ATM 的专用网间接口协议 PNN(I Private Network-to-Network I

4、nterace )。作为开放和通用标准运动的主要倡议者 DEC 公司为该协议 做了最初的大部分工作,并把它作为了私有产品 DECnet 体系结构的一部分。OSPF起源于1979年Bolt、Bera nek和Newma n公司为ARPANET开发的“新的实验性路 由算法”以及随后 ISO 为 OSI 开发的 IS-IS 路由协议,是 John T. Moy 等人在 1987 年为克服 RIP 协议耗费带宽资源多、 应对链路故障或拓扑变化收敛速度慢、 适应树状拓扑结构难等缺点 而开发的。OSPF最初的其它功能需求还包括:(1)采用更具描述性的路由度量值,以摆脱RIP 协议网络直径最大 15 个路由

5、器跳步的限制,以及可以将延时、带宽等其它路由度量因素考虑进来。( 2 )可利用等代价的多条路径,以达到均衡负载等转发策略。(3)具有路由选择的层次结构,以适应大规模复杂网络以及树状层次网络拓扑结构。(4)支持更灵活的子网化技术,以适应变长子网掩码以及更进一步的无类别域间路由。(5)保证安全性,避免伪路由器通过发布默认或其它路由而使路由选择过程陷入混乱。( 6)为保证可信性而区分内部和外部路由信息,内部路由信息可覆盖外部路由信息。虽然OSPF还支持基于服务类型 TOS的路由选择,允许为每个不同的 TOS配置不同的链 路度量值并建立不同的路由表,但基于 TOS的路由选择从未在In ternet上流

6、行。OSPF的各个 版本间是不兼容的。 第 1 版的 RFC 1131 定义于 1989年, 目前的第 2版在 RFC 2328 中有详细说明,1999年12月,IETF发布了基于IPv6的OSPF标准RFC2740,并称之为 0SPFv3。17.1对等层协议模拟基础知识17.1.1标识符命名和编写规范标识符命名和编写规范为了使程序易于理解和维护,在一个项目中的代码编写要遵循统一的规范。由于这种规范并不是强制的,因此,有时也将其称为风格。 在此只对本章程序代码中结构、类、函数、变量、常量等标识符在命名时所遵循的规范和保持的风格进行说明。标识符命名有两种风格:Unix风格和 Windows风格。

7、以网络接口数据结构为例,按照两种风格定义的数据结构比较如下:Network In terface )的Unix风格struct ifnet struct ifnet*if_ next;struct ifaddr *if_addrlist; char*if_ name;Windows 风格 struct IfNet struct IfNet*struct IfAddr*char*m_pNext; m_pAddrList; m_szName;struct ifqueue struct mbuf *ifq_head;struct IfQueuestruct Mbuf* m_pHead if_sndm

8、_Se nd综合上述两种标识符命名风格,本章的程序代码采用了如下的标识符命名规范:(1)结构、类和函数的标识符均要包括一个标识其所属功能层次或程序包的前缀,前缀 和标识符以下划线“ _”隔开,女口 PHY_、DRV_、DEV_、ARP_、OSPF_、SNMP_等。另外, 组成标识符的每个英文单词的首字母大写,其余字母小写。(2) 常量标识符均采用大写字母。另外,函数返回的提示性常量标识符均添加“RV_ ” 前缀。例如:const int RV_OKco nst int RV_FAILURE 在协议分组格式的设计中, 组中各字节通常都是对齐的:10为了使协议分组在常见的计算机体系结构下易于处理,

9、协议分4字节字段从偏移量为 4的倍数的字节单元开始,而2字节字段从偏移量为偶数的字节单元开始。排列整齐的分组使得在协议实现时可以采用诸如“分组模板”等数据结构,从而使分组收发程序的实现得以简化,效率也得以提高。为了便于将描述协议分组的数据结构与分组格式相对照, 从而使之更容易阅读和理解,在通用头文件中定义了常量标 识符 BITS_8、BITS_16 和 BITS_32。#ifndef BITS_8#defi neBITS_8un sig ned char#en dif#ifndefBITS_16#defi neBITS_16un sig ned short int#en dif#ifndefB

10、ITS_32#defi neBITS_32un sig ned long#en dif(3) 变量标识符中单词均使用小写字母,结构和类的成员变量名前加m_ ”前缀。(4) 除了指针和句柄变量名前必须分别添加前缀“p-”和“ h-”外,其余变量名前通常不加表示数据类型的前缀(如数值前缀“n-”,布尔前缀“ b-”,字符串前缀“ sz”,等等),只有在通过以下两种方式无法标识变量的数据类型时,才采用标注前缀的方法:一种方式是通过变量名中包含的特征单词来标识数据类型,例如,包含size、number、length、count、interval、time、index等单词的变量均为数值变量,包含单词n

11、ame、path的变量总是字符串变量,布尔变量名均以助词is或do开始。另外一种方式是通过“就近声明”的原则来省略数据类型前缀。(5) 对于过长或过多单词构成的标识符,使用了通用和易理解的单词缩写或单词首字头 缩写形式。这样做是为了使学生熟悉规范代码中的简写形式,从而有助于学生去阅读源代码。(6) 循环变量使用字母i及其组合(如ii和iii,字母i的重复次数表示循环嵌套层数), 或i、j和k分别表示循环嵌套的第 1、2和3层。循环嵌套层次不得超过3层。出于占用篇幅和易于阅读的考虑,在描述函数的实现时,构造函数、析构函数和一些实现代码比较简单的类成员函数都在头文件的类定义中进行了描述。但在实际的

12、课程设计中,还是应该将其定义在实现文件中。另外,许多语句的编写没有遵循统一的风格也是出于同样的原因。 如有的条件语句是分行编写的,有的则直接编写在了同一行上。在实际实现时,都应分行编写。17.1.2 进程间通信机制和线程间同步机制在进行模拟实现时,每台网络设备通过一个单独运行的进程来模拟,而网络设备上的每个驱动程序则通过进程下各个单独运行的线程来模拟。这样,就涉及到数据包在模拟不同设备的进程之间和在模拟不同协议层驱动程序的线程之间的传递问题。由于在单进程多线程环境中诸线程共享单进程的内存空间,因此,模拟不同协议层驱动程序的线程之间的数据传递问题并不难解决,只要将多线程共享的内存资源定义为进程中

13、的全局变量即可,这时不需要进程间的通信机制。但在多进程环境中,每个进程都有自己的运行空间,不同进程的运行空间是相互隔离的,因此,数据在不同进程之间的传递则要通过各种进程间通信机制(IPC,InterProcessCommunication )来实现。在模拟实现中,该问题是通过内存映射文件(MMF , Memory MappingFile)这一进程间通信机制来实现的。MMF缓冲区共享方案的原理是:首先,在一个单独的进程中调用函数CreateMMF生成一个由系统页文件支持的被命名的共享缓冲区。接着,需要使用缓冲区的进程用生成该缓冲区时所使用的名字调用函数OpenMMF打开共享缓冲区,并通过函数Ge

14、tMMFView将其映射到自己的进程地址空间中,就可以使用该缓冲区与其它进程交换数据了。注意,无论是生成还是打开共享缓冲区的进程,最后都必须调用FreeMMF,以释放文件映射(映射到内存页)句柄和文件视(映射到进程空间)句柄。在模拟实现中,线程间的同步问题是采用事件通知的方式解决的。其中,处理数据的线程调用函数 WaitForEve nt睡眠等待一个命名事件(Named Eve nt);提供数据的线程将数据送入 队列后,调用函数 SignalEvent通知该命名事件,唤醒因等待数据而睡眠的线程。os.cpp#ifndef _OS_H_#define _OS_H_#i nclude HANDLE

15、 CreateMMF(char*n ame, un sig ned int size) / Create a pagi ng file-backed MMF.HANDLE hFileMapp in gObject = NULL;hFileMappingObject = CreateFileMapping(INV ALID_HANDLE_V ALUE, NULL, PAGE_READWRITE, 0, size, TEXT( name);if (!hFileMapp in gObject)return NULL;if(GetLastError()=ERROR_ALREADY_EXISTS)CloseHa ndle(hFileMappi ngObject);return hFileMapp in gObject; /

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号