基于omnet的ad hoc网络仿真大学论文.docx

上传人:b****7 文档编号:25438850 上传时间:2023-06-08 格式:DOCX 页数:49 大小:388.23KB
下载 相关 举报
基于omnet的ad hoc网络仿真大学论文.docx_第1页
第1页 / 共49页
基于omnet的ad hoc网络仿真大学论文.docx_第2页
第2页 / 共49页
基于omnet的ad hoc网络仿真大学论文.docx_第3页
第3页 / 共49页
基于omnet的ad hoc网络仿真大学论文.docx_第4页
第4页 / 共49页
基于omnet的ad hoc网络仿真大学论文.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

基于omnet的ad hoc网络仿真大学论文.docx

《基于omnet的ad hoc网络仿真大学论文.docx》由会员分享,可在线阅读,更多相关《基于omnet的ad hoc网络仿真大学论文.docx(49页珍藏版)》请在冰豆网上搜索。

基于omnet的ad hoc网络仿真大学论文.docx

基于omnet的adhoc网络仿真大学论文

摘要

本文主要工作是介绍OMNeT++仿真平台,并基于OMNeT++搭建Adhoc网络环境来进行仿真试验。

首先是详细介绍OMNeT++仿真器的构成原理,尤其是对其NED语言和编程语法等做深入讲解,同时也对OMNeT++的移动框架(MF,MobilityFramework)组成原理进行了系统的讲解,因为它为我们提供了仿真无线移动网络所需各种基本模块,把我们从设计底层的模块结构和拓扑结构中解放出来,让我们能够把精力放在具体协议的实现上,加快了搭建仿真网络的过程,最后是进行Adhoc网络仿真环境的搭建,并在该环境中对在计算机网络中常用来检测网络连通性的Ping命令进行了仿真试验,并对抽取所需的数据进行分析。

关键字网络仿真OMNeT++Adhoc网络

 

Abstract

ThemainworkofthisthesisintroducestheOMNeT++,andorganizeaAdhocnetworkforthesimulationtestbasedonOMNeT++.Firstly,itintroducesthestructureofOMNeT++indetail,especiallyitsNEDlanguageandthesyntaxofprogram,aswellasOMNeT++’sMobileFramework(MF,MobilityFramework)principle,becauseitprovideswithbasicmodulesforwirelessandmobilenetworksimulation,andfreefromthedesigningofthebottomofthemodule’sstructureandtopological,sothat,itcanputmoreeffortsontheachievementoftherealizationoftheprotocol,speedupthesimulationprocess.Atlast,itorganizesanAdhocnetwork,andsimulatethePinginstruction,whichisalwaysusedinthecomputernetworktodetectthenetwork’sconnectivity,atthesametime,itcollectstherequireddataforanalysis.

KeywordsNetworkSimulationOMNeT++AdhocNetwork

 

目录

摘要I

AbstractII

第1章绪论1

1.1课题背景与意义1

1.2本文的主要工作2

1.3本文的组织结构3

第2章OMNeT++基础4

2.1OMNeT++简介4

2.2OMNET++框架6

2.2.1OMNeT++组成6

2.2.2OMNeT++框架7

2.3OMNeT++语法8

2.3.1NED语言8

2.3.2简单模块算法实现和消息传递11

2.4MF移动框架14

2.4.1主机模型14

2.4.2信道控制模块16

2.4.3基本概念18

第3章Adhoc网络基础22

3.1AdHoc网络的概念22

3.2Adhoc网络特点23

3.3Adhoc网络协议栈25

3.4Adhoc网络的应用领域26

第4章Adhoc网络仿真的实现29

4.1仿真试验29

4.1.1NIC模块30

4.1.2移动模块32

4.1.3网络层模块32

4.1.4信道控制模块35

4.1.5应用层模块36

4.2仿真结果分析37

4.2.1丢包分析37

4.2.2往返时延分析38

4.2.3数据分析38

结论39

致谢40

参考文献41

附录1外文文献译文43

附录2外文文献原文48

 

第1章绪论

1.1课题背景与意义

由于研究方向的不同,许多领域,并不太适合采用实地试验的方式,或者是为了节省时间、资金等目的,最好采用仿真的方式。

比方说电路仿真、生物仿真,还有接下来我们要谈到的网络仿真。

网络仿真也被称为网络模拟,因为对各种网络仿真过程来说,其中也有“模拟”的含义,即网络仿真不但可以取代真实的应用环境得出可靠的运行结果和数据,也可以模仿一个系统过程中的某些行为和特征。

