测量Web浏览器的带宽

roo*_*ook 10 performance tcp http bandwidth network-protocols

是否可以通过监控正常的http请求来衡量Web浏览器的上传和/或下载速度?理想情况下,Web应用程序无需任何修改即可告知客户端的速度,并且无需像JavaScript/Java/Flash那样的客户端脚本.因此,即使客户端使用像Curl这样的库访问服务,它仍然可以工作.如果这是可能的,怎么样?如果不可能,为什么?这种方法有多准确?

(如果它有助于假设PHP/Apache,但实际上这是一个独立于平台的问题.同样能够衡量上传速度对我来说更重要.)

Mik*_*ton 13

概观

您要求沿路径通常称为"被动"可用带宽(ABW)测量(与测量单个链路的ABW相比).有许多不同的技术1使用被动观察或低带宽"主动"ABW探测技术来估计带宽.但是,生产服务中使用的最常用算法是有源 ABW技术; 他们观察来自两个不同端点的数据包流.

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

讨论

您要求的任务的问题是所有非侵入式2 ABW测量技术都依赖于时序.可悲的是,使用http时,时机是一件非常棘手的事情......

  • 您必须处理对象缓存(例如,akamai)和http代理(过早终止TCP会话并经常将Web服务器的IP地址欺骗到客户端)的现实.
  • 你必须处理可能间歇性抨击的网络主机

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

摘要

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

编辑说明:我的原始答案表明ABW与http是可能的.经过进一步的反思,我改变了主意.


END-NOTES:

  1. 请参阅Sally Floyd的端到端TCP/IP带宽估算工具存档
  2. 最常见的侵入式技术(如speedtest.net)在浏览器中使用flash或java applet向每个端点发送和接收3-5个并行TCP流,持续20-30秒.随着时间的推移添加流的平均吞吐量(不包括需要重传的丢失数据包),并获得该路径的tx和rx ABW.这显然对VoIP呼叫或任何正在进行的下载都具有破坏性.破坏性测量称为批量传输容量(BTC).请参阅RFC 3148:定义经验批量传输容量度量标准的框架.BTC测量通常使用HTTP,但BTC似乎不是你想要的.
  3. 这很好,因为它通过拒绝http缓存对象进行缓存来消除内联缓存的风险; 虽然有些工具(比如yaz)只是udp.


Ben*_*igt 6

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

OTOH,您可能能够估计三次握手和确认时间的往返延迟.但下载速度至少与上传速度相同.