现在各种智能路由器以及一些PC上的防火墙软件,都提供网络测速功能。笔者对此进行了研究,并在自己的路由器上也实现了此功能。下面做一下总结
一般的网络测速,主要关注两个方面:网络延迟和下载速率
1.网络延迟:即客户端从发出一个请求报文,到收到应答报文,这中间耗费的时间。此时间的长度,可以检测网络报文的传输延迟
2.下载速率:即客户端向某些提供下载服务的站点(一般是HTTP)进行数据下载,测试下载速率。
这两个数据,要比运营商告知的宽带套餐的数据,靠谱的多
下面谈谈我是如何实现的
1.网络延迟:简单的方法,就是利用PING的自身统计功能。发出一定数量的ping请求,看最终统计得到的AVG round-trip值。类似如下的:
举例ping –s 36 –c 40 www.baidu.com,则可以得到输出:
…….
44 bytes from 180.97.33.107: seq=38 ttl=55 time=296.485 ms
44 bytes from 180.97.33.107: seq=39 ttl=55 time=225.084 ms
--- www.baidu.com ping statistics ---
40 packets transmitted, 39 packets received, 2% packet loss
round-trip min/avg/max = 4.120/144.129/1052.541 ms
红色的,就是延迟了
主要谈谈下载速率的测试
2.下载速率测试:
分析了360 P1以及金山的测速报文,发现是利用多线程+HTTP下载的方式,向一些(金山是向6个地址)提供固定下载链接的网站,发起真实的下载请求,并在固定测试时间内估计下载速率:下载报文大小/测试时间
那么,我所开发的也就是这样一个测试程序:设定多个URL下载目标(也是6个,且就使用金山使用的目标地址),利用pthread多线程+socket编程,构造HTTP的并发GET请求,并循环接收获得的数据报文(注意,为了统计精确,需要去掉回包中的HTTP头)。此外,还建立一个定时器,设定定时时间就是测试时长。则当定时器到期后,终止所有线程,并结束socket。统计每个url下载的速率,并求和。 即得到此轮测试速率了
经简单验证,此程序的测试结果,与 金山,360P1的测试结果,在同一精度上。
需要代码的,可单独联系哦 ^_^