基于NS-2的网络视频传输仿真平台的建立

来源:互联网 发布:俄汉翻译软件 编辑:程序博客网 时间:2024/05/16 01:21

 

基于NS-2的网络视频传输仿真平台的建立

                    ————网络视频传输仿真平台的建立

摘 要

随着Internet和多媒体技术的迅猛发展, Internet已逐步从单一的数据传送网向数据、语音、图像等多媒体信息的综合传输网演化。由于活动图像的数据量很大,在具体应用中,网络拓扑、网络带宽、路由技术等因素都会对网络传输性能造成影响,最终影响视频业务的服务质量。因此必须对网络中视频传输的质量展开研究, 在研究过程中,由于网络的复杂性和经济条件的制约,网络仿真技术就扮演着非常重要的角色。

本文首先对网络仿真的定义、意义、研究重点和研究现状进行了介绍;然后阐述了网络仿真技术对视频传输研究的重要意义;提出以NS-2作为本课题的仿真平台,分析了NS-2的主要功能与特色以及在仿真系统开发中的应用。通过NS-2体系结构的分析,给出了网络仿真的实现方法;重点阐述了网络视频传输仿真的具体实现方法,其中包括对NS-2的扩展,网络结点以及拓扑结构的设计和以及对链路带宽、延迟进行设置。最后通过实例证明方案的可行性。

 

关键词:网络仿真;NS-2;视频


1.绪论

1.1课题研究的背景及目的

网络的迅速发展,如视频会议、视频点播(VOD)、远程教育等实时多媒体业务,需要人们不断研究新的网络协议和算法,为更好地验证协议、算法的性能,需要进行网络性能分析。网络性能分析主要采用理论分析法和计算机仿真法。实际应用发现,采用分析技术来评估复杂的通信网络是极其困难的,而网络仿真不失为一种方便、高效的验证和分析方法。

网络仿真,就是运用仿真软件对通信网络进行模型化,通过程序的运行模仿通信网络的运过程。目前,已获得广泛应用的各种通用、专用的仿真软件覆盖了几乎所有硬件平台,其中多平台适用的NS(Network Simulator)仿真器是最常见的基于事件的网络仿真软件之一,它是美国DARPA 支持的项目VINT开发的通用多协议网络仿真软件,在设计思路上试图满足网络研究界在网络仿真方面的抽象、仿真、场景生成、可视化、可扩充性等多方面需求,能够应用于无线环境,支持纯无线局域网、有线无线混合网络等的仿真。该仿真器属于自由软件、提供源代码,可以为低成本的研究、实验提供一套良好的仿真工具。NS是在网上分开发布的,并且已被网络研究者广泛使用。NS仿真器是一个基于Unix/ linux平台的软件包,包括Tcl/ tk、NS、Otcl、Tclcl等。其中, Tcl是一个开放脚本语言,用来对NS进行编程; tk是Tcl的图形界面开发工具,用于X环境的图形界面开发; Otcl是基于Tcl/ tk的面向对象扩展,有自己的类层次结构; NS是面向对象的仿真器,用C+ + 编写,以Otcl解释器作为前端; Tclcl则提供NS和Otcl的接口,使对象和变量出现在两种语言中。早期的NS就是对一个基本的Tcl解释器进行扩展,加入了网络仿真的一些命令而形成的。随着版本的更新,NS完全运用面向对象的软件设计思想,使用OTcl和C+ +语言混合编程, 利用TclcL 机制, 通过两个C+ + 类即TclObject和TclClass将OTcl类和C+ +类关联起来,使得在C+ +中能直接调用OTcl解释器的功能,OTcl和C+ +能够互相直接操作对方定义的数据。

针对网络仿真, NS已经预先做了大量的模型化工作,它对网络系统中一些通用的实体已经进行了建模,如链路、队列、分组、节点等,并用对象来实现了这些实体的特性和功能,这就是NS的构件库,而且这些对象易于组合,易于扩展,用户可以充分利用这些已有的对象,进行少量的扩展,组合出新的具备研究的网络系统

 

的模型,然后进行仿真,这样就大大减轻了进行网络仿真的工作量,提高了效率。扩充nS的主要方法就是使用OTcl或C+ +语言,继承ns已实现的类,增添自己的功能,再与原有的源文件一起重新编译、运行。由于ns已实现的类丰富、可靠和易于重用性,使二次开发人员可以将精力集中于欲实现的新模块,大大提高了工作效率,而且基于NS这个广泛采用的框架,使每次开发的成果都可以为更多研究项目共享,有利于成果的积累。

1.2课题研究的现状