顾名思义,网络模拟,就是用计算机程序对通信网络进行模型化,通过程序的运行模仿通信网络的运行过程。

那么,为什么要进行通信网络的仿真呢?

在网络迅速膨胀的今天,网络研究人员一方面要不断思考新的网络协议和算法,为网络发展做前瞻性的基础研究;另一方面也要研究如何利用和整合现有的资源,使网络达到最高效能。

无论是哪一方面都需要对新的网络方案进行验证和分析。

进行网络技术的研究一般有以下3种手段:

(1)分析方法,就是对所研究的对象和所依存的网络系统进行初步分析,根据一定的限定条件和合理假设,对研究对象和系统进行描述,抽象出研究对象的数学分析模型,利用数学分析模型对问题进行求解。

(2)实验方法,就是设计出研究所需要的合理硬件和软件配置环境,建立测试床和实验室,在现实的网络上实现对网络协议、网络行为和网络性能的研究。

(3)仿真方法,应用网络仿真软件建立所研究的网络系统的模拟模型,在计算机上运行这个模型,并分析运行的输出结果。

然而,前两种方法都存在很大的局限性。

分析方法的有效性和精确性受假设限制很大。

当一个系统很复杂时,就无法用一些限制性假设来对系统进行详细描述。

实验方法的局限性在于成本很高,重新配置或共享资源很难,运用起来不灵活。

而仿真方法在很大程度上可以弥补前两种方法的不足。

仿真方法可以根据需要设计所需的网络模型,用相对较少的时间和费用了解网络在不同条件下的各种特性,获取网络研究的丰富有效的数据。

网络仿真无疑提供了一个方便、高效的验证和分析方法,因此网络仿真技术在现代通信网络设计和研究中的作用正变得越来越大[1]。

无线移动网络的迅速发展,特别是Adhoc网络已成为当今无线移动网络领域研究的热点,使得我们对Adhoc网络的性能研究变得越来越重要。

对于欲建的网络应用系统,网络设计者需要验证其设计方案的可行性,以有效投资建立最优网络环境;对于新提出的网络协议我们需要验证其性能;网络规模越大,网络性能的计算机仿真和性能分析工作越显重要。

目前国外网络仿真技术已经相当成熟,已经有几种极为优秀的网络仿真软件。

而国内由于起步较晚,并没有自主研发的仿真软件,或者是虽然有自主研发的软件,但是只能够应用于极为狭隘的特定项目,不能够对其他的研究者提供广泛的支持。

因此,学习和使用国外现有的一些网络仿真软件,对于现阶段国内的研究者来说,是有极大帮助的[2]。

仿真软件按照发行渠道来划分,有两大类:

商业软件和非商业软件。

前者的代表有OPNET、COMNETIII,后者则有NS-2、PARSEC、OMNET++等。

因为商业化的网络仿真软件,其价格是非常昂贵的,而OMNeT++做为一个具备强大功能的免费仿真软件,是值的作为个人研究之用的研究者利用的。

1.2本文的主要工作

本文所做的主要工作是介绍OMNeT++这个优秀的网络仿真平台,并基于OMNeT++搭建Adhoc网络环境来进行仿真试验。

首先详细介绍如何使用OMNeT++,尤其是对其NED语言和编程语法等做深入讲解,同时也对OMNeT++的移动框架(MF,MobilityFramework)进行介绍,最后是进行Adhoc网络仿真环境的搭建,并在该环境中对在计算机网络中常用来检测网络连通性的的Ping命令进行了仿真试验,并将对相关的数据进行统计分析。

1.3本文的组织结构

本论文的主要目的是介绍OMNeT++及其移动框架,并搭建Adhoc网络环境进行仿真试验,全文的结构如下:

第1章简单地介绍了课题的背景与意义、本文的主要工作,并综述了本文的组织结构。

第2章从OMNeT++的应用领域和特点出发,阐述了OMNeT++框架,并对OMNeT++的组成和语法进行了详细的介绍,同时对应用于无线移动网络的移动框架的组成原理进行了讲解。

第3章简要介绍了Adhoc网络的概念、特点、协议栈及应用领域。

第4章从Adhoc网络各层的技术标准入手,参照OSI模型,利用OMNeT++搭建Adhoc网络仿真环境,并对计算机网络的Ping命令进行了仿真试验。

最后结束语部分对所做的工作加以总结,指出所做工作中的不足。

 

第2章OMNeT++基础

2.1OMNeT++简介

网络仿真(NetworkSimulation)是使用计算机技术构造网络拓扑、实现网络协议的模拟网络行为。

