是否可以通过监视正常的http请求来衡量Web浏览器的上载和/或下载速度?理想情况下,Web应用程序无需进行任何修改,也无需使用JavaScript/Java/Flash之类的客户端脚本,便能够告知客户端速度。因此,即使客户端使用诸如Curl之类的库访问该服务,它仍然可以工作。如果可能的话,怎么办?如果不可能,为什么呢?这种方法有多精确?

(如果可以假设使用PHP/Apache,但这确实是一个与平台无关的问题。此外,能够衡量上传速度对我来说更重要。)

最佳答案

概述

您在询问沿路径的通常所谓的“被动”可用带宽(ABW)测量(与测量单个链路的ABW相对)。有许多不同的技术可以使用被动观察或低带宽“主动” ABW探测技术来估计带宽。但是,生产服务中最常用的算法是主动ABW技术。他们观察来自两个不同端点的数据包流。

我最熟悉 yaz ,它从一侧发送数据包,并在另一侧测量延迟的变化。单侧无源路径ABW测量技术被认为是实验性的;没有可靠的算法AFAIK实现。

讨论

您要求执行的任务的问题在于,所有非介入式ABW测量技术都依赖于时序。可悲的是,在使用http时,计时是一件非常棘手的事情。

  • 您必须处理object caching(例如akamai)和http proxies(它们过早地终止TCP session ,并且经常将Web服务器的IP地址欺骗给客户端)的现实。
  • 您必须处理可能间歇性地受到冲击的网络主机

  • 最后,主动ABW技术依赖于结构化的数据包流(wrt数据包大小和时序),这与标准http传输中看到的不同。

    概括

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

    编者注:我的原始答案表明,带有http的ABW是可行的。经过进一步的思考,我改变了主意。

    结束语:
  • 请参阅Sally Floyd's archive of end-to-end TCP/IP bandwidth estimation tools
  • 最常见的入侵技术(例如speedtest.net)在浏览器中使用Flash或Java Applet在20-30秒内向每个端点发送和接收3-5个并行TCP流。将流的平均吞吐量(不包括需要重传的丢失数据包)随时间增加,就可以得到该路径的tx和rx ABW。这显然对VoIP调用或正在进行的任何下载都具有破坏性。破坏性的措施称为批量传输容量(BTC)。参见RFC 3148: A Framework for Defining Empirical Bulk Transfer Capacity Metrics。 BTC测量通常使用HTTP,但是BTC似乎并不是您想要的。
  • 很好,因为它通过拒绝http缓存要缓存的对象,从而消除了行内缓存的风险;尽管某些工具(例如yaz)仅适用于udp。
  • 09-06 03:23