国内外对网络视频传输进行大量的研究,但是一直没能给出一种统一的体系结构用来对视频的质量从主观和客观上进行评价。为此Jirka Klaue在《EvalVid - A Framework for Video Transmission and Quality Evaluation》中给出了统一评价视频传输质量的框架和工具集——EvalVid。EvalVid具有模块化的结构,可以使用在所用的的视频编码策略下,网络之间的交互作用通过trace文件实现,很容易在任何实验的环境下使用。Chih-Heng Ke等人在《An Evaluation Framework for More Realistic Simulations of MPEG Video Transmission》中将EvalVid和NS-2结合,给出了一个视频流质量评估的新工具集。NS2 和EvalVid的结合通过三个连接模拟代理实现,即MyTrafficTrace, MyUDP和 MyUDPSink。设计这些接口,既要读取视频trace文件,又要产生视频传输质量评估用的数据。MyTrafficTrace代理从VS的输出文件中提取视频trace文件的帧类型和帧大小。此外这个代理将视频帧分割成小的分段,并在适当的时间发送这些分段给低层UDP,发送时间是用户在模拟描述文件中具体设定的。MyUDP是UDP代理的延伸。这个新的代理允许用户指定发送trace的输出文件名。它记录每个传输分组的时间戳,分组id和分组大小。MyUDP 代理的任务对应于在真实网络环境中的Tcp-dump 或 Win-dump工具的任务。

1.3课题研究的方案

课题将基于NS-2 网络仿真软件建立网络视频传输仿真的平台。选取NS- 2 网络模拟器作为仿真环境,设计和实现了一个网络视频传输的试验平台,该平台可以为网络视频传输的研究建立一个实验的环境。首先用多台计算机作为建立仿真环境的传输节点,然后用编码器将YUV格式的视频源,按照配置文件的要求进行编码,产生视频压缩文件。根据视频流的情况,产生网络流量的trace文件,trace文件的格式是<分组标识,分组传送时间,分组尺寸>。转换的基本原理就是读取RTP文件中的时间戳和分组的大小,并将这些信息存储到trace文件中,然后注入NS-2模拟网络中进行传输,然后模拟网络根据trace文件中的参数生成模型,随后得到相应的网络传输结果。将目标节点接收到的所有数据包按照时间戳信息重新拼接成一个视频文件,然后在视频播放器上回放,便可以直观看到网络传输效果。用这样一种方式模拟视频码流传输,所得到的分析结果将会更具有可靠性,和视频码流在真实网络上的传输过程基本相当。


2.网络仿真技术

2.1 网络仿真的定义

网络仿真也被称为网络模拟,因为对各种网络仿真过程来说,其中也有“模拟”的含义,即,网络仿真既可以取代真实的应用环境得出可靠的运行结果和数据,也可以模仿一个系统过程中的某些行为和特征。顾名思义,网络模拟,就是用计算机程序对通信网络进行模型化,通过程序的运行模仿通信网络的运行过程。

2.2 网络仿真的目的

在网络迅速膨胀的今天,网络研究人员一方面要不断思考新的网络协议和算法,为网络发展做前瞻性的基础研究;另一方面也要研究如何利用和整合现有的资源,使网络达到最高效能。无论是哪一方面都需要对新的网络方案进行验证和分析。进行网络技术的研究一般有以下3种手段:

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

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

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

然而,前两种方法都存在很大的局限性。分析方法的有效性和精确性受假设限制很大。当一个系统很复杂时,就无法用一些限制性假设来对系统进行详细描述。实验方法的局限性在于成本很高,重新配置或共享资源很难,运用起来不灵活。而仿真方法在很大程度上可以弥补前两种方法的不足。仿真方法可以根据需要设计所需的网络模型,用相对较少的时间和费用了解网络在不同条件下的各种特性,获取网络研究的丰富有效的数据。网络仿真无疑提供了一个方便、高效的

 

验证和分析方法。因此,在网络传输系统的研究过程中网络仿真技术就扮演着非常重要的角色。

2.3网络仿真软件的介绍

当前有许多优秀的网络仿真软件,其中有 Opnet、NS2、Matlab等,这为网络研究人员提供了很好的网络仿真平台。主流的网络仿真软件都采用了离散事件模拟技术,并提供了丰富的网络仿真模型库和高级语言编程接口,这无疑提高了仿真软件的灵活性和使用方便性。下面将对各种主流的网络仿真软件进行简要评价。

OPNET Modeler

OPNET Modeler是OPNET Technology公司的四个系列网络仿真软件产品的其中之一,它主要面向的用户为网络设计专业人士,能够满足大型复杂网络的仿真需要。OPNET Modeler有如下特点:

(1) 提供三层建模机制,最底层为Process模型,以状态机来描述协议;其次为Node模型,由相应的协议模型构成,反映设备特性;最上层为网络模型。三层模型和实际的网络、设备、协议层次完全对应,全面反映了网络的相关特性;       

(2) 提供了一个比较齐全的的基本模型库,包括:路由器、交换机、服务器、客户机、ATM设备、DSL设备、ISDN设备等等。同时,OPNET Technology公司会对不同的企业用户提供附加的专用模型库,但需另外付费;                    

(3) 采用离散事件驱动的模拟机理(discrete event driven),与时间驱动相比,计算效率得到很大提高;                                      

(4) 采用混合建模机制,把基于包的分析方法和基于统计的数学建模方法结合起来,既可得到非常细节的模拟结果,又大大提高了仿真效率;         

(5) OPNET具有丰富的统计量收集和分析功能。它可以直接收集常用的各个网络层次的性能统计参数,能够方便地编制和输出仿真报;

(6) 提供了和网管系统、流量监测系统的接口,能够方便的利用现有的拓扑和流量数据建立仿真模型,同时还可对仿真结果进行验证。

 

NS2

NS2(Network Simulator, version 2)是一种面向对象的网络仿真器,由UC Berkeley开发而成。

