胡晉彬,羅望卿,王 進
(長沙理工大學 計算機與通信工程學院,湖南 長沙 410114)
計算機網絡是計算機科學與技術、軟件工程和通信工程等專業的基礎課程,具有理論內容多、范圍廣和知識更新速度快的特點。計算機網絡教學特別注重理論教學與實踐操作教學相結合,通過具體的計算機網絡實驗幫助學生理解和掌握計算機網絡傳輸機制及其工作原理。然而,現有計算機網絡教學方案設計中很少考慮目前工業界的實際網絡需求變化,具體教學方案設計未采用工業界實際部署的網絡傳輸協議,使得學生難以真正了解計算機網絡技術在實際工業環境應用中的需求變化,以及網絡傳輸協議在實際網絡環境中部署的具體問題和所面臨的實際挑戰。為了改變這種狀況,教師應及時了解實際工業生產環境中計算機網絡技術的迭代和更新,在計算機網絡教學中將網絡實驗設計與現代工業生產中的網絡技術緊密結合,設計與社會發展需求和實際應用相結合的教學方案,提高學生的創新能力和解決實際工程問題的能力,同時提高學生的學習興趣,促進計算機網絡技術教學的發展。
本文以目前工業界在生產數據中心網絡中實際部署的網絡傳輸協議[1-3]為例,設計并實現了計算機網絡傳輸控制的實驗方案,幫助學生在掌握計算機網絡基本概念和傳輸機制原理的同時,更深刻地理解網絡中數據包從發送端經過網絡中間設備交換機,再傳輸到接收端的完整傳輸過程。具體來說,在NS-3網絡仿真系統軟件[4]環境下,學生通過C++語言編寫程序搭建網絡拓撲、輸入網絡流量、配置路由、部署基于不同擁塞反饋信號的網絡傳輸協議,并測試實時吞吐率和數據流完成時間等網絡性能[5],以達到了解網絡傳輸控制的工作流程和深入理解網絡傳輸控制原理的目的。
NS-3是基于事件驅動的仿真軟件,具有免費的源代碼公共源,可滿足學術研究和教學對網絡仿真模擬的需求[6]。在NS-3網絡仿真環境中,可以采用C++和Python兩種編程語言編寫程序,其源代碼可以應用于Linux、Mac OS、Cygwin和Mingw等不同操作系統。一個完整的NS-3 模型具有應用層、傳輸層、網絡層、鏈路層和物理層。與NS-2相比,NS-3在各個層面都有了很大改進。NS-2網絡仿真系統軟件只支持C語言和OTcl Tool語言,其仿真結果演示需要通過網絡動畫模擬器進行。此外,NS-2的很多模塊都采用C語言編寫,有些模塊采用OTcl腳本語言編寫,如果只采用C語言而不用OTcl腳本無法運行仿真實驗。然而在NS-3網絡仿真系統軟件中,所有模擬器均采用C++編寫,具有良好的繼承性和多態性[6]。學生在NS-3網絡仿真系統軟件中可采用C++和Python兩種編程語言編寫程序和模擬腳本,為C++程序生成相應的跟蹤文件,還可以靈活地生成跟蹤文件以分析仿真模擬過程。該軟件還有一些其他特點,例如使用IP地址處理節點端口,更有助于學生理解傳輸過程[7]。
采用NS-3進行網絡仿真實驗一般有4個步驟:①確定仿真場景;②編寫網絡仿真腳本配置拓撲和應用程序;③運行模擬實驗;④分析仿真數據。
模擬場景由用戶根據所研究的網絡場景確定,編寫網絡仿真程序和腳本可分為6個步驟:①通過仿真場景確定拓撲結構和所需的仿真模塊,搭建相應節點;②通過仿真場景確定網絡設備類型,并根據拓撲安裝在相應節點上;③為每個網絡設備部署互聯網協議棧并分配IP地址;④通過模擬場景確定流量模式,利用Application的子類生成相應的數據包;⑤根據需要啟動相應的記錄和跟蹤系統,生成數據供后期分析仿真結果;⑥Simulator::Run()函數啟動仿真程序。
基于NS-3網絡仿真系統軟件平臺構建網絡拓撲,編寫C++程序測試流完成時間和實時吞吐率,深入理解數據包從發送端通過交換機傳輸到接收端的傳輸全過程以及傳輸過程的擁塞反饋。
2.2.1 拓撲創建
采用數據中心廣泛部署的葉—脊(Leaf-Spine)網絡拓撲結構[8],其中脊交換機為核心交換機;葉交換機為網絡拓撲結構中的接入層,其承上啟下,連接終端服務器與核心交換機。葉—脊網絡拓撲結構主要解決傳統網絡拓撲無法適應數據中心流量急劇增加和數據中心規模日益擴大而帶來的數據中心高速互聯要求問題。與傳統網絡架構相比,葉—脊網絡拓撲架構可以降低網絡傳輸延時、緩解網絡流量瓶頸和擴展網絡帶寬。
本文實驗需搭建一個擁有2 Leaf和2 Spine的葉—脊拓撲結構(發送端和接收端之間有2條并行路徑)。如圖1所示,拓撲結構由兩臺Spine交換機S1、S2,兩臺Leaf交換機L1、L2和4臺終端服務器組成。

