您的位置:首页 > 理论基础 > 计算机网络

NS仿真概述 (1): 网络模拟、操作流程初识

2011-04-17 21:22 246 查看
http://www.servns.net/read.php?tid=10&fpage=2

[b]NS仿真概述 (1): 网络模拟、操作流程初识[/b]

我希望通过本文介绍NS2利用TCL脚本进行网络模拟的一些基本概念,并且归纳相关的步骤和命令。
如果你对下面的内容表示已经有一些认识,恭喜你,你可以集中阅读NS2中与你工作任务相关的协议,并进行修改和调试的工作。
如果你对下面归纳的知识表示很陌生或不能理解,我建议你不要急着往下进行,而是先阅读一本基础的书籍、Tutorial,或者依据网络中的一些列博文进行测试。

1. 网络研究方法之我见

网路科研的工作主要包括以下两类:
(1) Network Measurement and Performance Analysis, 即网络测量和性能分析;
(2) Protocol Design and Algorithm Improvement,即网络协议设计和算法改进;
一般的解决方案大体可分为三类: 数学模型化分析、实际网络测试,以及网络模拟。
NS2是面向科研而开发的网络模拟软件。 网络模拟具有以下几点优势:
(1)数学模型化分析,建立在一定的假设条件上,对真实系统进行逻辑抽象,能够对网络设计提供较好的指导,如网络Capacity、通信的Scheduling。 很多时候,假设未能刻画实际、抽象忽略了很多细节、简化过分等,使得分析的结果未能很好地反映实际网络,失去指导意义。
(2)对实际网络进行测试可能需要硬件和软件的支持,在平台的配置和环境的设定方面存在很高的要求; 另外,测量应该是无侵入性的,测量工作不应该改变网络系统, 因此在实现的网络中对网络协议、网络行为和网络性能进行研究,虽然最有效,但是可行性较差,对大多数研究者来说并不现实。
(3)通过模拟的方式,能够集中考察某个协议、某个算法、某种性能,并且可以根据观察进一步进行调整,最终找到最好算法,或者使协议获得最好的性能。因此模拟的方式被大家广泛采用。

2. NS2的构成
NS兼有“模拟”和仿真的功能,不过NS2仿真功能并没有充分开发,很少被使用, 在全新的NS3软件中对于仿真有更多的支持。
现实的网络网络很复杂,即使是一个小型的网络,硬件方面包括多个终端,可能分为很多类;软件方面包括各层网络协议。如何更加真实地通过模拟的方式反映一个实际的网络? 这是一个并不简单的工作。
NS2采用面向对象的方式构建了它的网络世界,大体分为三部分:模拟的引擎、模拟场景的配置接口、网络组件库;
一句话描述就是: 利用模拟场景的配置接口,将相应的网络组件组合在一起,利用模拟的引擎进行模拟,最后统计和分析模拟过程中记录,得到各种网络参量的量化值和曲线图。

(1) 模拟的引擎
类比而言,NS2中模拟引擎的功能就像是C语言中的Main函数,作为程序的入口,以及实现控制和调度,并且处理异常; 也可以看作是一个状态机,实现系统状态之间变迁。
NS2中的模拟引擎是一个离散事件模拟器。 事件规定了系统状态的改变,状态的变迁进发生在事件产生时。 典型的事件包括数据达到、时钟超时等。 真实的世界是一个连续时间系统,而真实的网络是面向事件的,应该看成是一个离散时间系统, 换句话说, 网络中事件的产生和处理可以刻画整个网络的状态。 因此,模拟引擎需要有一个全局的时钟,模拟引擎的工作就是处理一个个离散产生和到来的事件,直到所有事件都被处理完成或者某个特定的事件发生为止(停机或出错)。 针对以上的模型,有以下两个很直接、很重要的问题:
模拟引擎的时钟如何计时?
如何模拟数据包在网络中的传输呢?

NS2模拟时,传递的每个数据包实际上只有包头信息,并且默认情况下该包头信息包含几乎各种协议规定的字段。而每一个词数据包的传递,只需要传递包头的句柄; 每一次具体的模拟仅仅在相应的字段上进行操作(只使用与该协议相关的包头字段)。这样设计是因为模拟过程中数据包中的数据对于网络协议的模拟毫无作用,所以不必传输,仅仅包头信息就已完整表征实际网络中的一个分组(数据包)。
网络模拟的关键之一就是时间的控制(事件是按时序产生的、行为是时间依赖的、况且TCP/IP协议本身就十分依赖于计时器)。 模拟过程的时间无法与真实网络同步的,只需要在逻辑上对离散的事件进行了准确的计时就符合模拟的需要,没必要同步(仿真时才需要同步)。因此模拟的时间戳通过NS2计时器功能模块统一控制,每一个计时器的实现也是依赖于模拟时间的,而不是实际时间。

