测量网络浏览器的带宽

10

是否可以通过监视普通的http请求来判断Web浏览器的上传和/或下载速度?理想情况下,Web应用程序能够在没有任何修改和客户端脚本(如JavaScript / Java / Flash)的情况下告诉客户端的速度。因此,即使客户端使用Curl等库访问服务,它仍然可以正常工作。如果可能的话,如何实现?如果不可能,为什么?这种方法的准确性如何?

(如果有帮助的话,假设PHP / Apache,但实际上这是一个平台无关的问题。另外,能够判断上传速度对我来说更重要。)

5个回答

13

概述

您正在寻求常称为“被动”可用带宽(ABW)测量的路径上的测量(与测量单个链接的ABW相对)。有许多不同的技术1,可以使用被动观察或低带宽的“主动”ABW探测技术来估算带宽。然而,在生产服务中使用的最常见算法是“主动”ABW技术;它们从两个不同的终点观察数据包流。

我最熟悉的是yaz,它从一侧发送数据包,并测量另一侧延迟的变化。单边被动路径ABW测量技术被认为更具实验性;据我所知,没有这些算法的稳定实现。

讨论

您所要求的任务的问题在于,所有非侵入式2 ABW测量技术都依赖于时间。不幸的是,当处理http时,时间是非常棘手的事情...

  • 您必须处理对象缓存的现实情况(例如,Akamai),以及http代理(它们会过早终止TCP会话并经常欺骗Web服务器的IP地址到客户端)。
  • 您必须处理可能不时遭受打击的Web主机

最后,与标准的http传输不同,主动ABW技术依赖于结构化数据包流(关于数据包大小和时间)。

总结

总之,除非您为ABW测量设置专用客户端/服务器/协议,否则我认为您将对结果感到非常沮丧。您可以在TCP / 80上保持ABW套接字连接,但是我看到的工具不会使用http。3

编辑说明:我的原始答案表明使用http进行ABW是可能的。经过进一步的思考,我改变了主意。


  1. 请查看Sally Floyd的端到端TCP/IP带宽估计工具档案
  2. 最常见的侵入式技术(如speedtest.net)使用浏览器中的Flash或Java小程序,向每个端点发送和接收3-5个并行TCP流,持续20-30秒钟。将这些流的平均吞吐量(不包括需要重传的丢失数据包)随时间累加,即可得到该路径的发送和接收带宽。显然,这会极大地干扰VoIP通话或正在进行的任何下载。这种干扰性测量称为大容量传输能力(BTC)。请参阅RFC 3148:定义经验性大容量传输能力度量的框架。BTC测量通常使用HTTP,但BTC似乎不是您想要的。
  3. 这很好,因为它通过拒绝HTTP缓存对象来消除了在线缓存的风险;尽管一些工具(如yaz)仅支持UDP。

6
由于TCP连接适应可用带宽的方式,不可能做到这一点。请求很小,通常只在一个或两个数据包中。您需要至少十二个全尺寸数据包才能获得粗略的带宽估计,因为TCP首先必须适应可用带宽(“TCP慢启动”),并且需要平均抖动效果。如果您想要任何准确性,您可能需要数百个数据包。这就是为什么上传速率测量脚本通常传输数兆字节的数据的原因。

另一方面,您可能能够从三次握手和ack的时间来估算往返延迟。但是下载速度与上传速度一样重要。


3

JavaScript和任何浏览器组件都不支持测量上传性能。

我唯一能想到的方法是,如果您正在上传到页面/ http处理程序,并且该页面正在接收传入的字节,则可以测量每秒接收多少字节。然后使用会话ID将其存储在某个应用程序范围的字典中。

然后,从浏览器中,您可以定期轮询服务器,使用会话ID获取字典中的值,并向用户显示它。这样就可以了解上传速度如何。


3
您可以使用 AJAXOMeter,这是一个JavaScript库,可测量您的上传和下载速度。您可以在此处查看实时演示。

它给了我错误的结果,由于speedtest.net我的当前速度下降了:890 KB/s,上行:564 KB/s,但AJAXOMeter显示,下行:178 KB/s,上行:134 KB/s。 - Synxmax

3

一般情况下这是不可行的,因为入站和出站带宽经常不对称。不同的互联网服务提供商在这方面有显著不同的比例,甚至会根据时间变化而有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接