使用NS进行网络仿真的方法和一般过程:

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

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

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

(2)    建立协议代理,包括端设备的协议邦定和通信业务量模型的建立。

(3)    配置业务量模型的参数,从而确定网络上的业务量分布。

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

(5)    编写其他的辅助过程,设定模拟结束时间,至此OTcl脚本编写完成。

(6)    用NS解释执行刚才编写的OTcl脚本。

(7)    对Trace文件进行分析,得出有用的数据。

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

Matlab

MATLAB软件是由美国Mathworks公司推出的用于数值计算和图形处理的科学计算系统环境。MATLAB是英文MATrix LABoratory(矩阵实验室)的缩写。MATLAB环境下,用户集成了程序设计、数值计算、图形绘制、输入输出、文件管理等各项功能。 MATLAB提供了一个人机交互的数学系统环境,该系统的基本数据结是矩阵,在生成矩陈对象时,不要求作明确的维数说明。与利用C语言或FORTRAN语言作数值计算的程序设计相比,利用MATLAB可以节省大量的编程时间。

由此可见,MATLAB是一个功能十分强大的系统,是集数值计算、图形管理、程序开发为一体的环境。除此之外,MATLAB还具有很强的功能扩展能力,与它的主系统一起,可以配备各种各样的工具箱,以完成一些特定的任务。

CASSAP

CASSAP是美国Synopsys(新思科技)公司开发了一款仿真软件,主要应用于数字信号处理和网络通信领域,它可以在概念、体系结构、算法三个层次上实现仿真。CASSAP采用了数据流驱动仿真器,它比基于时钟周期的仿真器速度提高了8-16倍。CASSAP提供了1000多个高层模块,并可对其中所需模块自动生成行为级或RTL级VHDL,也可生成各种风格的DSP代码,供DSP处理器作软件实现。CASSAP可广泛应用于需分析和评估算法、实现方式的数字传输系统,如通讯、图像、多媒体等,并提供了针对GSM、CDMA、DECT等标准的专用开发平台。

SPW

SPW仿真软件是Cadence公司的产品,它提供了面向电子系统的模块化设计、仿真及实施环境,是进行算法开发,滤波器设计,C代码生成,硬/软件结构联合设计和硬件综合的理想环境。SPW的一个显著特点是他提供了HDS接口和Matlab接口。Matlab里面的很多模型可以直接调入SPW,然后利用HDS生成C语言仿真代码或者是HDL语言仿真代码。SPW通常可以应用于无线和有线载波通信、多媒体和网络设计与分析等领域。

 

3.NS-2网络模拟

3.1 NS-2简介

NS-2(Network Simulator Version 2)是一种网络模拟软件,由伯克利大学为主研制开发, 从1989 年的一系列实时网络模拟器开始, 并且在过去的多年中不断改进。NS- 2 是一种开源的免费软件, 使用者可以自由下载并对其进行改进以符合自己的研究需要。它主要基于Unix 平台, 也可以安装在Windows 下。在Windows 下, 可以首先安装Cgywin, 它是一个虚拟Unix 环境, 然后在Cgywin 下运行NS- 2软件。本文使用Windows+Cygwin+NS- 2 方式。为了直观地观察和分析模拟结果, NS- 2 还提供了可选件Xgraph 和NAM。Xgraph可将结果转换成易于比较的平面统计图进行观察、分析、研究; 可视化模拟软件NAM可动态查看模拟的运行过程、观察跟踪数据,同步监测各节点的状态, 为新协议的设计和调试提供参考。运用NS进行网络模拟存在两种情况:利用NS已有的网络元素就可实现模拟或者NS中没有所需的网络元素。前者无需对NS本身作任何修改,而后者就要基于所需添加的网络元素添加新的C+ +类和Otcl类,完成对NS的扩展。如果用户已经完成了对NS的扩展或NS所包含的构件已经满足了要求,进行一次仿真要涉及以下几个步骤:编写Otcl脚本并运行NS解释执行之,然后对仿真结果进行分析研究。Otcl脚本一般要多次修改、调整并运行,才能得到较为理想的仿真结果。

3.1.1  NS-2运行环境

NS工具包有许多模块组成,不同的组合可以在不同的操作系统上运行。如:Windows系列,Linux、Unix、Macintosh等等。为了运行NS,还要求系统装有C++编译器。

本课题的运行环境:

处理器 Intel Pentium III Celeron Processor

操作系统 Microsoft Windows XP Professional (SP2)

3.1.2 语言支持

NS的主代码由两种语言写成:C++和OTcl。因为仿真器有两方面的需要:

(1)对协议细节的仿真需要一种比较系统的编程语言,它能高效地对字节、数据报头进行操作,能高效实现运行在大量数据集上的算法。对于这些任务,运行时间(run time)是我们最关心的,要尽可能少,而转换时间(turn-around time,含运行,调试)可以长一些。

(2)对网络研究会涉及到对网络实体的参数或配置的修改,或是对网络事件的修改。在这些情况下,反复时间(iteration time,即变换模型,重运行)更重要。由于配置仅运行一次(在仿真刚开始时),因此这一部分任务的运行时间可不用考虑。

 C++与Otcl解决了这两种需要。C++程序的运行时间很短,但转换时间很长,正适合用于实现具体的协议。Otcl运行得很慢,但可以很快的转换(或是交互),用来进行仿真的配置最适合不过。然后,通过tclcl模块将出现在两种语言里的变量、对象胶合起来。

