移動通信給人們帶來了十分方便的服務,無線局域網作為一種移動接入Internet的方法,逐漸成為研究的熱門課題。但是,由于應用日益廣泛的多媒體業務數據流量比較大,而無線帶寬有限,同時IP 網絡基本上是采用點到點盡力型(BestEffort) 服務方式,所以很難有效滿足實時多媒體業務的服務質量(Quality of Service)要求。為保證WLAN中多媒體業務的實時傳輸,需要進行QoS差分,給多媒體業務提供不同服務質量選擇。目前,關于多媒體QoS保證的研究普遍采用軟件仿真來完成,缺乏實際網絡測試。為了驗證各種差分算法的可行性,我們開發了一個實時多媒體業務開放式試驗平臺,實驗測試多媒體業務QoS保證調度算法,包括我們自己提出的調度算法。 IPv6擴大了IPv4地址空間,徹底解決了IPv4的地址空間耗盡和路由表爆炸等問題,并且在安全性、移動性以及QoS等方面提供了強有力的支持,而且, 更加合理的IPv6協議包頭設計使得路由器在處理數據包時更加快捷。Linux操作系統以其源代碼開放、性能高和穩定可靠等優點得到了日益廣泛的應用,越來越多的科研項目利用Linux系統作為實驗的軟件平臺。因此,測試平臺選擇了在IPv6 網絡環境下使用Linux操作系統來實現。 IPv6網絡環境和L inux實現機制 IPv6對IP4的改進 IPv6繼承了IPv4的優點,摒棄了它的缺點。IPv6與IPv4不兼容,但同所有TCP / IP 協議簇中的協議兼容,所以IPv6完全可以取代IPv4。相對于IPv4, IPv6 最大的優點是有足夠的地址空間。IPv6的地址是128位,大大增加了可用的地址空間,甚至以后每臺家電或者手機都分配一個IP地址都綽綽有余。而且, IPv6 的自動配置地址的功能使得用戶配置網絡非常簡單。 相對于IPv4, IPv6簡化了包頭格式,包頭有8個字段,總長固定為40字節;由于包頭長度統一,因此不再需要包頭長度字段,并且去除了IPv4 中一些其他字段,可以節省大量網絡路由器資源。此外, IPv6 提供了可擴展協議( ExtensibleProtocol) ,設計更為靈活,去掉選項字段,引入“下一頭標”(Next Header)指示IPv6 報頭之后的第一個擴展頭的類型。 IPv6擴展頭也必須攜帶一個Next Header字段。這樣,協議頭的結構像一個鏈表一樣可以不斷擴展,所以很容易加入新的特性,加強選擇功能。 Linux 2. 2以上內核版本,Windows XP Service Pack 1和Windows Server 2003等操作系統都提供對IPv6的支持。 Linux的Netfilter鉤子函數 NetFilter是Linux 2. 4內核實現數據包過濾、數據包處理等的功能框架。NetFilter提供了一個抽象、通用化的框架,該框架定義的一個子功能的實現就是包過濾子系統。Netfilter框架包含以下三部分: 1) 鉤子(Hook) 。Netfiter為IPv6協議定義了5個鉤子函數(如表1所示) ,這些鉤子函數在數據包流過協議棧的幾個關鍵點被調用。在這幾個點中,協議棧將把數據包及鉤子函數標號作為參數調用Netfilter的框架。 2) ip tables。內核模塊可以對一個或多個鉤子進行注冊,實現掛接,當某個數據包被傳遞給Netfilter框架時,內核檢測是否有模塊對該協議和鉤子函數進行了注冊。若注冊了,則調用該模塊注冊的回調函數,檢查、修改、丟棄該數據包并指示Netfilter將該數據包傳入用戶空間的隊列。 3) 用戶空間。排隊的數據包被傳遞給用戶空間異步地進行處理。一個用戶進程能檢查、修改數據包,甚至可以重新將該數據包通過離開內核的同一個鉤子函數注入內核。 Netfilter實現流程如圖1所示。圖示指明了Netfilter 5個鉤子函數掛載點在Linux內核協議棧中的位置,箭頭標明了IP包在包含Netfilter框架的IP層的流向。IP包從最左端進入系統經過校驗和版本檢查后經過第一個掛載點, 交給NF_IP6_PRE_ROUTING注冊的鉤子函數進行處理;經過路由選擇,決定該數據包需要轉發還是發給本機;若該數據包是發給本機的,則經過NF_ IP6_LOCAL_ IN注冊的鉤子函數處理以后傳遞給上層協議; 若需要轉發,則轉至NF_ IP6_FORWARD注冊的鉤子函數進行處理;所有需要發送到網絡的數據包,無論是本機發出的還是轉發的,都要經過最后一個鉤子函數NF_IP6_POST_ROUTING處理以后,才能發送到網絡上。本地網絡層以上產生的數據包通過NF_ IP6_LOCAL _OUT注冊的鉤子函數處理后,才可以進行路由選擇,然后由NF_ IP6_POST_ROUTING處的鉤子函數處理后發送到網絡上。 根據所需要處理的數據包的不同特點,選擇合適的掛載點,加入相應的回調處理函數,就可以實現對網絡數據包的截獲和各種控制。本文測試平臺使用Netfilter在NF_ IP6_POST_ROUTING掛載點截獲所有網絡數據包對其進行調度管理,實現差分QoS機制,保證多媒體業務的實時傳輸。 實時多媒體業務服務質量保證機制 基于SIP協議的多媒體業務 會話初始協議SIP ( Session Initiation Protocol)是一個基于應用層的控制協議,用來建立、控制維護和終止多媒體會話或呼叫。SIP協議為大范圍應用的多媒體通信提供了高級的信令和控制功能,通過少量基于文本的消息包在兩個實體之間傳遞消息, 還在網絡中提供代理服務器和重定位服務器來中繼和傳送消息, 支持多媒體會議、遠程學習、Internet會話和多媒體發布等一系列服務。在SIP協議應用中包含兩個部分:用戶端和網絡服務器。用戶端可以產生SIP消息包并通過一個或多個網絡服務器傳送到其他用戶端, 用戶端之間也可以直接通信。這里使用IPv6下的SIP服務器為用戶端建立連接。這樣,在進行多媒體通信時,就構成了兩類數據包,一類用于管理多媒體業務的信令數據包,一類為用于不同的SIP客戶端之間通信時的圖像、語音數據。為了保證在網絡中多媒體業務的實時傳輸,給多媒體業務以高優先級進行傳輸;同時,為了保證多媒體會話可以隨時建立,特別給予用于建立連接的信令數據以更高的優先級。這樣就形成了三級服務差分的概念,信令、多媒體業務、數據傳輸,其中SIP服務器的數據為信令數據,具有絕對高優先級,多媒體業務和數據傳輸分別具有高優先級和低優先級。 差分QoS調度 先入先出( FIFO)排隊法是指先到達的分組先被發送,這和處理機任務調度的F IFO算法思想是一致的。系統每次發送位于等待隊列頭部的分組,新到的分組則加到隊列的尾部。當一個新的分組到達而緩存已滿時,就需要一個丟棄策略來決定丟棄分組。這里,使用隊尾丟棄(Drop Tail)策略, 丟棄最新到達的分組。根據使用SIP服務器在IP網絡中進行多媒體通信時的三種數據包劃分三種不同的優先級,設置三個不同隊列,如圖2所示。 其中,用于建立實時業務連接的信令數據包,具有絕對高優先級,對應接入隊列0,系統檢測到之后,直接轉發,以保證實時通信業務可以隨時建立。SIP客戶端進行多媒體通信的數據具有高優先級,對應接入隊列1;普通數據具有地優先級,對應接入隊列2。接入隊列1和2中的數據包都將等待系統轉發。系統每次進入時間中斷進行數據包發送時,都先檢查高優先級的接入隊列1,如果隊列中有數據包等待則轉發、退出;如果隊列為空,則檢查接入隊列2執行相同的操作。這樣,多媒體業務會話就可以隨時建立,并進行有服務質量保證的實時傳輸。 測試平臺的設計與實現 測試平臺拓撲結構 測試平臺由六臺計算機、一個AP和一個Hub組成,拓撲結構如圖3所示。測試網絡由一個無線局域網和一個有線局域網組成,兩個子網間的數據通過路由器(計算機F)來轉發。數據通過路由器時,路由器將其截獲,然后根據不同的優先級確定數據轉發的順序等,實現差分QoS調度。 圖3中計算機F裝有雙網卡,配置為路由器,同時運行差分QoS調度算法,是測試平臺的核心部件。無線局域網由AP來組成,有兩個無線終端A和B。有線局域網中有兩臺計算機C和D。在A和C之間建立VoIP傳輸會話( Session) 1, 被賦予高優先級。在B和D之間建立數據傳輸會話2,被賦予低優先級。計算機E為SIP服務器,用于在兩個計算機終端上創建視頻會話。 測試平臺網絡配置 所有實現都在IPv6 下進行,路由器和SIP服務器運行Red Hat L inux 9操作系統,其他計算機終端運行Windows XP操作系統。無線局域網網絡前綴為3ffe: 327d: 8: 810: : /64,有線局域網網絡前綴為3ffe: 327d: 8: 811: : /64。 計算機F為路由器,無線和有線網絡中IPv6地址分別為3ffe: 327d: 8: 810: : 1 /64和3ffe: 327d: 8: 811: : 1 /64,并且開啟路由功能,實現無線網絡和有線網絡的連接。網絡配置方法為: ifconfig eth0 add 3ffe: 327d: 8: 810: : 1 /64 #添加IPv6地址 ifconfig eth1 add 3ffe: 327d: 8: 811: : 1 /64 echo 1 > /p roc / sys/ net/ ipv6 / conf / all/ forwarding #開啟IPv6路由功能 計算機E作為SIP服務器,除設定IPv6地址之外,還需要為其配置默認路由,以便不僅可以為本子網內的主機提供服務,而且可以為其他子網的主機提供服務。SIP服務器的IPv6地址為3ffe: 327d: 8: 811: : 111 /64, 默認路由為3ffe: 327d: 8: 811: : 1 /64。設置方法如下: ifconfig eth0 add 3ffe: 327d: 8: 811: : 1 /64 #添加IPv6地址 route - A inet6 add : : /0 gw 3ffe: 327d: 8: 811: : 1 /64 #添加默認路由 計算機A和C的IP地址分別為3ffe: 327d: 8: 810: : 5 /64和3ffe: 327d: 8: 810: : 7 /64,默認路由為3ffe: 327d: 8: 810: : 1 /64。計算機B和D的IP地址分別為3ffe: 327d: 8: 811: : 4 /64和3ffe: 327d: 8: 811: : 8 /64,默認路由為3ffe: 327d: 8: 811: : 1 /64。計算機A~D運行Windows XP操作系統, IPv6配置方法與在Linux下有所不同。計算機A的配置方法為在命令行下使用命令: ipv6 adu 4 /3ffe: 327d: 8: 810: : 5 #設定IPv6地址 ipv6 rtu 3ffe: 327d: 8: 810: : /64 #指定網絡前綴 ipv6 rtu : : /0 4 /3ffe: 327d: 8: 810: : 1 #設置默認路由 計算機B~D配置方法同上,只是將相應的IPv6地址和默認路由作些改動即可。 Linux可加載內核模塊編程 測試平臺使用Linux可加載內核模塊(Loadable KernelModule, LKM)來實現差分QoS調度。模塊(Module)是內核空間運行的程序,實際上是一種目標對象文件,沒有鏈接,不能獨立運行,但是其代碼可以在運行時鏈接到系統中作為內核的一部分運行或從內核取下,動態擴展內核的功能。動態可加載內核模塊的目標代碼一旦鏈接到內核,作用和靜態鏈接的內核目標代碼完全等價。 每個LKM至少由兩個基本的函數組成,一個是用于初始化所有的數據的函數init_module ( ) ,一個是用于清除數據從而能安全地退出的函數cleanup_module ( ) 。為了在模塊中使用Netfitler的鉤子函數,需要在初始化函數中調用nf_register_hook ( ) 函數注冊Netfiter Hook, 在清除函數中調用nf _unregister_hook ( )函數注銷Netfiter Hook。具體過程如下: / /定義并填充用于注冊函數的數據結構 static struct nf_hook_op s post_route = { {NULL, NULL}, DiffSev_post_route, / /處理函數 PF_ INET6, / /使用IPv6協議NF_ IP6_POST_ROUTING, / /使用IPv6的第一個Hook NF_ IP6_PR I_F IRST, / /讓自己的函數首先執行 }; / /初始化程序 int init_module () {** nf_register_hook (&post_route) ; / /注冊Netfiter Hook return 0; } / /清除程序 void cleanup_module () { ** nf_unregister_hook (&post_route) ; / /注銷Netfiter Hook return; } 注冊鉤子函數后,需要編寫處理函數,對截獲的數據包進行處理。模塊獲取數據包后,判斷其優先級,然后根據放入不同的隊列,進行業務差分的調度,保證實時業務的服務質量。模塊在完成對數據包的操作之后,可以返回下列預定義的Netfiter返回之中的一個。 其中,最為常用的為前三個返回值。NF_DROP的含義是該數據包將被完全丟棄,所有為它分配的資源都應當被釋放。NF_ACCEP返回值告訴Netfilter到目前為止,該數據包還是被接受的并且該數據包應當被遞交到網絡堆棧的下一個階段。NF_STOLEN告訴Netfilter“忘掉”這個數據包。這里告訴Netfilter的是:該hook函數將從此開始對數據包的處理,并且Netfilter應當放棄對該數據包做任何的處理。但是,這并不意味著該數據包的資源已經被釋放。這個數據包以及它獨自的sk_buff數據結構仍然有效,只是hook函數從Netfilter獲取了該數據包的所有權。 程序中對數據判斷時,首先有一個對SIP服務器數據的處理,模塊對截獲數據包的源地址和目的地址進行檢查,只要是發往和來自SIP的數據都將被無條件返回,返回值為NF_ACCEPT。這樣用作會話連接建立服務器的數據被看作是網絡信令數據,獲得絕對的高優先級,保證了不同主機之間可以隨時建立連接。為了簡化操作,這里我們只比較IPv6地址的最后32位來判斷。以下為數據包處理函數片斷: unsigned intVowlan_post_route (unsigned int hooknum, struct sk_buff 3 3 skb, const struct net_device 3 in, const struct net_device 3 out, int (3 okfn) ( struct sk_buff 3 ) ) { struct ipv6hdr 3 ipv6h = (3 skb) - > nh. ipv6h; struct in6_addr saddr = ipv6h - > saddr; struct in6_addr daddr = ipv6h - > daddr; int p rio = addr_belong(daddr) ; / /SIP服務器數據,不進行處理,直接返回,具有絕對高優先級 if ( saddr. s6_addr32 [3 ] = = 0x11010000) return NF_ACCEPT; if (daddr. s6_addr32 [3 ] = = 0x11010000) return NF_ACCEPT; **/ /區分QoS, 將數據插入不同的隊列 switch (p rio) { case H IGH_PR IOR ITY: { sendbuffer_insert(3 skb, H IGH_PR IOR ITY) ; / /加入高優先級隊列 return NF_STOLEN; } case LOW_PR IOR ITY: { sendbuffer_insert (3 skb, LOW_PR IOR ITY) ; / /加入低優先級隊列 return NF_STOLEN; } return NF_ACCEPT; } 被加入不同優先級隊列的數據包將被按照上一節中提到的調度算法被轉發,因為本文旨在介紹開放式的試驗平臺,所以具體調度算法的程序實現不再贅述。 編譯內核模塊,將生成的DiffServ. o作為一個內核模塊插入系統,此模塊可以象其他系統模塊一樣進行后臺運行。當內核模塊不再需要時,可以使用命令將其卸載。相應命令分別如下: insmod DiffServ. o / /加載內核模塊 rmmod DiffServ / /卸載內核模塊 實驗演示結果 延時性能測試 首先讓會話1運行多媒體視頻業務,賦予高優先級;會話2運行FTP數據傳輸業務,賦予低優先級。開啟優先級調度算法,使用IPv6下的Ping命令測定不同優先級業務的通信延時情況。考慮程序開銷等因素,測得高優先級的會話1延時為11ms~230ms,低優先級的會話2延時為40ms~359 7ms。很顯然,高優先級的多媒體業務由于被賦予了高的優先級而得到了更好的服務質量。 多媒體業務通信演示 為了便于觀察算法調度效果,兩個會話都用來傳輸視頻業務,改變優先級,觀察效果。先給兩個會話賦予相同的優先級。這時兩個會話發起連接呼叫,由于SIP服務器被賦予了絕對高優先級,所以呼叫總能順利完成,兩個會話建立連接。由于程序開銷等因素,建立連接后兩個視頻會話在通信時,都會有一些數據丟失引起的不連續現象。這時,將會話1調整為高優先級,會話2調整為低優先級,可以看到會話1視頻變得十分流暢,但是會話2的通信效果變得更差。效果如圖4所示,其中a為會話1效果, b為會話2效果,圖中有一只鳥在飛,當鳥飛到白色標桿處時,會話2由于數據丟失,左側不遠處還有鳥的影子,而會話1由于優先級比較高,所以比較流暢,畫面比較清晰。 調整兩個會話的優先級,將會話2調整為高優先級,會話1調整為低優先級,這時看到會話2視頻變得十分流暢,但是會話1的通信效果變得較差。再切換優先級,反復進行實驗,可以得到相同的效果,高優先級的業務可以得到好的服務質量,也就是說,可以通過優先級設置來保證實時業務的傳輸。 結語 為了進行實時多媒體業務QoS的研究,本文使用Linux操作系統基于IPv6設計并實現了的測試平臺。測試平臺使用NetFilter截獲數據包,然后根據具體算法對網絡數據包進行調度,實現QoS改善策略。測試平臺使用Linux的動態可加載模塊技術,以模塊的形式作為Linux系統的一部分來運行,所以效率較高,維護方便。實驗表明,測試平臺工作穩定,可以很好地支持QoS算法的測試,同時,測試平臺有良好的開放性,很容易在其基礎上驗證其他的算法、方案,對于實時多媒體業務QoS研究測試有十分重要的意義。 |