姜雨菲,梁向陽
(西安工業大學 計算機科學與工程學院 新型網絡與檢測控制國家地方 聯合工程實驗室,陜西 西安 710021)
“計算機網絡”及其相關課程是教育部指定的計算機專業和信息類專業本科生和研究生的核心基礎課程[1]。課程以網絡體系結構為框架展開,由于網絡概念一般比較抽象,學生難以理解,而實驗教學環節能很好地彌補這一缺陷。又由于實際的網絡實驗受到環境、規模的限制,采用仿真方法便成為最經濟有效的課程教學實驗手段[2]。
TCP擁塞控制是“計算機網絡”教學中的一個重點和難點[3]。隨著當前傳統的單一網絡結構轉變為多種異構網絡結合的復雜混合網絡結構,也對相關的實驗教學內容提出了新的挑戰和要求。復雜混合網絡中的擁塞控制不僅是網絡穩定、高效運行的關鍵,同時又是實現各種服務的基礎和前提。本文基于NS3仿真平臺,以TCP擁塞控制為實驗目標,詳細論述了當前普遍使用的多種TCP擁塞控制算法的仿真實現過程,并在多個網絡環境下對各類算法的公平性以及友好性進行了實驗比較。
NS3是一種基于 Linux的開源、免費的網絡仿真軟件,由于其能夠更符合實際地模擬現實世界中的各種網絡,因而其可靠性得到世界上眾多研究者和企業界的認可[4]。同時由于其適應性非常廣泛,可以實現多類復雜混合的網絡傳輸環境和拓撲環境,因而對“計算機網絡”教學有著非常重要的輔助價值和現實意義。圖1為其可模擬的典型復雜混合網絡。

圖1 模擬真實環境中復雜網絡拓撲
NS3仿真模塊基本涵蓋了網絡通信的所有層次,包括應用層的各種分組產生器,傳輸層的 TCP和UDP,網絡層的IPv4和IPv6協議,鏈路層和物理層的點對點(PPP)、CSMA,以及 IEEE 802.11a/b/g/n和LTE協議等無線網絡。
NS3提供各種用于網絡模擬的應用程序接口(application programming interface,API),可以在模擬腳本中調用這些 API來構建自己的仿真網絡結構[5-6],其仿真的基本模型如圖2所示。

圖2 NS3基本模型
其中,Node類提供了用來管理模擬器中網絡組件表示的各種方法,包括應用程序、協議棧、外接卡和驅動程序。Application類為仿真中的用戶級應用程序提供了各種方法。在這些應用程序中,發送方和接收方應用程序都用于在仿真網絡中發送和接收數據包。Channel類用于描述通信子網對象,并提供一種方法來管理它們并將它們連接到節點。NetDevice類用于描述 NS3中的網絡設備,包括 CsmaNetDevice、PointToPointNetDevice、Wi-FiNetDevice等。NetDevice類的主要功能是管理節點和連接信道對象。Topology Helper用于幫助連接網絡設備和節點以及網絡設備和通道,并幫助安排IP地址。
網絡中 Channel的傳輸方式主要包括點對點(PPP)、CSMA和無線。點對點仿真使用點對點協議(point-to-point protocol,PPP)傳輸分組。對于點對點信道來說,對應的網絡設備類是PointToPointNetDevice,信道類是PointToPointChannel。構建點對點網絡鏈路的核心代碼如圖3所示。

圖3 點對點網絡鏈路的核心代碼
CSMA網絡與PPP都屬于有線網絡技術,不同之處是 CSMA信道可以連接多個節點,如總線型網絡等,需要節點競爭信道使用權。其鏈路仿真構建的核心代碼如圖4所示。

圖4 CSMA鏈路仿真構建的核心代碼
無線網絡由一個接入點(access point,AP)和多個nWifi移動節點組成,無線鏈路仿真構建的核心代碼如圖5所示。
在NS3仿真平臺上可以通過自主創建節點、配置信道屬性、創建信道并連接節點來實現網絡拓撲的建立。NS3的所有模塊都為用戶提供了豐富的助手類,可以屏蔽復雜操作的實現細節,從而降低了編寫模擬腳本的復雜度。