当然以上的分法并不是绝对的,例如:许多路由是由Otcl实现的,但其核心——Dijkstra算法是用C++来实现)。通常,如果需要在一秒钟内调用许多次的模块,最好还是用C++代码实现。

 

3.2 NS-2体系结构

从软件角度来看NS-2体系结构主要分为网络仿真元素以及功能模块组成。

3.2.1 基本组成

NS-2 是一个软件包,软件结构见图3.1所示,  图中Tcl 是开放脚本语言,用来对NS 编程; Tk 是Tcl 的图形界面开发工具,可帮助用户在图形环境下开发图形界面;OTcl 是基于Tcl/ Tk 的面向对象扩展,有自己的类层次结构;NS-2 为本软件包的核心,是面向对象的仿真器,用C + + 编写,以OTcl 解释器作为前端; Tclcl 则提供NS 和OTcl 的接口。

 

图3.1 NS软件结构

3.2.2 仿真元素

(1) 网络拓扑,NS 的节点由一系列的分类器组成,链路由一系列的连接器组成. 在节点上,配置不同的代理可以实现相应的协议或其它模型仿真,如NS 的TCP 代理. 在链路上,可以配置带宽、时延和丢弃模型. NS 支持Droptail ( FIFO) 队列、RED 缓冲管理、CBQ (包括优先权和Roundrobin 调度) . 各种公平队列包括FQ ,SFQ ,DRR 等。

(2) 网络的路由配置协议,NS 中有3 种单播路由策略:静态、会话、动态,前2 种采用Dijkstra 算法,后一种采用分布式BellmanFord 算法. 在动态路由中,每一个节点可以执行一个以上的路由协议. NS 还提供了组播路由策略:集中式、密集模型和共享树模型。

(3) 通信量仿真,NS 提供了许多通信应用,如FTP ,它产生较大的峰值数据传输; Telnet 则根据相应文件随机选取传输数据。

3.2.3 NS-2的功能模块

NS2仿真器封装了许多功能模块,最基本的是节点、链路、代理、数据包格式等等,下面分别来介绍一下各个模块。

(1) 事件调度器:由于NS-2 是基于事件驱动的,调度器也就成为NS-2 的调度中心,它可以跟踪仿真时间,调度当前事件链中的仿真事件并交由产生该事件的对象处理。目前NS-2 提供了四种具有不同数据结构的调度器,分别是链表、堆、日历表和实时调度器。

(2) 节点(Node) :是由TclObject 对象组成的复合组件,在NS-2 中可以表示端节点和路由器。每个节点具有唯一的地址(id 标识) ,节点有单播节点和组播节点两种不同类型,通过节点内部的nodetype-变量来区分,NS-2 中默认的是单播节点;节点为每一个连接到它的业务源分配不同的端口,用于模拟实际网络中的端口;另外,节点有一个路由表以及路由算法,由地址分类器根据目的地址转发数据包。

(3) 链路(Link) :由多个组件复合而成,用来连接网络节点。所有的链路都是以队列的形式来管理分组的到达、离开和丢弃。主要由DelayLink、Queues和TTLChcker等连接器(Connector)构成。DelayLink构造链路带宽和延迟特征;Queues构造和模拟与该链路相连的路由器的输出缓冲;TTLChcker对该链路的数据包的TTL字段减1操作,并丢弃TTL值为0的数据包(如图3.2所示)。在链路中增加了Trace/ EnqT、Trace/ DeqT、Trace/ DrpT以及Tracer/ RecvT等对象可以跟踪每个数据包到达、进入、离开队列以及被丢弃的时间;还可以用队列监视器(Queue Monitor) 来监测队列长度和平均队长的变化情况。

(4) 代理(Agent) :负载网络层分组的产生和接收,也可以用在各个层次的协议实现中。Agent 类包含源及目的节点地址、分组类型、大小、优先级等状态变量,并利用这些状态变量来给所产生的分组的各个字段赋值。每个Agent 连接到一个网络节点上(一般是端节点) ,由该节点给它分配一个端口号。Agent 是实现UDP 协议及各种版本TCP 协议的基类。

(5) 包(Packet) :由头部和数据两部分组成。头部包括cmnheader、ip header、tcp header、rtp header 及trace headerd 等,其中最常用的是通用头结构cmn header ,该头结构中包含一个唯一的标识符,包类型、包的大小以及时间戳等。头结构的格式是在仿真器创建时被初始化的,各头部的偏移量也被记录下来。在agent 产生了一个包之后,所有的头部都同时生成,用户能够根据偏移量来存取各头部所包含的信息。一般情况下,Packet 只有头部、没有数据部分。

(6)流量发生器(traffic generator)、应用模拟器(simulated application): 是构建在运输层代理之上,流量发生器是模拟应用程序产生网络通信量,有四类:EXPOO_Traffic、POO_Traffic、CBR_Traffic、TafficTrace,它们一般用在UDP代理之上,应用模拟器有FTP,Telnet,一般用在TCP代理之上。

