文/儲赟 朱尚明
隨著互聯網及其應用的飛速增長,當前的互聯網協議IPv4地址短缺等缺點已經越來越突出。IPv6作為IETF確定的下一代互聯網協議,有望解決IPv4地址短缺等問題。我國已經建成了世界上最大規模的IPv6網絡,但是IPv4向IPv6的演進需要相當長的時間才能完成。網絡應用特別是高清視頻等業務的拓展,對網絡帶寬提出了較高的要求。由于鏈路可用帶寬動態變化,背景流量呈現長相關、自相似特性以及短時突發性,使鏈路帶寬的實際測量面臨很大困難和挑戰,成為下一代網絡研究的熱點問題[1]。
網絡帶寬是指網絡鏈路在單位時間內所能傳送的是數據報文的最大比特數量,即最大的傳輸速率,它一般可以分為鏈路帶寬(Link bandwidth)和可用帶寬(Available bandwidth)兩種[2]。鏈路帶寬即數據在連接兩個節點間鏈路上的最大容量帶寬,可用帶寬即某一時刻在給定鏈路上發送數據可用的最大帶寬。在實際應用中,由于多個業務流會共享網絡,因此,鏈路帶寬無法準確地反映業務流在當前網絡中的帶寬占用狀態,相比較而言,可用帶寬更準確地反映網絡當前的流量通過能力。
本文提出了一種在下一代網絡協議IPv6網絡中,運用ICPMv6實現對網絡端到端可用帶寬進行測量的有效方法。
目前常用的帶寬測量方法主要有以下三種。
1.PPTD(Packet Pair/Train Dispersion)
PPTD方法用于測量端到端的整體帶寬容量。PPTD方法的原理是在源端發送有固定時間間隔的一對大小相同的數據包,然后在接收端測量這兩個包的時間間隔,通過這個時間間隔可以推算出端到端的帶寬容量[3]。該方法要求網絡中沒有其他的干擾流量,這在實際網絡環境中基本上不可能實現,因此需要多次測量,將那些受到干擾的測量包過濾掉。這種方法還需要兩端同時進行測量,部署成本高。
2. SLoPS(Self-Loading Periodic Streams)
SLoPS是另一種用于測量端到端可用帶寬的方法。SLoPS也是從源端發送數據包到目的端,其原理是當測試數據流量速率大于可用帶寬時,目的端包的時延將呈上升趨勢,在測試數據流量速度近似可用帶寬時,時延將是較平穩的[4]。該方法是通過不斷發送測試數據來進行流量估算,因此對網絡資源的占用較大,還會對現網的正常業務性能造成影響。
3.VPS(Variable Packet Size)
VPS是一種基于可變包長的探測方法,該方法設計思想是從源端到路徑上的任一節點發送不同大小的包, 通過計算往返時延與包大小的函數關系來獲取路徑上各段鏈路的可用帶寬[5]。具體來說,首先利用IP包頭的TTL域(工作原理和常用的Tracerouter工具 一樣),強制包在一個特定的跳上超時。這一跳的節點將丟棄該探測包,并利用Internet控制消息協議(ICMPv6)的超時錯誤報文發回源端,源端就獲取到了路徑節點信息,進而通過接收到的ICMPv6報文計算出到這一跳的往返時延和可用帶寬。可變包長VPS探測方法僅需要在源進行測量,部署成本低。
1. 測量原理
假設一條端到端的路徑由節點1到節點N構成 ,如圖1所示,其中Ci是節點i到節點i+1之間的鏈路帶寬(1≤N)。送時延三部分組成,設T(L)為發送一個長度為L的ICMPv6包的單程時延, 則有

圖1 端到端路徑示意