(2)丰富的网络组件库
为了方便网络研究,NS2已经做好了大量的模型化工作,对网络系统中的通用实体进行了建模,比如节点、链路、队列、分组和时钟等,并使用面向对象的方式实现了这些实体的功能,提供了相应的界面。面向对象的思想,使得这些实体对象直接易于组合,易于扩展。 用户可以充分利用组件库中已有的对象,进行所需的扩展,修改和组合出所需的新组件; 利用设定网络场景的配置文件,将网络元素组合(节点、链路等),构建出能够用于测试特定协议的网络系统模型。 最后,利用模拟引擎进行模拟,就可以得到模拟系统的模拟数据,通过数据分析,评价网络协议。

NS2中的组件库支持的网络类型包括广域网、局域网、移动通信网、卫星通信网等,所支持的路由方式包括层次路由、动态路由、多播路由等,此外,还提供了跟踪和检测的代理,用于把网络系统中的状态和事件记录下来以供分析。 对于数据的分析,也提供了很多的数学支持,例如随机数的产生、随机变量、积分操作等。

(3) 模拟场景的配置接口
网络组件各个网络实体相对应,需要对数据包进行操作,对于处理效率有比较高的要求,因此使用C++开发的。 如何将已有的组件快速组合,并进行软件方面的配置呢? NS2 采用了 TCL 脚本语言,可能是因为它有面向对象的版本,TCL扮演的角色在一定程度上和Linux下的Shell很相似。

NS2仿真概述 (2):NS2网络模拟的原理

【本文转自ProhibidoAmor的博文空间】: http://blog.chinaunix.net/u3/105477/showart.php?id=2181520
NS2仿真系列博文超链接
NS by Example 的英文版
Tutorial for the Network Simulator "NS", by Marc Greis.

我博客空间里,已经发布了近30篇NS2仿真的博文,是我学习过程中所做的仿真,希望对网友有一些帮助。 之所以想到写一系列的“NS2 by Example”、“NS for beginners”、“NS Manual”、《NS与网络模拟》的解析:
一是因为这几份教材本身很经典;
二是希望以这些教材为主线梳理自己的NS2知识,为今后进一步的实验做准备;
三是希望结合网友和我交流过程的心得,为网友提供比较高效的学习途径;

1. 网络模拟和网络仿真 此处参考《NS与网络模拟》--徐雷鸣

(仅仅在此处,我们需要分别对待这两个术语,其他时刻请依据语境判断)
徐老师在该书的开头详细阐明了“网络模拟”和“网络仿真”这两个有着本质差别的概念;

网络模拟 Simulation
模拟,即针对一个物理的或抽象的系统,选取某些行为特征,用另一个系统来表示他们的过程;

网络仿真 Emulation
仿真,即用另一个数据处理系统(主要是硬件),来全部或部分地模仿某一数据处理系统,以至于模仿系统能像被模仿系统一样接受相同的数据,执行同样的程序,获得同样的结果。
(模仿系统和被模仿系统,在我们考虑范围内在功能上是等价的!)

故而:
Simulation强调的是模仿一个系统过程的 某些行为特征;
Emulation 强调的是模仿者可以取代被模仿者或者嵌入到被模仿的系统中,并且表现出等价的行为;

NS的设计之初是兼有“模拟”和“仿真”两大功能的。NS首先是可以模拟一个网络的运行过程,在此基础上做仿真的扩展,再嵌入到一个活动的网络中去。 NS中特定的对象可以把真实网络的分组数据引入到模拟器中,并将模拟器中产生的分组数据输出到真实的网络中。 不过,NS中的这种仿真功能一直都没有得到充分开发,现在还相当不成熟,平台移植性也比较差,很少被人使用。

