一种基于通用pc的高精度网络时延测量方法

文档序号:7614036阅读:179来源:国知局
专利名称:一种基于通用pc的高精度网络时延测量方法
技术领域
本发明涉及计算机网络性能测试与监控技术,特别是计算机网络时延测量和性能测量的应用。
背景技术
时延是网络的固有属性之一,也是评价网络性能的基本指标。时延测量在网络性能监测、网络行为分析、网络应用设计等领域有着广泛应用,同时也是测量时延抖动、网络带宽等性能指标的基础。之前的技术主要涉及时延的定义、测量实现及网络路径或设备的时延特征,没有分析时延测量的精度问题。随着网络速率的提升,需要设计廉价的高精度时延测量方法。
时延测量主要有两个误差来源一是测量主机系统时钟的分辨率、偏移及抖动等影响测量计时精度而产生的误差,这里称之为时钟误差。一是由于测量记录的收包、发包时间戳不是真实的收包、发包时刻而产生的测量误差,这里称之为位置误差。这两类误差都是在测量主机产生的,而测量时延、时延抖动、带宽等指标的目的在于了解网络状况和性能,测量结果若包含了由主机所带来的测量误差将使网络性能评价不准确。故必须尽量消除测量主机所产生的时钟误差和位置误差,提高时延测量精度。
网络时间协议(Network Time Protocol,NTP)可用作测量主机的时钟源,并使测量主机时钟同步。但其时钟准确性部分依赖于同步主机间的路径时延,而这正是时延测量的测量对象。故NTP协议不宜作为时延测量的时钟源。测量时引入如全球定位系统(Global Position System,GPS)的外部时钟源可消除测量的时钟误差,其时钟精度可达1微秒。但GPS系统价格昂贵,且测量主机与GPS天线连接距离不能太长,测量主机部署位置受限;此外,位置误差仍没有消除。目前设计了专用于包捕获的DAG卡,它可在系统收到数据包的同时记录时间戳,从而消除测量的位置误差。在《Proceedings of Passive and ActiveMeasurement Workshop 2002》的《New Measurements with the RIPE NCC TestTraffic Measurement Setup》一文中提出DAG卡与GPS系统集成,可同时消除测量的时钟误差和位置误差,实现高精度的时延测量。但这种方式所需硬件价格昂贵,安装复杂,难以在包含数百个测量主机的大规模网络测量系统中普遍部署。在当前通用PC硬件性能已得到极大提升的背景下,使用基于通用PC架构的高精度时延测量方法对实现成本低廉、实施方便、测量精确的大规模网络性能监测和网络行为分析极具意义。

发明内容
本发明要解决的技术问题是,针对现有技术存在的缺陷,提出一种基于通用PC的高精度网络时延测量方法,它基于通用PC架构,通过消除时延测量的时钟误差和位置误差来提高时延测量精度;具有测量成本低、测量结果稳定、适于普遍采用的特点。
本发明的技术解决方案是,所述基于通用PC的高精度网络时延测量方法包括(1)利用通用PC的软、硬件架构,以CPU内部的时间戳计数器(Time StampCounter,TSC)取代操作系统时钟计时,同时定期估计CPU频率,消除测量的时钟误差;(2)通过修改操作系统内核,将收包、发包时间戳记录位置从测量程序转移到网卡驱动,并从测量程序直接读取网卡驱动记录的收包、发包时间戳,消除测量的位置误差。
以下对本发明做出进一步说明。
本发明中,所述CPU频率定期估计以高精度NTP服务器为间接时钟源。
本发明中,所述修改操作系统内核,包括a.修改网卡驱动的包接收函数,在网卡驱动的数据包接收函数hard_rx()的开始部分加入计时语句。
b.修改系统的包接收模块,使测量程序可以直接读取网卡驱动记录的包接收时间戳;c.修改网卡驱动的包发送函数,在网卡驱动的数据包发送函数hard_start_xmit()的开始部分加入计时语句;d.修改系统的包发送模块和系统内核用于存储数据包的struct sock和structsk_buff结构类型定义,使测量程序可以直接读取网卡驱动记录的包发送时间戳。
参见图1,本发明的CPU频率估计的一种具体过程是,MP为进行时延测量的PC,估计CPU频率时,MP向NTP服务器发送NTP请求包并记录TSC寄存器计数做为包发送时间s,NTP服务器收到请求后,将记录请求收到时间戳ts并将其写入NTP包返回给MP;MP收到NTP响应包后记录TSC寄存器计数做为包收到时间r,此时MP可获得一个到NTP服务器的往返时延测量值rtt,其单位是CPU时钟周期;以及一个NTP服务器收到NTP请求包的时间戳ts。MP以较小周期(如每隔一秒)重复这一过程,经过一段时间后,MP可以测量到数个rtt的最小值。最小时延是数据包在网络的传输时延及信号在物理链路的传播时延之和,是由网络拓扑及传输技术引起的固有时延。它不受网络负载影响,其大小是固定不变的。因而,对于两个连续测量到的最小往返时延测量包,它们从MP到NTP服务器的单向时延也相等。如图1所示,设第i、j个请求包测量到最小rtt,且它们之间的请求包均没有测量到最小rtt,有tsi-si/fCPU=tsj-sj/fCPU则(sj-si)/fCPU=tsj-tsi即两个请求包在源端的发送时间间隔等于在目的端的接收时间间隔。故CPU频率fCPU可以下式估计fCPU=(sj-si)/(tsj-tsi)MP小时间间隔地重复上述最小时延测量过程,可持续地估计CPU频率,以实时发现受温度变化、芯片老化等因素引起的CPU频率变化,保证TSC寄存器计时的准确性。此外,为进一步减少网络对CPU频率估计的影响,可以尽量选择距离MP近的NTP服务器,亦即尽量选择往返时延较小的NTP服务器。TSC寄存器数值可以rdtsc汇编指令读出。
如图2所示,目前的时延测量程序通常在应用程序(用户空间)记录测量包的发送时间戳和接收时间戳计算网络时延。即如该图所示,在ts1位置记录测量包的发送时间戳,在ts5位置记录测量包的收包时间戳,以二者之差做为时延测量值。本发明对Linux系统内核的网络处理模块进行修改,提出在网卡驱动中记录发包、收包时间戳的时延测量方法,即在图中的ts2位置记录测量发包时间戳,在ts3位置记录测量收包时间戳。这是系统内核软件中最接近测量真实发包、收包时刻的位置,消除了测量中的位置误差。
消除收包的位置误差主要分两个步骤在网卡驱动中记录收包时间戳,将记录的收包时间戳传递给测量程序。网卡驱动中记录收包时间戳较简单,在网卡驱动的数据包接收函数hard_rx()的开始部分加入计时语句即可。这样网卡处理接收到的数据包时将首先记录收包时间戳。如何将记录的收包时间戳传递给测量程序需要更多分析。网卡收到数据包时将分配一个struct sk_buff类型(include\linux\skbuff.h)的缓存skb保存该数据包及一些相关信息,其中包括一个struct timeval结构的成员stamp用于保存数据包接收时间戳。在未修改的数据包接收函数中stamp并未赋值,因此在数据包接收函数的末尾需要将之前记录的收包时间戳拷贝到缓存skb的stamp成员中。在设备独立层的netif_rx()函数(net\core\dev.c)中,系统会对接收到的数据包打时间戳并保存在skb结构的stamp成员,这一动作会覆盖之前网卡驱动记录的收包时间戳,需要调整。方法是netif_rx()给数据包打时间戳之前,先判断skb结构的stamp成员是否为空,若不为空,表明网卡驱动已记录了包接收时间戳,不需再记录;否则对数据包打时间戳并保存在skb结构的stamp成员中。之后skb结构将逐层向上传递,并连接到struct sock结构sk(include\net\sock.h)中。sk结构在应用程序调用socket()创建套接字时被创建,在套接字关闭前一直存在。它保存了数据包的传输协议、本地IP地址、目的地IP地址等协议信息,还包括一个struct timeval结构的成员stamp用于保存数据包的接收时间戳。skb缓存的struct timeval结构成员stamp最终被拷贝到sk结构的成员stamp中。应用程序创建套接字后,系统提供了一个ioctl()调用,可对创建的套接字进行I/O控制。该调用有一个SIOCGSTAMP的调用参数,用于读取sk结构中的stamp成员,即数据包接收时间戳。对系统内核进行上述改动后,时延测量程序在接收到数据包后以SIOCGSTAMP为参数调用ioctl()即获得之前在网卡驱动中记录的收包时间戳。这样时延测量程序记录的数据包收到时间将是系统在图2中ts3位置打的时间戳,基本消除了收包的位置误差。
消除发包时的位置误差同样分两个步骤在网卡驱动中记录发包时间戳,将记录的发包时间戳传递给测量程序。网卡驱动中记录发包时间戳较简单,在网卡驱动的数据包发送函数hard_start_xmit()的开始部分加入计时语句即可。这样网卡发送数据包时将首先记录发包时间戳。如何将记录的发包时间戳传递给测量程序则更困难。首先,修改系统内核用于存储数据包的struct sock和structsk_buff结构类型定义,分别在两个结构中增加struct timeval结构类型的成员sndstamp用于保存包发送时间戳。然后可以在网卡驱动的数据包发送函数hard_start_xmit()中记录包发送时间戳并保存到struct sk_buff结构缓存skb的成员sndstamp。在包发送成功,系统返回到ip_build_xmit()函数时,skb缓存将被释放,所以在ip_build_xmit()函数中将skb的sndstamp成员拷贝到struct sock结构缓存sk的sndstamp成员中。最后,修改ioctl()系统调用(net/ipv4/af_inet.c),增加一调用参数SIOCGSNDSTAMP,带该参数的ioctl()调用将struct sock结构中的sndstamp成员即网卡驱动记录的数据包发送时间戳拷贝给应用程序。这样时延测量程序记录的数据包发送时间将是系统在图2中ts2位置打的时间戳,基本消除了发包的位置误差。
图4显示了本发明与传统时延测量方法相比较,其中本发明方法测量结果平稳,极大的消除了测量的系统误差和随机误差,具有较高的测量精度。
由以上可知,本发明为一种基于通用PC的高精度网络时延测量方法,由于是基于通用PC架构实现的,具有测量成本低,适于普遍采用的特点与传统时延测量方法相比,包长为64字节时,本发明方法降低测量误差近150%,且测量结果稳定,对系统吞吐量基本无影响;本发明提出的以CPU内部的时间戳计数器(Time Stamp Counter,TSC)取代操作系统时钟计时的方法具有分辨率高、稳定、额外开销小的特点,消除了测量的时钟误差;所提出的通过修改操作系统内核,将收、发包时间戳记录位置从测量程序转移到网卡驱动,有效地消除了时延测量位置误差,由此实现了基于通用PC的高精度时延测量。


图1是本发明的CPU频率估计算法过程示意图;图2是本发明的时间戳记录位置转移示意图;图3是本发明时延测量方法与传统测量方法的过程示意图;图4是包长为1500字节时,本发明方法与传统方法所测量的往返时延比较。
具体实施例方式
实施本发明方法时,使用Intel公司的奔腾IV CPU和Linux操作系统。
以tsc计数器取代gettimeofday()系统调用计时;实施过程如图3.b所示在S6步骤,测量程序发送时延测量包;在S7步骤,测量程序以ioctl()调用替代gettimeofday()读取记录的包发送时间戳,而时间戳记录由修改后的网卡驱动完成;在S8步骤,测量程序接收时延测量包;在S9步骤,测量程序以ioctl()调用替代gettimeofday()读取记录的包接收时间戳,时间戳记录由修改后的网卡驱动完成;最后步骤S10根据当前所测CPU频率来计算网络时延;步骤S11定期估计CPU频率的过程。
定期估计CPU频率的过程会增加程序实现复杂度。为此,将步骤S11的CPU频率估计过程单独实现,做为系统后台进程运行;计算网络时延时,测量程序从后台进程获取当前CPU频率估计值。估计CPU频率时同样以网卡驱动记录的时间戳计算最小时延,以减少误差。
权利要求
1.一种基于通用PC的高精度网络时延测量方法,其特征在于,该方法包括(1)利用通用PC的软、硬件架构,以CPU内部的时间戳计数器取代操作系统时钟计时,同时定期估计CPU频率,消除测量的时钟误差;(2)通过修改操作系统内核,将收包、发包时间戳记录位置从测量程序转移到网卡驱动,并从测量程序直接读取网卡驱动记录的收包、发包时间戳,消除测量的位置误差。
2.根据权利要求1所述基于通用PC的高精度网络时延测量方法,其特征在于,所述CPU频率定期估计以高精度NTP服务器为间接时钟源。
3.根据权利要求1所述基于通用PC的高精度网络时延测量方法,其特征在于,所述修改操作系统内核,包括a.修改网卡驱动的包接收函数,在网卡驱动的数据包接收函数hard_rx()的开始部分加入计时语句。b.修改系统的包接收模块,使测量程序可以直接读取网卡驱动记录的包接收时间戳;c.修改网卡驱动的包发送函数,在网卡驱动的数据包发送函数hard_start_xmit()的开始部分加入计时语句;d.修改系统的包发送模块和系统内核用于存储数据包的struct sock和struct sk_buff结构类型定义,使测量程序可以直接读取网卡驱动记录的包发送时间戳。
全文摘要
本发明涉及计算机网络性能测试与监控技术,是一种基于通用PC的高精度网络时延测量方法,包括利用通用PC的软、硬件架构,以CPU内部的时间戳计数器取代操作系统时钟计时,同时定期估计CPU频率,消除测量的时钟误差;通过修改操作系统内核,将收包、发包时间戳记录位置从测量程序转移到网卡驱动,并从测量程序直接读取网卡驱动记录的收包、发包时间戳,消除测量的位置误差。本发明与传统时延测量方法相比,不同包长度下,本发明可降低测量误差21%-150%,极大地提高了时延测量精度且测量结果稳定,对系统吞吐量基本无影响。该方法基于通用PC架构实现,测量精度高,测量成本低,适于普遍采用。
文档编号H04L12/26GK1758613SQ20051003227
公开日2006年4月12日 申请日期2005年10月21日 优先权日2005年10月21日
发明者黎文伟, 张大方, 谢高岗, 杨金民 申请人:湖南大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1