基於NS-2的網絡視頻傳輸仿真平臺的建立

 

基於NS-2的網絡視頻傳輸仿真平臺的建立

                    ————網絡視頻傳輸仿真平臺的建立

摘 要

隨着Internet和多媒體技術的迅猛發展, Internet已逐步從單一的數據傳送網向數據、語音、圖像等多媒體信息的綜合傳輸網演化。由於活動圖像的數據量很大,在具體應用中,網絡拓撲、網絡帶寬、路由技術等因素都會對網絡傳輸性能造成影響,最終影響視頻業務的服務質量。因此必須對網絡中視頻傳輸的質量展開研究, 在研究過程中,由於網絡的複雜性和經濟條件的制約,網絡仿真技術就扮演着非常重要的角色。

本文首先對網絡仿真的定義、意義、研究重點和研究現狀進行了介紹;然後闡述了網絡仿真技術對視頻傳輸研究的重要意義;提出以NS-2作爲本課題的仿真平臺,分析了NS-2的主要功能與特色以及在仿真系統開發中的應用。通過NS-2體系結構的分析,給出了網絡仿真的實現方法;重點闡述了網絡視頻傳輸仿真的具體實現方法,其中包括對NS-2的擴展,網絡結點以及拓撲結構的設計和以及對鏈路帶寬、延遲進行設置。最後通過實例證明方案的可行性。

 

關鍵詞:網絡仿真;NS-2;視頻


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中加入新的視頻傳輸協議模塊的仿真試驗來說,可以應用文中給出的實驗平臺,分析和驗證協議的有效性。

 

【來源】

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章