Fig.1 Leaf-spine topology圖1 葉—脊拓撲結構
設置拓撲后,配置主機的IP地址。在算法中,IP地址的分配需要定義Ipv4addressHelper對象地址;然后通過IP地址調用SetBase進行網關與子網掩碼設置;最后在Assign函數調用IP地址的基礎上自10.1.1.1起對網絡設備分配地址。Assign函數通過對網絡連接關系進行分析得到網絡上任意兩個節點之間的路徑信息,然后將這些數據存儲到一個樹型結構中,這個樹即為網絡圖。該拓撲上多節點網絡設備以這種方式進行地址分配時需要使用Address Assign(devices)進行地址分配,而代碼設置的對象接口Ipv4InterfaceContainer用于保存和管理成功分配好的IP地址。具體IP地址分配代碼為:
2.2.2 NS-3 C++程序
(1)首先添加相應模塊的頭文件,具體代碼為:
然后定義節點容器nodes,由nodes.get(i)獲取第i個節點,節點使用Create()函數創建節點,具體代碼為:
最后配置基本參數node節點個數、servers服務器個數、leaf-spine交換機個數、flow數量等,具體代碼為:
(2)確定所需網絡設備類型,并根據第一步設置好的拓撲結構將其分別安裝在相應節點上。編寫代碼定義點對點鏈接對象pointToPoint,用于配置網絡設備,設置點對點通道的鏈路速率,設置點對點通道的鏈路延時。定義好點對點鏈接對象后需要定義網絡設備容器對象設備,用于調用安裝節點函數,將對等網絡設備與通道安裝到該節點,網絡設備安裝完成后需將其分配到devices。
(3)為每個網絡設備安裝互聯網協議棧并分配IP地址。首先需要安裝Internet協議棧,在C++中采用代碼InternetstackHelper定義對象堆棧;然后堆棧調用節點安裝函數為nodes中包含的節點安裝網絡協議棧。實驗過程中部署數據中心網絡中廣泛應用的基于顯式擁塞通知(Explicit Congestion Notification,ECN)標記的DCTCP[8-9]傳輸協議。DCTCP于2010年首次被提出,其是數據中心第一個專用的擁塞控制協議。DCTCP調整機制涉及發送端、交換機和接收端,其利用交換機隊列長度信息判斷網絡擁塞程度,對超過一定隊列長度閾值的數據包標記ECN位。當接收端接收到ECN標記的數據包,將相應的確認包標記ECN-echo并發送到發送端,發送端根據ECN標記比例對發送窗口進行調整。
(4)使用Application的子類生成相應數據包。定義監聽對象echoServer,代碼為UdpEchoServerHelper echoServer()。echoServer使用Install(nodes.Get()))安裝echo服務器程序,安裝成功后返回的echo服務器程序由serverApps保存。調用ServerApps設置ServerApps中包含應用程序的開始和停止時間,代碼為serverApps.Start(Seconds(1.0)),serverApps.Stop(Seconds(10.0))。定義被監控的客戶端對象echoClient。獲取服務器的IP地址,向服務器端口發送數據,并設置要發送的最大數據包數量、設置發送數據包的時間間隔以及設置發送數據包的大小,代碼為echo-Client.SetAttribute("MaxPackets",UintegerValue(1));echo-Client.SetAttribute("Interval",TimeValue(Seconds(1.0)));echoClient.SetAttribute("PacketSize",UintegerValue(1024))。調用Install函數在節點上安裝客戶機應用程序,調用Start函數設置應用程序啟動的秒數,調用Stop函數設置應用程序啟動的時間,代碼為clientApps.Start(Seconds(2.0));clientApps.Stop(Seconds(10.0))。
(5)根據需要激活相應的記錄和跟蹤系統,為后續模擬結果分析生成數據,并開始模擬實驗。
2.2.3 測試與數據分析
運行以上C++實驗程序,深入理解傳輸協議的工作過程,分析數據包如何在網絡中通過交換機從發送端傳輸到接收端,并給出流完成時間和實時吞吐率的計算方法。
(1)數據包傳輸過程分析。首先要對是否有數據從發送端發往接收端進行編碼判斷,如果發包成功,程序需繼續判斷發包成功目的IP是否在同一網段中。如果發包方目的IP與發包方地址所歸屬的網段一致,程序就會判斷正確,進行編碼,將數據包封裝成一幀,再通過接入層進入匯聚層中,經過匯聚層中的網絡設備將數據包送到目的IP;如果發包方目的地址與發包方不在一個網段中,那么發包方就會將數據包轉送到目的IP,再通過匯聚層將數據包轉送到網關中。如果沒有收到目的IP,那么該數據包將被丟棄;若接收到目的IP,則該數據包會繼續傳送下去,直至所有數據包都收到為止,如此循環重復多次即可實現整個過程。最后將數據包回傳至目的IP中,選擇轉發路徑及轉發端口,IP包被確認后可轉發至下一路由器。IP包在到達路由器時先從IP頭讀取目的IP地址并查找路由表,IP包按照路由協議算法選擇最佳路徑轉發。
(2)流完成時間和實時吞吐率測試。流完成時間是指從發送第一個數據包至接收最后一個數據包的時間。用戶通常想讓網頁搜索、傳輸文件、深度學習、數據挖掘等業務在最短時間內完成,因此流完成時間成為衡量傳輸性能的重要指標[9-11]。從C++程序運行后生成的相應trace文件中獲取流號、第一個數據包的發送時間和最后一個數據包的接收時間,然后計算出一條流的完成時間。如果需要計算平均流完成時間則可編寫腳本計算所有流的平均時間[12-13]。網絡性能的好壞通過實時吞吐率一目了然,統計一段時間內的數據字節數量,然后采用Python腳本計算單位時間內傳輸的字節數,即實時吞吐率。
虛擬實驗教學完全建立在計算機技術和網絡通信技術的基礎上,學生可以在計算機上完成整個教學過程。通過部署目前工業界實際應用的計算機網絡傳輸協議,學生不僅深入了解了數據包從發送端到接收端的傳輸全過程,學習了如何測試流完成時間和實時吞吐率等網絡性能指標,而且了解了計算機網絡傳輸技術的實際需求和面臨挑戰,提高了研究能力、創新能力、動手能力和實際應用能力。后續可結合最新計算機網絡傳輸技術,設計更符合社會發展需求的實驗教學方案,以進一步提高教師教學水平和學生學習效果。