它是一种介于试验和计算的技术,通过建立实际系统的数学模型,并按照相同的运行机理模拟物理系统的动态行为。

它能获取特定的网络特性参数,进而可对网络性能进行研究和分析,达到改善网络运行状况的目的。

它包括网络拓扑仿真、协议仿真和通信量仿真,模拟网络流量在实际网络中传输、交换等的过程。

目前,知名的网络仿真软件主要有

OPNET,NS2,GIoMoSim,OMNET++。

OMNET++(ObjectiveModularNetworkTestbedinC++)是由AndrasVarga等1992年开始开发的一种强大的免费网络仿真软件,它是一个跨平台,源码开放的模拟环境,主要用于网络通讯、协议、多重处理机以及分布式处理系统的模拟和评估复杂软件系统性能。

OMNET++是基于离散事件的,所谓的离散事件系统是指Event(事件)只是在离散的时间点上发生,产生Event(事件)本身是不需要时间,两个接连的Event(事件)之间没有状态的改变。

计算机网络的工作机制正是一个这样离散系统,因此可以用离散事件的仿真工具进行模拟。

OMNeT++是一个面向对象的离散事件模拟器,它的全称是ObjectiveModularNetworkTestedinC++。

它是一种基于模块的,内核源代码完全开放的仿真软件,可以运行于Linux、Windows及DOS等多种操平台之下。

OMNET++可以应用于以下领域:

(1)模拟通信网业务流

(2)通信协议的仿真

(3)排队网络

(4)模拟多处理器和其它分布式系统

(5)任何离散事件系统

它能够建立目前几乎所有网络对象的基本模型之间的互连,并且使复杂的网络通信和拓扑结构得到高度切合实际的模拟和仿真。

一个OMNeT++模型是由具有层次结构的模块嵌套而成,嵌套的深度没有限制,这样使用者能够用这些模块建立起真实系统的拓扑结构。

模块之间通过传递消息进行通信,同时消息也能够是任意复杂的数据结构。

消息既能够直接传到目的地,也能够通过门和信道,按预先确定的路径传到目的端。

OMNET++具有以下几个特点:

(1)使用C++语言进行仿真,而C++语言具有广大的应用群。

(2)提供了一个图形的用户界面,可能动态地观察仿真程序的运行。

(3)使用参量的方试,可以不修改源代码和重新编译的情况下,对不同条件下的网络模型进行仿真。

(4)可以使用非常简易的NED(NetworkDescriptionLanguage)来代替C++完成网络拓扑的描述。

(5)可以使用变量观察函数及绘图功能将考察的变量实时地绘成曲线,也可以将仿真结果输到指定文件中,然后再用其提供的工具Plove绘成曲线。

(6)对硬件条件要求不高,运行速度较快,只想当于纯粹用C编写的1.3倍,而PARSEC是一个命令行模式的仿真器。

总之,OMNeT++一种强大的免费网络仿真软件,它是一个跨平台,源码开放的模拟环境,主要用于网络通讯、协议、多重处理机以及分布式处理系统的模拟和评估复杂软件系统性能。

OMNET++是基于离散事件的,计算机网络的工作机制正是一个这样离散系统,因此可以用离散事件的仿真工具进行模拟[3]。

OMNET++具有编程简单,易于掌握等特点,只要用户具有一定的C++语言知识就可以使用。

使用它的NED语言可以非常方便地构建一个网络模型,它还提供Plove作为输出参数的观察工具。

2.2OMNET++框架

2.2.1OMNeT++组成

OMNeT++主要由六个部分组成:

仿真内核库(SimulationKernelLibrary,简称Sim),网络描述语言的编译器(NetworkNescriptionCompiler,nedc),图形化的网络编辑器(GraphicalNetworkDescriptionEditor,GNED),仿真程序的图形化用户接口-Tkenv,仿真程序的命令行用户接口-Cmdenv,图形化的向量输出工具-Plove。

Sim是仿真内核和类库,用户编写的仿真程序要同Sim连接,Sim在OMNeT++中占据最为核心重要的地位。

下面详细介绍的另外两重要组成部分。

1.网络描述(NED)语言

NED(GraphicalNetworkDescriptionEditor)是模块化的网络描述语言。

网络描述包括大量的对组件的描述,如通道,简单和复合模块的类型。

这些组件描述可用于各种不同的网络描述中。

NED语言用来定义模型中的网络拓扑结构,较为简单的网络拓扑可以使用GNED,但复杂网络的拓扑描述还应该用NED源文件方式书写。

2.用户接口