其中α為傳播時延,在數量級上目前基本上都達到了光速級別,與包的大小無關,只要不改變路徑,這部分時延就不會改變,為一固定值。βi為節點i到i+1排隊時延,主要與節點的緩存有關,由于網絡內數據包的數量很多,可能會在某個節點緩存內排隊等待發送,這種現象將導致排隊時延。取最小單程時延時,排隊時延可近似為0或一固定值β(設

設B為節點1到節點N的可用帶寬,可近似為節點1到N這條路徑上的瓶頸鏈路帶寬,即B =min(Ci)。當N=2時,則有;當N > 2時,不難證明有。簡單起見,本文取作為可用帶寬的近似估計值,即

這就是可變包長帶寬測量方法的數學表達,即在單程時延最小時通過求出發送包長與兩端的單程時延函數的斜率,即可計算出兩端的可用帶寬。
2. 設計思想
可變包長帶寬測量算法的設計思想主要基于以下兩點:
(1)為了避免排隊時延,從源端節點發送大小固定的很多包,該方法假設至少有一個包可以避免排隊時延,那么該往返時延肯定是不包含排隊時延的。因此,我們可以認為在這些包中具有最小雙程時延的包只包含了發送時延和傳播時延。
(2)為了簡化計算,相鄰發送包的增幅相同,并假定雙程時延除以2即為單程時延。
為了更精確的估算和忽略排隊時延,從源端每次發送大小不同的探測包后,最小雙程時延的包是排隊時延最小的,緊接著最小雙程時延探測包的下一個探測包在相同的網絡環境下,也是排隊時延較小的,因此,我們可以認為使用這兩次發送的時延差ΔT(即發送最小雙程時延探測包的時間與下一個探測包的雙程時延之差)計算所得的可用帶寬是比較精確的。
具體算法設計過程如下:
(1)從源端到目的端發送m個相同大小的探測包L,計算出最小雙程時延Tmin(L),此時,認為沒有排隊時延或者是最小排隊時延的。
(2)根據探測包的增幅ΔL從源端到目的端發送包長為L0、L0+ΔL、…、L0+nΔL的探測包,并根據第(1)步計算出每個探測包的最小雙程時延Tmin(L0)、Tmin(L0+ΔL)、…、Tmin(L0+nΔL)。
(3)從 Tmin(L0)、Tmin(L0+ΔL)、…、Tmin(L0+nΔL)中再獲取最小值,假設i是最小雙程時延最小值的位置編號,計算出最小雙程時延的差ΔT =Tmin(i+1)-Tmin(i)。
(4)取雙程時延的一半作為單程時延,根據ΔL和ΔT的比值估算可用帶寬,即B=ΔL/(ΔT/2)。
3.實現機制
本文在.Net環境下利用MFC基于原始套接字(Raw Socket)在IPv6環境下對可用帶寬測量算法進行了技術實現和模擬驗證。為生成ICMPv6回送請求和應答報文,首先定義一個ICMPv6包的結構如下:

圖2 端到端最小雙程時延的流程
typedef struct icmp6_hdr
{ //頭部8個字節
u_char icmp6_type; //類型
u_char icmp6_code; //代碼
u_short icmp6_cksum; //校驗和
u_short icmp6_id; //標識符
u_short icmp6_seq; //序列號
//報文主體
LONGLONG icmp6_data[DATALEN]; // 其中 icmp6_data[0]存儲發送時間(微秒級)
} ICMP6_HDR,*PICMP6_HDR;
(1)計算兩端的最小雙程時延
從源端到目的端發送m個相同大小的探測包,計算出最小雙程時延的流程圖如圖2所示。
首先創建socket套接字并發起連接,構造探測包時將發送端的CPU時鐘(微秒)寫入icmp6_data[0],然后把準備好的指定大小的探測包發送到指定目的端,接著等待接收應答包。只有滿足下面三個條件的應答包才是測試發送探測包的應答包:包的類型為ICMP6_ECHO_REPLY,目的端地址與發送包指定的目的端地址一致,包中的標識符與發送時的進程號一致。解析應答包獲得接收包時的CPU時鐘,從應答包中的icmp6_data[0]中取出發送時的CPU時鐘,兩者之差就是發送到目的端的雙程時延T,并用定義的數組來存放計算獲得的發送探測包的雙程時延。待發送完指定發送次數并應答包處理完畢后,采用快速排序算法計算出發送到指定目的端、指定包大小的最小雙程時延。
(2)計算兩端的可用帶寬
計算指定目的端的可用帶寬的流程圖如圖3所示。
首先初始化變長包個數n、包長增幅Size和起始包大小L0,根據包長增幅計算探測包大小L=L0+j*Size(j=0,1,…,n-1),然后發送探測包,計算該探測包的最小雙程時延并存放到定義的數組中,直到發送的測試包的個數等于n時不再發送。最后根據快速排序算法獲得數組中的最小值和該值所在位置,并計算出可用帶寬的值。
我們對上述可用帶寬測量算法在IPv6環境下進行了測試驗證,并和常用的帶寬測量的工具進行對比分析。
1.實驗環境

圖3 計算指定目的端的可用帶寬的流程
源端(發送端)為華東政法大學一臺主機,IPv6地址為:2001:da8:8020:3:fd35:fc63:9151:c19e;目的端(接收端)為上海外國語大學一臺主機,IPv6地址為:2001:250:600f:160:250:56ff:feac:3d03。測試時間為2018年6月13日 14∶21。
2. 實驗結果及分析
為進行測試驗證,我們對本文提及的可用帶寬測量算法初始化L0=32字節,帶寬測量增幅ΔL分別為2000字節、2500字節、3000字節,不同大小探測包測試個數為n=10,相同探測包的發送測試次數為m=5,分別進行了實際測試。
(1)探測包每次遞增2000字節的測試結果見表1。
根據表1得出探測包增幅ΔL=2000B,發送的10次探測包中最小雙程時延為2.21ms,最小雙程時延所在位置序號為1,ΔT=Tmin(i+1) - Tmin(i)=2.73-2.21=0.52ms, 計算可用帶寬為B=ΔL/(ΔT/2)=2000*8/(0.52/2)=61538Kbps=61.538Mbps。

表1 探測包增幅為2000字節

表2 探測包增幅為2500字節

表3 探測包增幅為3000字節

表4 30次重復實驗結果(Mbps)
(2)探測包每次遞增2500字節的測試結果見表2。
根據表2得出探測包增幅ΔL=2500B,發送的10次探測包中最小雙程時延為1.98ms,最小雙程時延所在位置序號為1,ΔT=Tmin(i+1)-Tmin(i)=2.56-1.98=0.58ms,計算可用帶寬為B=ΔL/(ΔT/2 )=2500*8/(0.58/2)=68965Kbps=68.965Mbps 。
(3)探測包每次遞增3000字節的測試結果見表3。
根據表3得出探測包增幅ΔL=2500B ,發送的10次探測包中最小雙程時延為2.23ms,最小雙程時延所在位置序號為 1,ΔT=Tmin(i+1)-Tmin(i)=2.23-2.93=0.7ms,計算可用帶寬為B=ΔL/(ΔT/2 )=3000*8/(0.7/2) =68571Kbps=68.571Mbps。
為了取得具有統計性和普遍規律性的實驗結果,我們對測量結果進行了反復多次驗證,以避免單次測量所產生的隨機誤差。通過次30次重復驗證,結果見表4。
為了驗證測試結果的正確性和有效性,我們通過Google瀏覽器自帶的帶寬測量工具從目的端(上海外國語大學一臺主機,IPv6地址為:2001:250:600f:160:250:56ff:feac:3d03)下載1.9G的文件測量的可用帶寬范圍為42.2 ~ 71.2Mbps。而表4多次重復測量結果的平均值分別為62.07Mbps、69.01Mbps、69.69Mbps,可見我們提出的可變包長帶寬測量算法和Google瀏覽器自帶的帶寬測量工具的測量結果是非常接近的,在IPv6網絡下是可行和有效的。
本文提出了在IPv6網絡中基于ICMPv6協議的可變包長帶寬測量算法,并進行了編程實現。通過多種測試結果與常用的帶寬測量工具對比結果,驗證了該算法的可行性和有效性。為測量IPv6網絡兩端之間的可用帶寬提供了一種簡單有效的方法,為網絡監控和性能測量提供了有益的手段。