注意: (以下是个人心得)
1. NS2模拟时,传递的每个数据包实际上只有包头信息,并且默认情况下该包头信息包含几乎各种协议规定的字段,而每一次具体的模拟仅仅在相应的字段上进行操作(只使用与协议相关的包头字段); 因为模拟过程中数据包的数据毫无作用,所以根本不必传输,即仅仅包头信息就已完整表征实际网络中的一个分组(数据包)。
2. 网络模拟的关键之一就是时间的控制(事件是按时序产生的、行为是时间依赖的、况且TCP/IP协议本身就时分依赖于计时器。 模拟过程的时间显然是无法与真实网络同步的,而且也没必要同步(仿真时才需要同步),因此模拟的时间戳通过NS2计时器功能模块统一控制,每一个计时器的实现也是依赖于模拟时间的,而不是实际时间。

2. NS是一个离散事件模拟器 此处参考《NS Manual》

上面我提到NS2的仿真时间与实际时间是不一致的(模拟处理过程的速率不直接对应着实际时间),而是通过统一时钟控制和分组包头对应的时间戳字段标志来完成的。 因此不难理解NS的离散时间模拟的本质,也可以说是时间驱动的网络模拟。

NS是一个离散事件模拟器。简单来说,系统状态的改变由事件决定,状态变迁仅仅发生在事件发生时进行。 在NS2网络模拟过程中,典型的事件包括分组到达、时钟超时等。
模拟器所做的工作就是不停地处理事件容器(一般是FIFO队列)中一个个的事件,而一个事件的处理又可能会引发后续的事件(被加入到时间容器中),直到所有时间被处理完成或者某一个特定事件的发生位置,模拟过程终止。

NS的核心部分是一个离散事件模拟引擎,对应为Scheduler类,负责记录当前时间,调度网络事件队列中的时间,并调用与事件相关联的处理函数,提供产生新事件的函数,指定事件发生的时间(即,给相应的Event类实例的时间变量赋值),等等。

3. NS2软件编写 此处看考《NS Manual》

NS2是由UC Berkely结合C++和OTCL语言开发的面向对象的离散事件模拟器。
关于采用这两种语言的解释:
(1) 网络模拟的任务为两类
高效灵活的操作:
具体网络协议的详细模拟和实现需要一种系统编程语言, 它应该具有高效操作字节、包头等数据结构,便于特定的算法在大规模数据集合上的实现,而且这些算法往往是需要重复执行的,所以高效是很重要的。 对于这类任务而言,运行效率是关键,而编程开发、重编译、与其他模块的组合耗时则不影响网络模拟过程。
便捷的网络场景配置:
我们的网络模拟实际上是围绕着网络组件(节点、链路、队列、特定协议、路由算法)和网络环境的具体参数进行的,换句话说,我们利用不同的网络组件创建我们的网络场景,更改网络组件的参数和网络环境的参数,进行不断的重复测试和对比测试。 因此我们需要高效的网络配置方案,以便在较短的时间开发出大量的网络场景。
(2)选择C++和OTCL语言
C++ 程序运行效率高,是强制类型语言,容易实现复杂的数据结构和精确的、复杂的算法, 不过修改、debug和重新编译的耗时比较长, 因此被选做用于具体协议的开发实现。
OTCL运行速度比较慢,但是可以很方便地(并且是交互地)修改,不需要编译(解释性语言),而且OTCL不是强制类型的,不容易出错, 因此适合用来做模拟的配置。
(3)拓展NS2时语言选取的建议
OTCL: 模拟场景的建立、具体参数的配置,以及模拟中只需要运行一侧的程序;
如果通过Otcl脚本操作已经存在的C++对象很方便达到目的时;
C++ : 需要对一个数据流的每个分组进行处理的任何工作;
如果必须修改已存在的C++类的行为时(以实现特定网络协议)。

4. NS2 软件结构的初识

前面已经说到NS2模拟的核心是离散事件模拟引擎。 原则上用户可以利用该引擎对任何系统进行模拟,而不陷于通信网络系统。 通过很多NS设计者的努力,NS已经针对网络模拟预先做了大量的模型化工作,从而方便用户将焦点集中在所关注的协议本身,快速实现协议、方便完成测试。
NS2对网络系统中一些通用的实体已经进行了建模,例如链路、队列、分组、节点等, 并用对象来实现这些实体的特性和功能,这就是NS的构件库。
相对于一般的离散事件模拟器来说,NS的优势就在于它所具有的丰富的构件库,并且它们易于组合,易于扩展。用户可以充分利用这些已有的对象,进行少量的扩展,组合出所要研究的网络系统的模型,然后进行模拟(测试)。 这样,减轻了进行网络模拟研究的工作量,提高了效率。

NS的构件库所支持的网络类型包括: 广域网、局域网、移动通信网、卫星通信网等;
所支持的路由方式包括: 层次路由、动态路由、多播路由等;

NS还提供了跟踪和监测的对象,可以把网络系统的状态和事件记录下来以便分析。
NS的构件库还提供了大量的数学方面的支持,包括随机数产生、随机变量、积分等

NS2的结构示意图:



该图Legend: 这是NS2 的整体框架, 网络模拟用户使用OTCl脚本进行场景创建,并通过命令是的Event Scheduler执行; OTCL脚本的命令和网络构件库,则是通过Tclcl机制实现对应的。

简化的NS2 网络模拟用户的视图:



该图Legend:用户OTCL脚本由Otcl解释器解释执行, 最后得到模拟结果,进而进行分析或利用NAM显示模拟的整个过程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: