基于NS2的网络仿真

更新时间:2024-04-10 14:51:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

课设(三):基于NS2的网络仿真

一、课程设计目的

1、理解NS2的基本概念;

2、熟悉安装NS2的实验环境和基本操作; 3、仿真分析UDP通信协议;

4、学会生成NS2的Tcl脚本及仿真结果分析;

二、课程设计原理 1、UDP协议

(1)协议概述

UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成 ,提供面向事务的简单不可靠信息传送服务。 (2)协议功能描述

UDP在IP数据报的头部仅仅加入了复用和数据校验(字段),UDP首部字段由4个部分组成,其中两个是可选的。各16位的源端口和目的端口用来标记发送和接受的应用进程,因为UDP不需要应答,所以源端口是可选的,如果源端口不用,那么置为零。在目的端口后面是长度固定的以字节为单位的长度字段,用来指定UDP数据报包括数据部分的长度。

由于缺乏可靠性,UDP应用一般必须允许一定量的丢包、出错和复制。由于UDP协议缺乏拥塞避免和控制机制,需要基于网络的机制来减小因失控和高速UDP流量负荷而导致的拥塞崩溃效应。UDP协议只在IP的数据报服务之上增加了很少的功能,这就是端口的功能(有了端口,运输层就能进行复用和分用)和差错检测的功能。另外,UDP协议应用程序可以是客户机,也可以是服务器程序,不必向TCP协议应用程序那样必须分别建立客户机程序和服务器程序。在远程控制软件中,如果在局域网内部传输屏幕信息,则使用UDP协议比较容易实现。但UDP协议不提供可靠性,它的可靠性是交给其他网络设备来解决。同时用UDP协议来传输的数据一般较小,它需要IP协议来为它对数据进行分段。

2、NS2概述

NS2(Network Simulator version 2,网络仿真软件第二版)是一种面向对象的网络仿真器,本质上是一个离散事件模拟器。目前NS2 可用于仿真各种不同的通信网络,已经实现的仿真模块有:网络传输协议,如TCP 和UDP;业务源流量产生器,如FTP、Telnet、Web CBR 和VBR;路由队列管理机制,如Droptai、RED和CBQ;路由算法,如Dijkstra,以及无线网络的WLAN,Ad hoc路由,移动IP 和卫星通信网络等。NS2也为进行局域网的仿真而实现了多播以及一些MAC子层协议。

NS2使用C++和OTcl作为开发语言。NS2可以说是OTcl的脚本解释器,它包含仿真事件调度器、网络组件对象库以及网络构建模型库等。事件调度器用于计算仿真时间,并且激活事件队列中的当前事件,执行一些相关的事件,网络组

件通过传递分组来相互通信,但这并不耗费仿真时间。所有需要花费仿真时间来处理分组的网络组件都必须要使用事件调度器,它先为这个分组发出一个事件,然后等待这个事件被调度回来之后,才能做下一步的处理工作。事件调度器的另一个用处就是计时。由于效率的原因,NS2将数据通道和控制通道的实现相分离,为了减少分组和事件的处理时间,事件调度器和数据通道上的基本网络组件对象都使用C++写出并编译的,这些对象通过映射对OTcl解释器可见。

NS2结构图

3、Tcl介绍

Tcl的全称是Tool Command Language,属于脚本语言的一种,它具有可以依照原型进行快速开发、脚本编程、GUI编写和测试方面应用广泛的特点。在NS2中为网络进行参数配置的脚本都是用Tcl编写而成的。Tcl主要由语言部分和解释器部分两部分组成,相对其他脚本语言而言,Tcl不但编程能力强劲而且能够方便地向应用程序中添加Tcl解释器,从而大幅提高编程效率。Tcl只支持“字符串”一种数据结构,一种分割符就是空格。

Tcl本身不提供面向对象的支持,但是语言本身很容易扩展到支持面向对象。许多C语言扩展都提供面向对象能力,包括XOTcl,Incr Tcl 等。另外SNIT扩展本身就是用Tcl写的。使用最广泛的Tcl扩展是TK。TK提供了各种OS平台下的图形用户界面GUI。另一个流行的扩展包是Expect,Expect提供了通过终端自动执行命令的能力,例如(passwd,ftp,telnet等命令驱动的外壳)。OTcl是面向对象的Tcl,它在Tcl中增加了对象的支持,如类的定义、继承与封装、构造和析构函数等。

4、NS2的仿真过程

进行网络仿真前,首先分析仿真涉及哪个层次,NS2仿真分两个层次:一个是基于OTcl编程的层次,利用NS2已有的网络元素实现仿真,无需修改NS2本身,只需编写OTcl脚本;另一个是基于C++和OTcl编程的层次,如果NS2中没有所需的网络元素,则需要对NS2进行扩展,添加所需网络元素,即添加新的C++和OTcl类,编写新的OTcl脚本。

假设用户已经完成了对NS2的扩展,或者NS2所包含的构件已经满足了要求,那么进行一次仿真的步骤大致如下:

(1)开始编写OTcl脚本。首先配置模拟网络拓扑结构,此时可以确定链路的基 本特性,如延迟、带宽和丢失策略等。

(2)建立协议代理,包括端设备的协议绑定和通信业务量模型的建立。 (3)配置业务量模型的参数,从而确定网络上的业务量分布。

(4)设置Trace对象。NS2通过Trace文件来保存整个模拟过程,仿真完后,用户可以对Trace文件进行分析研究。

(5)编写其他的辅助过程,设定模拟结束时间,至此OTcl脚本编写完成。 (6)用NS2解释执行刚才编写的OTcl脚本。 (7)对Trace文件进行分析,得出有用的数据。

(8)调整配置拓扑结构和业务量模型,重新进行上述模拟过程。

