胡晉彬,羅望卿,王 進
(長沙理工大學(xué) 計算機與通信工程學(xué)院,湖南 長沙 410114)
計算機網(wǎng)絡(luò)是計算機科學(xué)與技術(shù)、軟件工程和通信工程等專業(yè)的基礎(chǔ)課程,具有理論內(nèi)容多、范圍廣和知識更新速度快的特點。計算機網(wǎng)絡(luò)教學(xué)特別注重理論教學(xué)與實踐操作教學(xué)相結(jié)合,通過具體的計算機網(wǎng)絡(luò)實驗幫助學(xué)生理解和掌握計算機網(wǎng)絡(luò)傳輸機制及其工作原理。然而,現(xiàn)有計算機網(wǎng)絡(luò)教學(xué)方案設(shè)計中很少考慮目前工業(yè)界的實際網(wǎng)絡(luò)需求變化,具體教學(xué)方案設(shè)計未采用工業(yè)界實際部署的網(wǎng)絡(luò)傳輸協(xié)議,使得學(xué)生難以真正了解計算機網(wǎng)絡(luò)技術(shù)在實際工業(yè)環(huán)境應(yīng)用中的需求變化,以及網(wǎng)絡(luò)傳輸協(xié)議在實際網(wǎng)絡(luò)環(huán)境中部署的具體問題和所面臨的實際挑戰(zhàn)。為了改變這種狀況,教師應(yīng)及時了解實際工業(yè)生產(chǎn)環(huán)境中計算機網(wǎng)絡(luò)技術(shù)的迭代和更新,在計算機網(wǎng)絡(luò)教學(xué)中將網(wǎng)絡(luò)實驗設(shè)計與現(xiàn)代工業(yè)生產(chǎn)中的網(wǎng)絡(luò)技術(shù)緊密結(jié)合,設(shè)計與社會發(fā)展需求和實際應(yīng)用相結(jié)合的教學(xué)方案,提高學(xué)生的創(chuàng)新能力和解決實際工程問題的能力,同時提高學(xué)生的學(xué)習(xí)興趣,促進計算機網(wǎng)絡(luò)技術(shù)教學(xué)的發(fā)展。
本文以目前工業(yè)界在生產(chǎn)數(shù)據(jù)中心網(wǎng)絡(luò)中實際部署的網(wǎng)絡(luò)傳輸協(xié)議[1-3]為例,設(shè)計并實現(xiàn)了計算機網(wǎng)絡(luò)傳輸控制的實驗方案,幫助學(xué)生在掌握計算機網(wǎng)絡(luò)基本概念和傳輸機制原理的同時,更深刻地理解網(wǎng)絡(luò)中數(shù)據(jù)包從發(fā)送端經(jīng)過網(wǎng)絡(luò)中間設(shè)備交換機,再傳輸?shù)浇邮斩说耐暾麄鬏斶^程。具體來說,在NS-3網(wǎng)絡(luò)仿真系統(tǒng)軟件[4]環(huán)境下,學(xué)生通過C++語言編寫程序搭建網(wǎng)絡(luò)拓?fù)洹⑤斎刖W(wǎng)絡(luò)流量、配置路由、部署基于不同擁塞反饋信號的網(wǎng)絡(luò)傳輸協(xié)議,并測試實時吞吐率和數(shù)據(jù)流完成時間等網(wǎng)絡(luò)性能[5],以達(dá)到了解網(wǎng)絡(luò)傳輸控制的工作流程和深入理解網(wǎng)絡(luò)傳輸控制原理的目的。
NS-3是基于事件驅(qū)動的仿真軟件,具有免費的源代碼公共源,可滿足學(xué)術(shù)研究和教學(xué)對網(wǎng)絡(luò)仿真模擬的需求[6]。在NS-3網(wǎng)絡(luò)仿真環(huán)境中,可以采用C++和Python兩種編程語言編寫程序,其源代碼可以應(yīng)用于Linux、Mac OS、Cygwin和Mingw等不同操作系統(tǒng)。一個完整的NS-3 模型具有應(yīng)用層、傳輸層、網(wǎng)絡(luò)層、鏈路層和物理層。與NS-2相比,NS-3在各個層面都有了很大改進。NS-2網(wǎng)絡(luò)仿真系統(tǒng)軟件只支持C語言和OTcl Tool語言,其仿真結(jié)果演示需要通過網(wǎng)絡(luò)動畫模擬器進行。此外,NS-2的很多模塊都采用C語言編寫,有些模塊采用OTcl腳本語言編寫,如果只采用C語言而不用OTcl腳本無法運行仿真實驗。然而在NS-3網(wǎng)絡(luò)仿真系統(tǒng)軟件中,所有模擬器均采用C++編寫,具有良好的繼承性和多態(tài)性[6]。學(xué)生在NS-3網(wǎng)絡(luò)仿真系統(tǒng)軟件中可采用C++和Python兩種編程語言編寫程序和模擬腳本,為C++程序生成相應(yīng)的跟蹤文件,還可以靈活地生成跟蹤文件以分析仿真模擬過程。該軟件還有一些其他特點,例如使用IP地址處理節(jié)點端口,更有助于學(xué)生理解傳輸過程[7]。
采用NS-3進行網(wǎng)絡(luò)仿真實驗一般有4個步驟:①確定仿真場景;②編寫網(wǎng)絡(luò)仿真腳本配置拓?fù)浜蛻?yīng)用程序;③運行模擬實驗;④分析仿真數(shù)據(jù)。
模擬場景由用戶根據(jù)所研究的網(wǎng)絡(luò)場景確定,編寫網(wǎng)絡(luò)仿真程序和腳本可分為6個步驟:①通過仿真場景確定拓?fù)浣Y(jié)構(gòu)和所需的仿真模塊,搭建相應(yīng)節(jié)點;②通過仿真場景確定網(wǎng)絡(luò)設(shè)備類型,并根據(jù)拓?fù)浒惭b在相應(yīng)節(jié)點上;③為每個網(wǎng)絡(luò)設(shè)備部署互聯(lián)網(wǎng)協(xié)議棧并分配IP地址;④通過模擬場景確定流量模式,利用Application的子類生成相應(yīng)的數(shù)據(jù)包;⑤根據(jù)需要啟動相應(yīng)的記錄和跟蹤系統(tǒng),生成數(shù)據(jù)供后期分析仿真結(jié)果;⑥Simulator::Run()函數(shù)啟動仿真程序。
基于NS-3網(wǎng)絡(luò)仿真系統(tǒng)軟件平臺構(gòu)建網(wǎng)絡(luò)拓?fù)?,編寫C++程序測試流完成時間和實時吞吐率,深入理解數(shù)據(jù)包從發(fā)送端通過交換機傳輸?shù)浇邮斩说膫鬏斎^程以及傳輸過程的擁塞反饋。
2.2.1 拓?fù)鋭?chuàng)建
采用數(shù)據(jù)中心廣泛部署的葉—脊(Leaf-Spine)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)[8],其中脊交換機為核心交換機;葉交換機為網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)中的接入層,其承上啟下,連接終端服務(wù)器與核心交換機。葉—脊網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)主要解決傳統(tǒng)網(wǎng)絡(luò)拓?fù)錈o法適應(yīng)數(shù)據(jù)中心流量急劇增加和數(shù)據(jù)中心規(guī)模日益擴大而帶來的數(shù)據(jù)中心高速互聯(lián)要求問題。與傳統(tǒng)網(wǎng)絡(luò)架構(gòu)相比,葉—脊網(wǎng)絡(luò)拓?fù)浼軜?gòu)可以降低網(wǎng)絡(luò)傳輸延時、緩解網(wǎng)絡(luò)流量瓶頸和擴展網(wǎng)絡(luò)帶寬。
本文實驗需搭建一個擁有2 Leaf和2 Spine的葉—脊拓?fù)浣Y(jié)構(gòu)(發(fā)送端和接收端之間有2條并行路徑)。如圖1所示,拓?fù)浣Y(jié)構(gòu)由兩臺Spine交換機S1、S2,兩臺Leaf交換機L1、L2和4臺終端服務(wù)器組成。
Fig.1 Leaf-spine topology圖1 葉—脊拓?fù)浣Y(jié)構(gòu)
設(shè)置拓?fù)浜螅渲弥鳈C的IP地址。在算法中,IP地址的分配需要定義Ipv4addressHelper對象地址;然后通過IP地址調(diào)用SetBase進行網(wǎng)關(guān)與子網(wǎng)掩碼設(shè)置;最后在Assign函數(shù)調(diào)用IP地址的基礎(chǔ)上自10.1.1.1起對網(wǎng)絡(luò)設(shè)備分配地址。Assign函數(shù)通過對網(wǎng)絡(luò)連接關(guān)系進行分析得到網(wǎng)絡(luò)上任意兩個節(jié)點之間的路徑信息,然后將這些數(shù)據(jù)存儲到一個樹型結(jié)構(gòu)中,這個樹即為網(wǎng)絡(luò)圖。該拓?fù)渖隙喙?jié)點網(wǎng)絡(luò)設(shè)備以這種方式進行地址分配時需要使用Address Assign(devices)進行地址分配,而代碼設(shè)置的對象接口Ipv4InterfaceContainer用于保存和管理成功分配好的IP地址。具體IP地址分配代碼為:
2.2.2 NS-3 C++程序
(1)首先添加相應(yīng)模塊的頭文件,具體代碼為:
然后定義節(jié)點容器nodes,由nodes.get(i)獲取第i個節(jié)點,節(jié)點使用Create()函數(shù)創(chuàng)建節(jié)點,具體代碼為:
最后配置基本參數(shù)node節(jié)點個數(shù)、servers服務(wù)器個數(shù)、leaf-spine交換機個數(shù)、flow數(shù)量等,具體代碼為:
(2)確定所需網(wǎng)絡(luò)設(shè)備類型,并根據(jù)第一步設(shè)置好的拓?fù)浣Y(jié)構(gòu)將其分別安裝在相應(yīng)節(jié)點上。編寫代碼定義點對點鏈接對象pointToPoint,用于配置網(wǎng)絡(luò)設(shè)備,設(shè)置點對點通道的鏈路速率,設(shè)置點對點通道的鏈路延時。定義好點對點鏈接對象后需要定義網(wǎng)絡(luò)設(shè)備容器對象設(shè)備,用于調(diào)用安裝節(jié)點函數(shù),將對等網(wǎng)絡(luò)設(shè)備與通道安裝到該節(jié)點,網(wǎng)絡(luò)設(shè)備安裝完成后需將其分配到devices。
(3)為每個網(wǎng)絡(luò)設(shè)備安裝互聯(lián)網(wǎng)協(xié)議棧并分配IP地址。首先需要安裝Internet協(xié)議棧,在C++中采用代碼InternetstackHelper定義對象堆棧;然后堆棧調(diào)用節(jié)點安裝函數(shù)為nodes中包含的節(jié)點安裝網(wǎng)絡(luò)協(xié)議棧。實驗過程中部署數(shù)據(jù)中心網(wǎng)絡(luò)中廣泛應(yīng)用的基于顯式擁塞通知(Explicit Congestion Notification,ECN)標(biāo)記的DCTCP[8-9]傳輸協(xié)議。DCTCP于2010年首次被提出,其是數(shù)據(jù)中心第一個專用的擁塞控制協(xié)議。DCTCP調(diào)整機制涉及發(fā)送端、交換機和接收端,其利用交換機隊列長度信息判斷網(wǎng)絡(luò)擁塞程度,對超過一定隊列長度閾值的數(shù)據(jù)包標(biāo)記ECN位。當(dāng)接收端接收到ECN標(biāo)記的數(shù)據(jù)包,將相應(yīng)的確認(rèn)包標(biāo)記ECN-echo并發(fā)送到發(fā)送端,發(fā)送端根據(jù)ECN標(biāo)記比例對發(fā)送窗口進行調(diào)整。
(4)使用Application的子類生成相應(yīng)數(shù)據(jù)包。定義監(jiān)聽對象echoServer,代碼為UdpEchoServerHelper echoServer()。echoServer使用Install(nodes.Get()))安裝echo服務(wù)器程序,安裝成功后返回的echo服務(wù)器程序由serverApps保存。調(diào)用ServerApps設(shè)置ServerApps中包含應(yīng)用程序的開始和停止時間,代碼為serverApps.Start(Seconds(1.0)),serverApps.Stop(Seconds(10.0))。定義被監(jiān)控的客戶端對象echoClient。獲取服務(wù)器的IP地址,向服務(wù)器端口發(fā)送數(shù)據(jù),并設(shè)置要發(fā)送的最大數(shù)據(jù)包數(shù)量、設(shè)置發(fā)送數(shù)據(jù)包的時間間隔以及設(shè)置發(fā)送數(shù)據(jù)包的大小,代碼為echo-Client.SetAttribute("MaxPackets",UintegerValue(1));echo-Client.SetAttribute("Interval",TimeValue(Seconds(1.0)));echoClient.SetAttribute("PacketSize",UintegerValue(1024))。調(diào)用Install函數(shù)在節(jié)點上安裝客戶機應(yīng)用程序,調(diào)用Start函數(shù)設(shè)置應(yīng)用程序啟動的秒數(shù),調(diào)用Stop函數(shù)設(shè)置應(yīng)用程序啟動的時間,代碼為clientApps.Start(Seconds(2.0));clientApps.Stop(Seconds(10.0))。
(5)根據(jù)需要激活相應(yīng)的記錄和跟蹤系統(tǒng),為后續(xù)模擬結(jié)果分析生成數(shù)據(jù),并開始模擬實驗。
2.2.3 測試與數(shù)據(jù)分析
運行以上C++實驗程序,深入理解傳輸協(xié)議的工作過程,分析數(shù)據(jù)包如何在網(wǎng)絡(luò)中通過交換機從發(fā)送端傳輸?shù)浇邮斩?,并給出流完成時間和實時吞吐率的計算方法。
(1)數(shù)據(jù)包傳輸過程分析。首先要對是否有數(shù)據(jù)從發(fā)送端發(fā)往接收端進行編碼判斷,如果發(fā)包成功,程序需繼續(xù)判斷發(fā)包成功目的IP是否在同一網(wǎng)段中。如果發(fā)包方目的IP與發(fā)包方地址所歸屬的網(wǎng)段一致,程序就會判斷正確,進行編碼,將數(shù)據(jù)包封裝成一幀,再通過接入層進入?yún)R聚層中,經(jīng)過匯聚層中的網(wǎng)絡(luò)設(shè)備將數(shù)據(jù)包送到目的IP;如果發(fā)包方目的地址與發(fā)包方不在一個網(wǎng)段中,那么發(fā)包方就會將數(shù)據(jù)包轉(zhuǎn)送到目的IP,再通過匯聚層將數(shù)據(jù)包轉(zhuǎn)送到網(wǎng)關(guān)中。如果沒有收到目的IP,那么該數(shù)據(jù)包將被丟棄;若接收到目的IP,則該數(shù)據(jù)包會繼續(xù)傳送下去,直至所有數(shù)據(jù)包都收到為止,如此循環(huán)重復(fù)多次即可實現(xiàn)整個過程。最后將數(shù)據(jù)包回傳至目的IP中,選擇轉(zhuǎn)發(fā)路徑及轉(zhuǎn)發(fā)端口,IP包被確認(rèn)后可轉(zhuǎn)發(fā)至下一路由器。IP包在到達(dá)路由器時先從IP頭讀取目的IP地址并查找路由表,IP包按照路由協(xié)議算法選擇最佳路徑轉(zhuǎn)發(fā)。
(2)流完成時間和實時吞吐率測試。流完成時間是指從發(fā)送第一個數(shù)據(jù)包至接收最后一個數(shù)據(jù)包的時間。用戶通常想讓網(wǎng)頁搜索、傳輸文件、深度學(xué)習(xí)、數(shù)據(jù)挖掘等業(yè)務(wù)在最短時間內(nèi)完成,因此流完成時間成為衡量傳輸性能的重要指標(biāo)[9-11]。從C++程序運行后生成的相應(yīng)trace文件中獲取流號、第一個數(shù)據(jù)包的發(fā)送時間和最后一個數(shù)據(jù)包的接收時間,然后計算出一條流的完成時間。如果需要計算平均流完成時間則可編寫腳本計算所有流的平均時間[12-13]。網(wǎng)絡(luò)性能的好壞通過實時吞吐率一目了然,統(tǒng)計一段時間內(nèi)的數(shù)據(jù)字節(jié)數(shù)量,然后采用Python腳本計算單位時間內(nèi)傳輸?shù)淖止?jié)數(shù),即實時吞吐率。
虛擬實驗教學(xué)完全建立在計算機技術(shù)和網(wǎng)絡(luò)通信技術(shù)的基礎(chǔ)上,學(xué)生可以在計算機上完成整個教學(xué)過程。通過部署目前工業(yè)界實際應(yīng)用的計算機網(wǎng)絡(luò)傳輸協(xié)議,學(xué)生不僅深入了解了數(shù)據(jù)包從發(fā)送端到接收端的傳輸全過程,學(xué)習(xí)了如何測試流完成時間和實時吞吐率等網(wǎng)絡(luò)性能指標(biāo),而且了解了計算機網(wǎng)絡(luò)傳輸技術(shù)的實際需求和面臨挑戰(zhàn),提高了研究能力、創(chuàng)新能力、動手能力和實際應(yīng)用能力。后續(xù)可結(jié)合最新計算機網(wǎng)絡(luò)傳輸技術(shù),設(shè)計更符合社會發(fā)展需求的實驗教學(xué)方案,以進一步提高教師教學(xué)水平和學(xué)生學(xué)習(xí)效果。