3.2.4 类层次结构

NS-2 为分层模型软件,内核使用高效的编译型C + + 语言,而外壳使用OTcl 脚本语言;内核完成数据处理任务,外壳完成配置、控制任务.  NS 中具有一中间层,应用时只需调用NS-2 的接口函数,不必了解OTcl库函数的调用细节.中间层由6个主要的类组成,即ClassTcl,Class TclObject,Class TclClass, ClassTclCommand, ClassEmbeddedTcl, ClassInstVar. 它们构成NS-2 的底层结构,其它类都是它们的子类,其结构见图3.3。

 

图3.3 NS构件库

上图中给出了NS- 2 构件库的部分类层次结构。NS- 2 的构件库由两种语言编写: C++和OTcl。C++是广为人知的高级程序设计语言; OTcl 是MIT 开发的ObjectTcl, 即Tcl 的面向对象的扩展。Tcl 全称是Toolkit command language, 它是一种灵活的、交互式的脚本语言。NS-2 中的构件通常都作为一个C++类来实现, 同时有一个OTcl 类与之对应, 这种方式被称为分裂对象模型。构件的主要功能通常在C++中实现, OTcl 中的类则主要提供C++对象面向用户的接口。用户可以通过OTcl 来访问对应的C++对象的成员变量和函数。C++对象和OTcl 对象之间是通过叫做TclCL 的机制关联起来的。用户通过编写OTcl 脚本来对这些对象进行配置、组合, 描述模拟过程, 最后调用NS- 2 来完成模拟。事实上, NS-2 对外的表现就是一个OTcl 解释器。

3.3 NS-2仿真原理

 针对网络模拟, NS-2 已经预先作了大量的模型化工作。NS- 2对网络系统中一些通用的实体已经进行了建模, 如链路、队列、节点等, 并用对象来实现了这些实体的特性和功能, 这就是NS-2 的构件库。NS 的构件库非常丰富, 而且这些对象易于组合, 易于扩展。用户可以充分利用这些已有的对象, 进行少量的扩展, 组合出所要研究的网络系统的模型, 然后进行模拟。

3.4 NS-2仿真过程

NS 模拟分为两个层次: 一个是基于OTcl 编程的层次, 利用NS-2 已有的网络元素实现模拟, 不需要对NS- 2 本身进行任何的修改, 只要编写OTcl 脚本; 另一个层次是基于C++和OTcl 编程的层次, 如果NS 中没有所需要的网络元素, 就需要首先对NS-2 扩展, 添加所需要的网络元素。这就需要添加新的C++类和OTcl类, 然后再编写OTcl 脚本,整个模拟过程如图3.3所示。

图3.3 利用NS进行网络模拟的过程

NS进行一次模拟的步骤如下:

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

(2) 业务量模型的参数,从而确定网络上的业务量分布。

(3) 设置Trace对象。Trace对象能够把模拟进程上发生的特定类型的事件记录在Trace文件中。NS通过Trace文件来保存整个模拟进程。仿真完成后,用户可以对trace文件进行分析研究。

(4) 编写其他的辅助过程,设定模拟结束时间,至此Otcl脚本编写完成。

(5) 用NS解释执行刚才编写的Otcl脚本。

(6) 对Trace文件进行分析,得出有用的数据。也可以用Nam等工具观看网络模拟运行进程。

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

3.5  NS-2 的扩展

由于在视频传输的的仿真中,需要将真实的视频码流在网络中传输,因此必须对NS-2 进行扩展与修改, 添加视频传输仿真过程中所需的网络元素,包括代理的设计。如果研究者需要验证其提出的传输策略,就要使用C+ + 和OTcl对网络元素编程,将其提出的策略加到网络元素中去,然后重新编译NS。在完成了对NS-2的扩展以后,就可以利用NS进行仿真了。NS-2的扩展主要考虑三个问题,在NS下进行仿真首先要能和现有TCP/IP仿真器比较容易地集成的方法来表示网络,为此目的需要设计不同的类和各种函数来表示网络拓扑结构,集成整个系统。第二要考虑的问题是用户接口,获得用户输入,用户进入网络之后,整个网络及其资源,传送的业务类型,交换等都要初始化。第三要建一个仿真引擎来驱动整个仿真过程。仿真引擎可以选择的驱动方式有时间循环,分组循环和事件驱动。一般地产,事件驱动是一种更有效,更有弹性一模型。

3.5.1 代码编写

用户应该根据目标模块的功能,详细分析编译层的类层次结构,然后确定类的继承关系。

由于用户的开发是在编译层,为在解释层灵活地引用新的类对象,集成新的对象就需要在NS-2中建立与C++代码的Otcl连接,也就是在编译层与解释层之间通过建立OtclLP连接实现对象的映射,这样,用户就能够在仿真脚本中方便地使用该对象了。

3.5.2  Otcl连接

  (1)实现类的映射。例如在OTCL中创建MYAGENT类的实例需要在编译层定义一个连接对象,称之为“MyAgentClass”,这个对象是从TclClass继承而来的。MyAgentClass在它的构造函数中创建了一个名为“Agent/MyAgent”的OTCL对象,与MyAgent类具有对应关系。当NS-2启动时,执行MyAgentClass类的构造函数,从而生成了MyAgentClass类的实例,在这个构造函数中,创建了OTCL环境的AGENT/MYAGENT类及其方法。如果用户在OTCL脚本中使用“new Agent/MyAgent”命令,系统就会调用MyAgentClass的create方法,产生一个MyAgent类对象,这样就在C++对象和Otcl对象之间建立了映射关系。