NS2采用两级体系结构,为了提高代码的执行效率,NS2 将数据操作与控制部分的实现相分离,事件调度器和大部分基本的网络组件对象后台使用C++实现和编译,称为编译层,主要功能是实现对数据包的处理;NS2的前端是一个OTcl 解释器,称为解释层,主要功能是对模拟环境的配置、建立。从用户角度看,NS2 是一个具有仿真事件驱动、网络构件对象库和网络配置模块库的OTcl脚本解释器。NS2中编译类对象通过OTcl连接建立了与之对应的解释类对象,这样用户间能够方便地对C++对象的函数进行修改与配置,充分体现了仿真器的一致性和灵活性。

如下图为NS2的仿真流程图:

三、课程设计具体内容

1、实验环境

硬件为联网的PC机,软件为ubuntu12.04.2系统,ns-allinone-2.3,所使用的开发语言是Otcl,C++。

2、利用NS2仿真UDP通信协议

(1)编写Tcl脚本文件 set ns [new Simulator] #建立新的模拟对象simulator

set haha [open tan.tr w] $ns trace-all $haha

set namhaha [open tan.nam w] $ns namtrace-all $namhaha

#设定变量haha指向tan.tr文件,tan.tr文件用来记录模拟过程的trace数据;设定变量namhaha指向tan.nam文件,tan.nam文件用来记录nam的trace数据;

proc finish {} {

global ns haha namhaha $ns flush-trace close $haha close $namhaha exec nam tan.nam & exit 0

} #建立一个finish过程,用来关闭两个trace文件,并在模拟结束后调用nam程序;

set n0 [$ns node] set n1 [$ns node] set n2 [$ns node] set n3 [$ns node]

#创建4个节点n0,n1,n2,n3;

$ns duplex-link $n0 $n2 3Mb 15ms DropTail $ns duplex-link $n1 $n2 3Mb 15ms DropTail $ns duplex-link $n2 $n3 1Mb 45ms DropTail

#在n0和n2,n1和n2之间各建立一条双向链路,设定链路的带宽为3Mbit/s、

时延为15ms,队列类型为DropTail;在n2和n3之间建立一条双向链路,设定链路的带宽为1Mbit/s、时延为45ms,队列类型为DropTail;

$ns duplex-link-op $n0 $n2 orient right-down $ns duplex-link-op $n1 $n2 orient right-up $ns simplex-link-op $n2 $n3 orient right #Set Queue Size of link (n2-n3) to 10 $ns queue-limit $n2 $n3 20

set udp0 [new Agent/UDP]

$ns attach-agent $n0 $udp0 #创建一个UDP Agent0,并将其绑定到n0节点上; set udp1 [new Agent/UDP]

$ns attach-agent $n1 $udp1 #创建一个UDP Agent1,并将其绑定到n1节点上; set null [new Agent/Null] $ns attach-agent $n3 $null

#创建一个Null Agent,并将其绑定到n3;Null是一种数据接收器,负责接收CBR发送的数据;

$ns connect $udp0 $null #将udp0和null这两个Agent连接起来; $ns connect $udp1 $null #将udp1和null这两个Agent连接起来;

set cbr0 [new Application/Traffic/CBR] $cbr0 attach-agent $udp0 $cbr0 set packetSize_ 500 $cbr0 set rate_ 0.01mb

set cbr1 [new Application/Traffic/CBR] $cbr1 attach-agent $udp1 $cbr1 set packetSize_ 500 $cbr1 set rate_ 0.01mb

#创建CBR流量发生器,设定分组大小为500B,然后将其绑定到udp上;

$ns at 0.2 \$ns at 20 \$ns at 0.2 \$ns at 20 \

#告知simulator对象在0.2s时启动cbr0和cbr1,即开始发送数据,在20s时停止发送;

$ns at 22 \告知simulator对象在22s时调用finish过程; $ns run #开始模拟; (2)仿真结果

(3)Trace文件分析

仿真结束后会产生两个档案,一个是tan.nam,这是给NAM用的,用来把仿真的过程用可视化的方式呈现出来,这样可以用“看”的方式去了解封包传送是如何从来源端送到接收端。另一个档案是tan.tr,这个档案记录了仿真过程中封包传送中所有的事件。

抽取Trace文件中第一、四、五进行分析:

第一行:+ 0.2 0 2 cbr 500----------0 0.0 3.0 0 0

分析:有一个封组id为0,资料流id为0,分组序列号为0,长度为500B,分组类型为CBR,它是从源地址0.0要到目的地3.0,在时间0.2秒的时候,从节点0进入了节点2的队列中。

第四行:- 0.2 1 2 cbr 500---------0 1.0 3.0 0 1

分析:有一个封组id为1,资料流id为0,分组序列号为0,长度为500B,分组类型为CBR,它是从源地址1.0要到目的地3.0,在时间0.2秒的时候,从节点1开始离开至节点2。

第五行:r 0.216333 0 2 cbr 500---------0 0.0 3.0 0 0

分析:有一个封组id为0,资料流id为0,分组序列号为0,长度为500B,分组类型为CBR,它是从源地址0.0要到目的地3.0,节点2在0.216333秒收到一个从节点0发出的包。

四、课程设计结论及心得

在开始实验的时候,准备参照PPT上面介绍的方法,使用NSG2自动生成Tcl脚本,但是由于安装JRE的过程出现了一些问题,没有成功。最后通过编写脚本文件实现对UDP通信协议的网络仿真,由于对NS2了解还不够深刻,只能编写最基本的语句,进行简单的nam演示模拟。但是通过这次课程设计,对NS2网络仿真的功能模块、仿真元素及仿真过程有了初步的了解,达到了自己对实验学习的初衷。

本文来源:https://www.bwwdw.com/article/a0ur.html

Top