作为网络测试内容的一部分,精确的测量网络的带宽是非常有意义的。它不但可以帮助网络管理人员了解整个网络的状态,及时发现网络的瓶颈所在,更重要的是可以避免拥塞的发生,实现更好的拥塞控制策略。
1 引言 作为网络测试内容的一部分,精确的测量网络的带宽是非常有意义的。它不但可以帮助网络管理人员了解整个网络的状态,及时发现网络的瓶颈所在,更重要的是可以给网络设计人员,特别是网络协议的开发人员提供指导,采用新的算法来控制路由的选择,避免拥塞的发生,实现更好的拥塞控制策略。近年来国内外对于网络带宽的测试也做了大量的研究,得出了很多网络带宽测试的算法。这些算法中就测试的对象来讲,有的是测试网络的总容量(Capacity);有的是测试网络的可用带宽(Avaible Bandwidth);就测试的范围来讲有的是测试每一条链路(Hop by Hop);有的是测试端到端(End to End)[3][4][5]。总的来讲,这些技术可以归为两类:单数据包(Single packet)技术和数据包对(Packet Pairs)技术。名字来源于在一次探测中所使用到的数据包的数量。随着网络速度的不断提高,目前这些测试算法都面临很多新的问题,特别是系统的软硬件资源对于测试所带来的影响。
2 基本算法 2.1 单数据包技术
单数据包技术通常也称为可变大小数据包技术(Variable Packet Size),因为它向网络发送大小变化的探测数据包并统计达到目的端的时延来测试网络的带宽。网络的时延由传播时延、发送时延、排队时延三部分组成。这类算法典型的有pathchar、pchar、clink[3][5]等。其基本原理是基于低速的链路传输一个数据包所用的时间比高速的链路长。单数据包技术测试到的是网络的容量。如果一个大小已知的数据包经过一条链路的时间已知,则该链路的带宽就可以计算出来。计算必须考虑链路的传播时延,对于一定的传输媒介,传播时延是固定的。在不考虑网络的排队时延的情况下,传输时间(t)由数据包的大小(p),链路的带宽(b )还有一个固定的传播时延(l )决定。
测试时,发送多个不同大小的数据包,当这些数据包在该链路的传输时间被测到后,通过公式(1)我们可以得出链路的带宽b,当然这些值都存在干扰,采用滤波的方法可以过滤出最接近于实际带宽值的数据。
2. 2 数据包对技术
数据包对技术(Packet Pairs)利用数据包在传输过程中所形成的时间间隔(Dispersion Time)来测试带宽[1]。数据包对技术衍生出了很多的算法和工具,如bprobe、PBM算法、nettimer、 pathload[2][4]等。数据包对技术所测试的是链路的瓶颈带宽或是可用带宽,而不是单个数据包技术所测得的链路的容量。数据包对技术基本方法可以用图一来说明。
图中链路L1和L3的带宽是L2的两倍,L2是链路中的瓶颈。在没有干扰的情况下,由于L3带宽大于L2,因此两个数据包在经过L2、L3之间的节点处会形成时间间隔t。这个间隔时间等于L2链路末端的节点在接收完第一个数据包之后,用在接收第二个数据包上的时间。这个值也实际上就等于第二个包的发送时延。发送时延 与数据包大小 成正比和链路的带宽 成反比。
注意等式1和2之间的差别。单数据包技术在计算的时候必须考虑链路的传播时延,而数据包对技术并不需要考虑链路的传播时延,因为在没有干扰流量的情况下,对于所有的数据包而言,该值都是相等的。
数据包对技术受干扰流量的影响非常严重。如果干扰流量使得第一个数据包出现延迟,那么将会导致两个数据包之间的间隔时间被压缩,那么这样测试出来的链路带宽就会偏高。这就是时间压缩问题;如果干扰流量出现在第一个数据包和第二个数据包之间,那么将会出现排队的情况,则两个数据包之间的间隔将会被拉大,其结果使得测得的链路带宽偏小,这就是时间扩展问题。要采用数据包对技术获得精确的带宽测量值就必须把时间压缩和扩展过滤出来。
2.3 传输时间的计算
数据包传输时间的确定不仅需要两端的测试主机具有精确的时钟,同时还需要测试主机的时钟必须同步,另外在每一端的测试主机上部署测试的软件也是必须的。因此,为了简化测试,通常多数算法是测试数据包在网络链路上的往返时间RTT(Round Trip Time)[5]。这样可以避免时钟同步问题,同时也减少了测试软件的部署。对于数据包的传输控制,两类技术大都利用了IP数据包报头中的生存时间域(TTL)[6]。该值在数据包每经过一个路由器节点的时候会被消耗,其值会减一。一旦TTL被减为0时,该数据包就会被丢弃并且该节点会发送一个ICMP的TTL失效错误信息给原数据发送端。如果把被测试的链路终点设置为数据包TTL失效,发送端就可以通过记录数据包的发送时间加上ICMP错误信息的返回时间从而找到数据包到达链路终点并返回的时间RTT。
如下图所示:
测试数据包的TTL值被设置为2,在第一个节点TTL被减为1,第二个节点减为0。于是该主机就会发送一个ICMP错误信息返回给主机A。主机A即可获得数据包到达第二个路由器节点的RTT时间。
RTT的计算通用的方法都是测试主机在发送和接收到数据包时,通过申请系统中断,给每个数据包分配一时间戳(timestamp),发送时间戳与接收时间戳之差即是数据包在网络链路上的RTT传输时间。
3 高速网络环境下的带宽测试 从两类基本网络带宽测试技术的基本原理的分析可知,不论是单数据包技术还是数据包对技术都没有考虑到网络中的软硬件资源,特别是测试的主机系统对于网络带宽测试所带来的影响。这些影响特别是在高速的网络环境中,将会对测试的结果带来巨大的偏差。
目前的网络带宽测试算法的提出都是基于低速网络的,它们中的大部分,例如数据包对技术,要求网络的带宽不能高于发送端主机的发送速率。举例来讲,如果发送端在1ms的时间中发送1000Byte的数据包,那么被测网络的瓶颈带宽就不能超过8Mb/s,否则数据包之间将不可能产生时间间隔。随着网络技术的不断发展,目前的网络已经达到千兆的带宽,并向更高的传输速率发展。系统资源对于网络带宽测试的影响主要体现在1、网络中的元素2、测试主机对于数据包的处理速度3、测试主机系统I/O的带宽。
3.1网络中的元素
多数的网络带宽测试算法都需要通过ICMP返回信息确定数据包在网络中RTT时间。但是不同的路由设备具有不同的ICMP传播时延,如果链路中存在二层的交换设备,问题就更加的严重,因为二层的存储转发设备本身并不具有对IP数据包的控制机制,它不能递减TTL域的值,同时也不能产生ICMP的控制信息,因此使得在这样的条件下测试出的网络带宽必将是不可靠的,甚至不能测试出网络的带宽。另外,不同的路由选择有可能使得ICMP的返回路径与数据包的传输路径是非对称的,因此也就不能得出正确的结论。
3.2数据包的处理
网络中的数据包到达主机后,首先达到的是主机的网络接口卡NIC(network interface card)。在这里NIC将向系统申请中断,要求系统对达到的数据包进行I/O处理。系统I/O的中断间隔时间对于高速的网络接口卡性能有非常大的影响。目前的主机设备大都配备了千兆的以太网卡(GBIC)。假如有一数据包到达某一1Gb/s的网卡将产生一个I/O中断的请求,以太网中最大数据传输单元MTU为1500Byte,那么系统最多12μs就要响应一次中断请求。因为最大响应时间
对于大多数的主机系统来讲,中断是达不到这么高的速率的。目前大多数主机系统采用了延时中断技术(delayed interrupt)来降低CPU的中断请求、提高系统数据吞吐量,即捆绑多个数据包以后申请一次中断。该技术是NIC在接到第一个数据包后并不立即向CPU提起中断请求,要求CPU处理数据,同时释放缓冲准备接收下面的数据,而是设置一个延时中断时间,希望在该时间内有更多数据包到达,然后申请一次中断处理,这样做能够提高CPU的利用率,但却给网络带宽的测试带来了严重的影响。这种情况下,多数的系统根本没有办法为每一个到达NIC的数据包精确的分配时间戳, 大部分的数据包只能在到达NIC一段时间后才能获得时间戳,而且两个数据包可能具有相同的时间戳。因此没有办法知道每一个数据包到达主机的精确时间,数据包之间的时间间隔也就被掩盖了。
另一方面,申请中断后,对于NIC内的数据包的处理,系统需执行两次系统调用,一是为数据包获得时间戳,二是为数据包执行I/O操作。系统调用所花费的时间对于流出NIC的数据包的时间间隔和进入NIC的数据包的时间戳的获得都具有很大的影响。大多数x86的CPU系统在执行一次系统调用需要6个时钟周期,所花费的时间大约在2μs左右,而对于100M的以太网来讲,传输最小(28byte)到最大(1500byte)IP数据包所需的时间大约在3-120μs,对于1000M或更高速的网络来讲,时间只有0.3-12μm。可见高速网络环境下,系统调用所耗费的时间所占数据包传输的总时间的比例是非常巨大的。在数据包对技术中,两个数据包达到主机后总共会执行四次系统调用,对于每一个数据包都要执行一次系统调用获取达到时间,另一次系统调用执行I/O操作,读取数据包。因此,两个数据包在网络瓶颈带宽处形成的时间间隔必须至少要大于这四次主机系统执行系统调用的时间,否则将不可能计算出正确的结果。高速网络中两个数据包在网络瓶颈带宽处形成的时间间隔是非常小的,由此可见,由于系统调用时间的存在,使得网络带宽的测试在高速的网络环境下将产生巨大的偏差,甚至得出完全错误的结论。
3.3 I/O带宽。
I/O带宽对于测试数据包的影响是明显的,特别是进入主机的数据,如果主机的I/O带宽小于网络中的数据到达速度,则将会出项排队溢出现象,导致数据包的丢失。目前的一些主要带宽测试技术 .