OMNeT++的用户接口用于实现仿真程序的人机交互,OMNeT++允许模型内部机制对用户可视化,也允许用户启动和终止仿真,并更改模型内部的变量。

OMNeT++中的图形化接口是一个用户工具,可方便用户了解模型内部的运行机制。

用户接口和仿真内核的交互是通过一个已定义的接口实现的。

无需改变仿真内核,就可以实现不同类型的用户接口。

同样无需更改模型文件,仿真模型可在不同接口下运行。

用户可以在强大图形化用户接口下测试和调试仿真程序,并最后可在简单快速的用户接口中运行,而且该接口支持批处理。

目前OMNeT++支持两种用户接口,即Tkenv和Cmdenv。

对仿真进行的测试和调试可以在Tkenv接口下进行,Tkenv是一个简便易用的图形窗口化的用户接口,Tkenv支持跟踪,调试和执行仿真的功能。

它在执行仿真过程中的任意时刻都能够提供详细的状态信息。

Tkenv的主要特征有:

各模块的文本输出有其独立的窗口,仿真过程中可以在Tkenv窗口中看到自传消息,支持仿真动画,标记断点,具有检查窗口,可以检查和改变模型中的变量,执行过程中仿真结果的图形化显示并且结果可以用柱状图和时间序列图显示,仿真可重新进行,快照文件用于显示模型的详细信息。

Cmdenv接口用于实际的仿真实验,因为Cmdenv支持批处理。

Cmdenv是一个简便的小型命令行接口,执行速度快。

它可以在所有操作系统平台上运行。

Cmdenv可以一次批处理配置文件中所有的仿真。

2.2.2OMNeT++框架

OMNeT++具有模块化的结构,图2-1是OMNeT++仿真的高层体系结构。

图2-1的箭头表示两组件之间的交互,图中共有5个箭头,表示了组件间的5种关系。

(1)执行模型和Sim:

仿真内核管理将来的事件,当有事件发生时,仿真内核就调用执行模型中的模块。

执行模型的模块存储在Sim的main对象中。

执行模型依次调用仿真内核的函数并使用Sim库中的类。

(2)Sim和模型组件库:

当仿真开始运行创建了仿真模型的时候,仿真内核就实例化简单模块和其它的组件。

当创建动态模块时,仿真内核也要引用组件库。

实现在模型组件库中注册和查寻组件也是Sim的功能。

(3)执行模型和Envir:

ev对象作为Envir的一部分,是面向执行模型的用户接口。

仿真模型使用ev对象来记录调试信息。

(4)Sim和Envir:

由Envir决定创建何种模型,Envir包含主要的仿真循环,并调用仿真内核以实现必须的功能。

Envir捕捉并处理执行过程中发生在仿真内核或类库中的错误和异常。

(5)Envir和Tkenv,Cmdenv:

Envir定义了表示用户接口的TOmnetApp基类,Tkenv和Cmdenv都是TOmnetApp的派生类。

main()函数是Envir的一部分,为仿真决定选用合适的用户接口类,创建用户接口类的实例并执行。

Sim和模型对ev对象的调用通过实例化TOmnetApp类进行。

Envir通过TOmnetApp和其它类的方法实现Tkenv和Cmdenv的框架和基本功能[4]。

2.3OMNeT++语法

OMNet++是面向对象的离散事件模拟工具,为基于进程式和事件驱动两种方式的仿真提供了支持。

OMNet++采用了混合式的建模方式,同时使用了OMNet++特有的NED语言和C++进行建模。

2.3.1NED语言

NED语言包含的组件:

import指令,通道定义,简单和复合模块定义,网络定义。

此外,NED语言还可以定义自己的消息(message)格式。

具体格式说明如下。

1.import指令

用于从其它的网络描述文件引入声明。

在引入了一个网络描述之后,可以使用该网络的组件,如通道,简单和复合模块等。

2.通道定义

信道只能创建于相邻的层次之间,而不可以跨层建立。

换而言只,在一个复合模块内,简单模块之间能建立通道,简单模块与复合模块之间能建立通道,而不允许有一个简单模块与另一个复合模块内的模块之间有通道连接。

图2-2是复合模块中的各模块间通过通道连接的情况。

 

定义通道有三个可选的参数,即delay,error和datarate,这三个参数必须是常量。

delay是传播延时,单位为秒。

error是位误码率,即错误传输一位的概率。

datarate是通道的传输速率,单位为位/秒,用于计算包的传输时间。

下面是一个简单通道的定义。

channelChannelName

delay0.008//sec

errorle-8

daterate128000//bit/sec

3.简单和复合模块定义

在ned中,主要的实体是模块(module)。

模块分为两种,一种是简单模块(simplemodule),一种为复合模块(compoundmodule)。

模块有门(gates),模块之间通过门(gates)进行消息(message)传输。

(1)简单模块是网络中最基本的组成部分,是其它模块的基础,它通过自身的参数来表达真实世界的特性,同时它还可以被复合模块嵌套(nesting),并且嵌套的层次是无限的,通过这种方式,可以将外界的任何实体(如节点、交换机等)抽象为一个复合模块。

它的定义需要声明其参数和门。

简单模块名的首字母应当大写,而参数和门的名称应当小写。

下面是一个简单模块的定义。

simpleSimpleModuleName

parameters:

//…

gates:

//…

endsmple

简单模块的算法可以访问其声明的参数,参数类型可以定义成numeric,numericconst(简写为const),bool,sring或者xml。

也可以不定义参数类型,缺省的参数类型为numeric。

模块间连接的开始和终止点就是门。

门是模块的输入和输出接口,门有两种,即输入门(inputgate)和输出门(outputgate)。

还可以使用门向量,一个门向量包含多个门。

消息通过输出门送出而通过输入门进入模块内部。

OMNeT++只支持单向连接的门,那么在建立又向信道时,则需要在每端建一个输入门和一个输出门。

下面是门在模块中的声明格式。

gate:

in:

//gatename;

out:

//gatename;

(2)复合模块是由一个和多个子模块组成的。

子模块可以是简单模块,也可以是复合模块。

同简单模块一样,复合模块也有参数和门,除此之外,复合模块中还需声明复合模块的子模块和连接。

最高层的模块称为系统模块或网络。

图2-3就是一个包含一层嵌套的复合模块图。

下面是复合模块的定义格式。

moduleCompoundModule

parameters:

//…

gates:

//…

submodules:

//…

connections:

//…

endmodule

其中parameters,gates,submodules,connections都是可选的。

 

4.网络定义

网络定义声明仿真模型,模型是预先定义的模块类型的实例。

在NED文件中定义网络模型,可以定义多个网络并在配置文件中选择要仿真执行的网络。

2.3.2简单模块算法实现和消息传递

在OMNeT++中,简单模块最终是要用C++语言编写实现的,而模块之间的通信是通过传递消息的方式来实现的。

1.简单模块算法实现

简单模块的算法通过C++语言编写,OMNeT++使用CSinpleModule来直接或间接定义简单模块,再用Define_Module()或Define_Module_Like()来注册该简单模块。

每个简单模块都必须手动添加该宏,复合模块则由OMNeT++自动添加。

CSimpleModule有四个预先定义的成员函数:

initialize()函数,handleMessage()函数,activity()函数和finish()函数。

用户可以对该四个函数重新进行定义,一个简单模块中不能同时有handleMessage()和activity()函数。

(1)Initialize()函数:

在初始化消息放入FES(FutureEventSet,未来事件集)后,在执行前被调用,初始化成员变量。

复合模块的初始化先于其子模块。

(2)handleMessage()函数:

handleMessage()的主要应用于:

大规模的模拟环境,比如说几千个SimpleModule,用户需要用handleMessage()以省下用activity()为每个模块划分的栈空间;函数调用比协同程序切换快得多;对于需要维持较大的状态信息的模块或者是多状态的复杂的通信协议,handleMessage()较适用。

采用handleMessage()的优势有:

占用内存少,无需为简单模块分配独立的栈空间;执行速度快,采用handleMessage()的劣势有:

本地变量无法存储状态信息;需要重载initialize();模块设计时不太方便。

(3)activity()函数:

它使得用户可以像编写一个进程、线程一样编写一个简单模块。

等待消息、延缓执行时间等等。

拥有这个函数的多个简单模块作为一系列协同程序协同执行,又称之为协同多任务。

手动设置模块栈空间,一般为16k,如果模块存在递归或本地变量占空间较大的话,可以设置为更大的栈空间。

采用activity()的优势有:

无需重载initialize();可以将模块作为进程描述。

采用activity()的劣势有:

有内存分配问题,主要由于栈的手动分配,成千上万个SimpleModule的分配造成内存不堪重负;运行时负载过重,协同程序间的切换比普通函数调用慢了很多;不是一种较好的编程方式,使用activity()会导致代码不可靠。

(4)Finish()函数:

循环结束后正常中止时被调用,模块的调用顺序刚好与initialize()相反。

在OMNeT++中,事件在简单模块内部产生。

初始化阶段,OMNeT

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1