(2)实现变量的映射。如果要Otcl脚本中对C++成员变量进行访问或配置,用户必须建立变量自己的映射关系,例如上例中的MyAgent类有两个变量myval和myval2下面的代码将这两个变量映射到了Otcl空间:

MyAgent::MyAgent():Agent(PT-UDP){

Bind(“myval_”,&myval);

Bind(“myval2_”,&myval2);

}

变量的绑定过程一般是在编译类对象初始化时执行构造函数完成的。构造函数利用绑定函数bind()在Otcl空间的对应类结构中为myval和myval2分别创建了一个指定的成员变量myval_和myval2_,在C++与Otcl之间建立了两对成员变量的映射。用户在NS-2/tcl/ns-default.tcl中设置了变量的默认值后,就可以在仿真程序中使用myval_和myval2_来访问或修改变量myval和myval2

(3)在Otcl中实现对C++对象的控制或在C++中通过使用Tcl类的实例执行Otcl命令。上例中,通过command函数可以实现对C++对象的控制。

总结而言,在NS中扩展新协议(包括代理,流量模型,队列管理算法等)的一般步骤如下:

(1)定义或者继承C++协议类;

(2)定义TCL相关的类和变量;

(3)把C++绑定到TCL;

(4)在ns-default.tcl中为新增参数设置缺省值。

 

4.视频仿真的实现
4.1 视频仿真的基本思路
(1) 根据实际网络的的要求,定义网络节点,配置网络拓朴结构,确定链路的基本特性,如延迟、带宽和选择策略等。

(2) 建立协议代理,包括端设备的协议绑定和通信业务量模型的建立,将视频流和各种背景流绑定到代理中。配置业务量模型的参数,确定网络上的业务量分布。

(3) 设置trace 对象。trace 对象把仿真过程中发生的特定类型事件记录在trace 文件中。NS-2通过trace 文件保存整个仿真过程。仿真完成后,可以对trace 文件(1) 根据实际网络的的要求,定义网络节点,配置网络拓朴结构,确定链路的基本特性,如延迟、带宽和选择策略等。

(4) 将trace文件,注入到NS-2模拟网络中进行传输,然后模拟网络根据trace文件中的参数生成模型,随后得到相应的trace结果。

(5)根据trace文件判断编码产生的压缩视频分组流中哪些分组在传输过程中丢失,哪些分组因为延时超过了一定的限制而不能用来解码。然后从压缩视频文件中将传输丢失的分组和延时超过限制的分组丢弃,从而产生新的视频压缩文件。解码器对该文件进行解码从而得到经过仿真网络环境传输以后的重建视频,并可以进行质量的评估。

4.2 视频仿真的具体步骤
由于在视频传输的的仿真中,需要将真实的视频码流在网络中传输,因此必须对NS-2 进行扩展与修改, 添加视频传输仿真过程中所需的网络元素,包括代理的设计。如果研究者需要验证其提出的传输策略,就要使用C+ + 和OTcl对网络元素编程,将其提出的策略加到网络元素中去,然后重新编译NS。在完成了对NS-2的扩展以后,就可以利用NS进行仿真了。

4.2.1 NS-2环境配置
  (1)首先下载用作实验的标准YUV视频序列,本课题使用mother_daughtercif.yuv文件。

  (2)在路径(C:/cygwin/home/zzz/ns-allinone-2.27/ns-2.27/common)中修改packet.h文件。

struct hdr_cmn {

enum dir_t { DOWN= -1, NONE= 0, UP= 1 };

packet_t ptype_;  // 数据包类型

int    size_;             // 数据包的大小

int    uid_;              // 标号

int    error_;           // 错误标记

int  errbitcnt_;   

int  fecsize_;

double    ts_;         // timestamp: for q-delay measurement

int    iface_;           // receiving interface (label)

dir_t       direction_;     // direction: 0=none, 1=up, -1=down

char src_rt_valid;

double ts_arr_; // Required by Marker of JOBS

//添加以下代码

int frametype_;          // frame type

double sendtime_;     // send time

unsigned long int frame_pkt_id_;

(3)在路径(C:/cygwin/home/zzz/ns-allinone-2.27/ns-2.27/common)中修改agent.h文件。

 class Agent : public Connector {

 public:

Agent(packet_t pktType);

virtual ~Agent();

void recv(Packet*, Handler*);

......

inline packet_t get_pkttype() { return type_; }

// 添加以下代码

inline void set_frametype(int type) { frametype_ = type; }

inline void set_prio(int prio) { prio_ = prio; } 

protected:

int command(int argc, const char*const* argv);

......

int defttl_;                    // default ttl for outgoing pkts

 //添加以下代码

int frametype_;                

......

 private:

void flushAVar(TracedVar *v);

};

(4) 在路径(C:/cygwin/home/zzz/ns-allinone-2.27/ns-2.27/common)中修改agent.cc文件。

 Agent::Agent(packet_t pkttype) :

size_(0), type_(pkttype), frametype_(0),

channel_(0), traceName_(NULL),

oldValueList_(NULL), app_(0), et_(0)

{

}

......

Agent::initpkt(Packet* p) const

{

hdr_cmn* ch = hdr_cmn::access(p);

ch->uid() = uidcnt_++;

ch->ptype() = type_;

ch->size() = size_;

ch->timestamp() = Scheduler::instance().clock();

ch->iface() = UNKN_IFACE.value(); // from packet.h (agent is local)

ch->direction() = hdr_cmn::NONE;

ch->error() = 0;    /* pkt not corrupt to start with */

 //添加以下代码      

ch->frametype_= frametype_;

......

(5)将myudp.cc,myudp.h,myudpsink3.cc,myudpsink3.h,mytraffictrace3.cc文件放入myh264文件中。

(6)在该路径(C:/cygwin/home/zzz/ns-allinone-2.27/ns-2.27/tcl/lib)中对文件(ns-default.tcl)进行修改,在文件的末尾添加如下代码,

Agent/myUDP set packetSize_ 1000

Tracefile set debug_ 0

(7)在文件(C:/cygwin/home/zzz/ns-allinone-2.27/ns-2.27/Makefile)末尾添加代码,如下所示。

  OBJ_CC = /

       tools/random.o     tools/rng.o     tools/ranvar.o common/misc.o    common/timer-handler.o /

       common/scheduler.o common/object.o common/packet.o /

       common/ip.o routing/route.o common/connector.o common/ttl.o /

       trace/trace.o trace/trace-ip.o /

       classifier/classifier.o classifier/classifier-addr.o /

       classifier/classifier-hash.o /

       classifier/classifier-virtual.o /

       classifier/classifier-mcast.o /

       classifier/classifier-bst.o /

       classifier/classifier-mpath.o mcast/replicator.o /

       classifier/classifier-mac.o /

       classifier/classifier-qs.o /

   adc/pointsample-est.o adc/salink.o adc/actp-adc.o /

       adc/hb-adc.o adc/expavg-est.o/

       adc/param-adc.o adc/null-estimator.o /

       adc/adaptive-receiver.o apps/vatrcvr.o adc/consrcvr.o /

    ......

xcp/xcpq.o xcp/xcp.o xcp/xcp-end-sys.o /

       wpan/p802_15_4csmaca.o wpan/p802_15_4fail.o /

       wpan/p802_15_4hlist.o wpan/p802_15_4mac.o /

wpan/p802_15_4nam.o wpan/p802_15_4phy.o /

       wpan/p802_15_4sscs.o wpan/p802_15_4timer.o /

       wpan/p802_15_4trace.o wpan/p802_15_4transac.o /

   myh264/myudp.o /     //添加下面三行代码

myh264/myudpsink3.o /

myh264/mytraffictrace3.o /

$(OBJ_STL)

(8)编辑,在NS中执行make clean;make 命令,完成配置操作。

4.2.2拓扑结构的设置
在研究具体网络的性能时,一个实际的网络拓扑结构是首先要搭建的。这里我们利用Otcl 语言在NS 中实现了一个具有6个节点拓扑结构(如图5.1所示)。通过节点S1适时传输到节点S2,中间通过节点R1和R2;节点S1带有一个CBR流发生器,也通过中间节点R1和R2,向节点D2发送,作为影响视频传输的背景流。链路的带宽如图中标注所示。本实例仿真主要想说明CBR的背景流对视频传输质量的影响,从而论证本分析方案的可行性。


图4.1(拓扑结构)

  使用250帧的图像测试序列Mother_daughter_cif.yuv,利用JVT给出的参考模型JM1.7 H.264编码器进行编码与RTP打包,产生mother_daughter_cif.264压缩视频文件,编写程序读取压缩视频文件,产生名为Mother_daughter_cif.trc的trace文件。按照图2配置网络拓朴结构,确定链路的基本特性,R1和R2之间建立带宽为0.3Mbps双向链路,在节点S1和D1间建立一条UDP连接,并在其上建立一条视频UDP数据流,传输的起始时间为0s,终止时间为250帧图像以帧率15帧/秒传输所需时间。S2和D2间建立一条UDP连接,并在其上建立一条CBR数据流。将视频trace文件注入NS-2程序中,部分代码如下:

# 创建simulator 对象

set ns [new Simulator]                 

#为数据流定义不同的颜色,供NAM用

#$ns color 1 Blue

#$ns color 2 Red

#$ns color green

set nd [open out.tr w]

$ns trace-all $nd

#打开一个 trace file 记录数据包的传送过程

set nf [open out.nam w]

$ns namtrace-all $nf

set packetSize      1500

# 创建结点

set s1 [$ns node]               

set s2 [$ns node]

set r1 [$ns node]

set r2 [$ns node]

set d1 [$ns node]

set d2 [$ns node]

# 创建节点之间的链接和拓扑结构以及设置链路带宽、延迟

$ns duplex-link  $s1 $r1  1Mb 1ms DropTail 

$ns duplex-link  $s2 $r1  1Mb 1ms DropTail     

$ns simplex-link $r1 $r2  0.3Mb 1ms DropTail

$ns simplex-link $r2 $r2  0.3Mb 1ms DropTail

$ns duplex-link  $r2 $d1  1Mb 1ms DropTail

$ns duplex-link  $r2 $d2  1Mb 1ms DropTail

$ns duplex-link-op $s1 $r1 orient right-down

$ns duplex-link-op $s2 $r1 orient right-up

$ns simplex-link-op $r1 $r2 orient right

$ns duplex-link-op $r2 $d1 orient right-up

$ns duplex-link-op $r2 $d2 orient right-down

set qr1r2 [[$ns link $r1 $r2] queue]

$qr1r2 set limit_ 10

#Create a UDP agent and attach it to node s2

set udp0 [new Agent/UDP]

…              …                 …

4.2.3 仿真过程
本课题的具体实现分为以下六个步骤,本人主要完成第三步和第四步,其余部分由同组的其他同学完成,所以这些部分在这里只作简单介绍。

(1)将下载的mother_daughter.yuv文件作lencode.exe操作,得到mother_daughter.cif.264压缩文件。

(2) 对mother_daughter_cif.264文件作分析操作(parser.exe),得到mother_daughter_cif.txt文件。

mother_daughter_cif.txt部分内容如下:

0     0.000000      921 1

1     0.000000      1000 1

2     0.000000      996 1

3     0.000000      998 1

4     0.000000      1008 1

5     0.000000      989 1

6     0.000000      997 1

7     0.000000      355 1

8     0.066667      407 2

9     0.133333      97   3

10   0.200000      104 3

…              …                 …

 (3)对be.tcl文件作NS操作(ns.exe),运行之后得到sd_be(发送方的trace文件)和rd_be(接收方的trace文件)文件,这两个文件用来验证信息在执行发送操作后的数据包丢失情况,经过对比9,10,11,12等数据块丢失,运行效果如图5.2.。


图4.2(仿真结果)

sd_be文件部分内容如下:

0.000000         id 0                udp 921            

0.000000         id 1                udp 1000           

0.000000         id 2                udp 996            

0.000000         id 3                udp 998            

0.000000         id 4                udp 1008           

0.000000         id 5                udp 989            

0.000000         id 6                udp 997            

0.000000         id 7                udp 355            

0.066667         id 8                udp 407            

0.133333         id 9                udp 97             

0.200000         id 10               udp 104            

0.266667         id 11               udp 274            

0.333333         id 12               udp 120            

0.400000         id 13               udp 102            

0.466667         id 14               udp 306            

0.533333         id 15               udp 115            

0.600000         id 16               udp 80             

0.666667         id 17               udp 991            

0.666667         id 18               udp 996            

0.666667         id 19               udp 990            

0.666667         id 20               udp 1006           

0.666667         id 21               udp 988            

0.666667         id 22               udp 998            

0.666667         id 23               udp 361            

0.733333         id 24               udp 72             

0.800000         id 25               udp 74             

0.866667         id 26               udp 334            

0.933333         id 27               udp 84             

…              …                 …

rd_be 文件部分内容如下:

0.053232         id 0                udp 921            

0.081277         id 1                udp 1000           

0.121885         id 2                udp 996            

0.149261         id 3                udp 998            

0.190301         id 4                udp 1008           

0.217269         id 5                udp 989            

0.258000         id 6                udp 997            

0.263077         id 7                udp 355            

0.275093         id 8                udp 407            

0.388749         id 11               udp 274            

0.510840         id 13               udp 102            

0.588045         id 14               udp 306            

0.643664         id 15               udp 115            

0.699597         id 16               udp 80             

0.800725         id 17               udp 991            

0.841405         id 18               udp 996            

0.882392         id 20               udp 1006           

0.909688         id 22               udp 998            

1.118419         id 28               udp 76             

(4)对mother_daughter_cif.264,distorted.264,sd_be,rd_be四个文件执行errinsert.exe操作,运行之后将结果命名为distorted.264,该操作主要根据sd_be和rd_be文件对比之后,将丢失的数据信息从原文件(mother_daughter_cif.264)中去掉。

(5)对 distorted.264 文件作解码操作(ldecod.exe),执行程序后将会得到

mother_daughter_cif_distorted.yuv文件,然后用YUV视频播放软件(YuvViewer)对mother_daughter.yuv(仿真前的视频文件)与mother_daughter_cif_distorted.yuv(仿真前的视频文件)分别进行播放,会发现仿真后的视频文件会出现图像失真的现象,如图5.3。


仿真后的视频截图


仿真前的视频截图

图4.3

 (6)最后对mother_daughter_cif.yuv和mother_daughter_cif_distorted.yuv作PSNR(信号-噪音功率比)操作(psnr.exe),对两个视频进行参数对比,如图5.4。


图4.4 两种情况下PSNR的对比

4.3小结
为了解决网络视频传输质量分析试验较为困难的问题,选取了NS-2 网络模拟器作为仿真环境, 设计和实现了一个视频质量分析的试验平台。提出了视频质量分析对于试验平台的需求, 对全部的实现过程分析后,通过实例进行了论证。对于需要在NS中加入新的视频传输协议模块的仿真试验来说,可以应用文中给出的实验平台,分析和验证协议的有效性。

 

【来源】

 

原创粉丝点击