文/储赟 朱尚明
随着互联网及其应用的飞速增长,当前的互联网协议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网络两端之间的可用带宽提供了一种简单有效的方法,为网络监控和性能测量提供了有益的手段。