圖5 無線鏈路仿真構建的核心代碼
實驗場景如圖6所示,其中0—3,6—9節點可以同時作為發送端和接收端,4,5節點為交換路由節點,4~5鏈路為典型的瓶頸鏈路。傳輸方式是有線,通過設置節點發送速率和鏈路的傳輸時延,可模擬多種混合網絡環境,具有較好的普適性。

圖6 4∶4啞鈴網絡拓撲結構
本文使用 NS-3.29版本,仿真環境為 Ubuntu 16.04。構建圖6網絡拓撲結構的主要代碼如圖7所示。
在網絡運行的某段時間,如果對網絡傳輸資源的需求超過了該資源所能提供的可用部分,網絡的性能就要發生變化,這種情況叫擁塞[7]。擁塞控制能防止過多的數據同一時間注入到網絡當中,從而使網絡中的設備資源或鏈路不致過載。擁塞控制常常是在TCP中實現的,因此也叫TCP擁塞控制。
NS3中TCP的屬性和trace變量都集中在以下3個核心類中。TcpSocket:這是一個虛類,主要定義了一些基本的TCP屬性;TcpSocketBase:窗口管理、擁塞控制等主要TCP算法都在這個類中實現;TcpL4Protocol:是與網絡層的接口,也負責TcpSocketBase對象。

圖7 圖6網絡拓撲結構的主要代碼
實驗人員在仿真程序的頂部以及在為節點創建網絡協議棧之前添加相應代碼,就可以設置所需要的TCP擁塞控制算法。例如,設置Cubic擁塞控制算法如下:

擁塞控制算法的公平性和友好性一般是通過吞吐量的值來衡量的,而吞吐量的獲取需要套接字的屬性[8]。通過 Socket::CreateSocket()函數創建套接字,其返回值就是一個套接字指針,其參數必須是ns3::SocketFactory對象,需要通過配置套接字指針把屬性和 TcpL4Protocol對象關聯在一起,采用的方法是通過配置系統函數Config::Set(),其核心代碼如下:

NS3支持的擁塞控制算法有十多種之多,基本涵蓋了當前所有常用的擁塞控制算法,包括NewReno、Cubic、Vegas、Yeah、Hybla等。對 NS3支持的主要TCP擁塞控制算法進行仿真,將仿真參數設置如下:鏈路帶寬 100 Mbps,時延 100 ms,仿真時間 250 s,丟包率0.000 001。去掉前50 s非穩態區數據后的仿真實驗結果如圖8所示。

圖8 TCP擁塞控制算法的cwnd(網絡擁塞窗口)
下面兩小節將以其中兩個典型的擁塞控制算法NewReno和Cubic為例,進行驗證性分析。
4.1.1 NewReno擁塞控制算法的驗證性分析
NewReno是 Windows系統多個版本中采用的TCP擁塞控制算法[9],也是大部分“計算機網絡”課程中的教學事例算法,其核心思想涉及對擁塞控制窗口和慢啟動閾值的調節機制。
在慢啟動階段,發送端每收到了一個新的 ACK(確認字符),擁塞窗口就增加一個 MSS(最大數據段長度),擁塞窗口的計算方法為:

在擁塞避免階段,擁塞窗口的增長幅度相對于慢啟動階段有所放緩。窗口大小在一個RTT(往返時延)內增加一個 MSS,從指數增加變成了線性增加。此時,發送端收到一個新ACK時,新擁塞窗口的計算方法為:

RTO(重傳超時時間)超時、快速重傳與快速恢復時,擁塞事件可以由RTO超時和重復ACK引起。若發送方連續收到N(一般為3)個重復ACK,則發送方確定數據包丟失,它將立即重新發送數據包,而不等待RTO超時,之后進入快速恢復階段。此時,慢啟動閾值的計算方法為:

截取圖 8(g)中 NewReno擁塞控制窗口變化的部分數據放大,如圖9所示。

圖9 NewReno算法擁塞控制窗口局部放大圖
由圖9可見,擁塞控制窗口在增加的時候有一個明顯的指數上升階段和一個線性上升階段,而當發生重傳時,慢啟動閾值會降為當前擁塞窗口的一半,并基于此進入擁塞避免階段。由此可見,該算法的仿真結果和理論分析完全一致[10]。
4.1.2 Cubic擁塞控制算法的驗證性分析
Cubic算法是在 Bic算法基礎上改進而來的,并被應用在當前多個Linux操作系統版本中[11],也是較流行的一種擁塞控制算法,對其進行研究有助于理解Linux操作系統的網絡特性。
Cubic算法使用一個如下的三次立方函數來代替Bic算法中的窗口探測曲線,其擁塞窗口的計算方法為:

截取圖8(h)中Cubic擁塞控制窗口變化的部分數據放大,如圖10所示。
從圖 10可見,除了發生丟包重傳而使得擁塞控制窗口數值突然下降外,整個擁塞控制窗口的變化完全符合三次立方函數的變化趨勢,和理論分析完全一致[12]。
除了上述兩個典型的擁塞控制算法,文獻[13—25]也分別說明了其他算法仿真結果的合理性與準確性。

圖10 Cubic算法擁塞控制窗口局部放大圖
公平性是TCP擁塞控制算法的重要特征之一,是指采用同一種擁塞控制算法的 TCP流對網絡共享資源(如瓶頸鏈路)的占用公平程度。對NS3內支持的主要TCP擁塞控制算法進行公平性實驗仿真,每次仿真中,有4條采用相同擁塞控制算法的TCP流,2條基于高延時(100 ms)、高帶寬(100 Mb·s-1)的鏈路,2 條普通鏈路(2 ms,1 Mb·s-1),以各鏈路的吞吐量作為比較的指標依據。其仿真結果如圖11所示。仿真時間為 250 s,丟包率為 0.000 001。

圖11 TCP擁塞控制算法不同鏈路吞吐量對比
仍以NewReno算法和Cubic算法為例進行分析說明。NewReno算法是 RTT敏感性算法,在網絡運行初期,低延遲的TCP流具有較小的RTT,因此其擁塞窗口增長很快,吞吐量激增,而當高延遲TCP流的擁塞窗口也增長上來后,在網絡傳輸錯誤率不高的情況下,網絡帶寬的大小將決定對瓶頸鏈路的占用比例。由此可見,NewReno算法對網絡環境是較為敏感的,不同的網絡環境會有不同的性能特征,但同質網絡環境下的公平性卻非常好。而Cubic算法的擁塞窗口增長函數是由連續兩個擁塞事件之間的時間間隔決定的,與RTT無關[26],這就使得Cubic算法在多個共享瓶頸鏈路的TCP流之間表現出良好的公平性,且不受網絡環境的影響。由此可見,采用Cubic的Linux操作系統在網絡環境略差的情況下還可以保持相對優良的網絡傳輸性能。
友好性是TCP擁塞控制算法的另一個重要特征,是指采用不同擁塞控制算法的 TCP流之間對網絡共享資源(如瓶頸鏈路)的占用公平程度。下面以Cubic為基準,實現其與其他擁塞控制算法的友好性對比實驗。每次仿真有4條TCP流,2條采用Cubic,2條采用其他算法,各鏈路的帶寬為 100 Mb·s-1,時延為 100 ms,仿真時間250 s,丟包率為0.000 001。其仿真結果如圖12所示。

圖12 Cubic算法與其他擁塞控制算法友好性對比
由圖12可見,在本實驗設定的網絡環境中,Cubic具有較好的傳輸性,網絡吞吐量穩定,且不會受其他TCP流的影響。由于每種擁塞控制算法的設計都有其適應性范圍和條件,因此也可以得出,一些擁塞控制算法(如 NewReno、YeAH)在當前網絡實驗環境下與Cubic相比的友好性較差。
文章采用NS3仿真工具,搭建了多種類TCP擁塞控制算法的啞鈴型混合網絡實驗環境,并詳細論述了實驗平臺實現的方法,包括拓撲構建、網絡環境參數設置、協議棧和套接字的安裝、擁塞控制算法的配置等關鍵步驟。文章對多個擁塞控制算法進行了驗證性仿真實驗,并以NewReno和Cubic算法為例進行了理論分析對比。在此基礎上,對多個算法在不同網絡環境下的公平性進行了仿真和結果分析,并以 Cubic為對象,仿真對比了該算法與其他擁塞控制算法的友好性。仿真結果符合理論分析,實驗設計成功,結果正確。該實驗方法和平臺不僅可以服務于本科生和研究生教學,也可以通過修改擁塞控制算法源代碼,產生新的擁塞控制算法,使其進一步成為可靠的研究性實驗平臺。