是否可以通过监视普通的http请求来判断Web浏览器的上传和/或下载速度?理想情况下,Web应用程序能够在没有任何修改和客户端脚本(如JavaScript / Java / Flash)的情况下告诉客户端的速度。因此,即使客户端使用Curl等库访问服务,它仍然可以正常工作。如果可能的话,如何实现?如果不可能,为什么?这种方法的准确性如何?
(如果有帮助的话,假设PHP / Apache,但实际上这是一个平台无关的问题。另外,能够判断上传速度对我来说更重要。)
是否可以通过监视普通的http请求来判断Web浏览器的上传和/或下载速度?理想情况下,Web应用程序能够在没有任何修改和客户端脚本(如JavaScript / Java / Flash)的情况下告诉客户端的速度。因此,即使客户端使用Curl等库访问服务,它仍然可以正常工作。如果可能的话,如何实现?如果不可能,为什么?这种方法的准确性如何?
(如果有帮助的话,假设PHP / Apache,但实际上这是一个平台无关的问题。另外,能够判断上传速度对我来说更重要。)
您正在寻求常称为“被动”可用带宽(ABW)测量的路径上的测量(与测量单个链接的ABW相对)。有许多不同的技术1,可以使用被动观察或低带宽的“主动”ABW探测技术来估算带宽。然而,在生产服务中使用的最常见算法是“主动”ABW技术;它们从两个不同的终点观察数据包流。
我最熟悉的是yaz
,它从一侧发送数据包,并测量另一侧延迟的变化。单边被动路径ABW测量技术被认为更具实验性;据我所知,没有这些算法的稳定实现。
您所要求的任务的问题在于,所有非侵入式2 ABW测量技术都依赖于时间。不幸的是,当处理http时,时间是非常棘手的事情...
最后,与标准的http传输不同,主动ABW技术依赖于结构化数据包流(关于数据包大小和时间)。
总之,除非您为ABW测量设置专用客户端/服务器/协议,否则我认为您将对结果感到非常沮丧。您可以在TCP / 80上保持ABW套接字连接,但是我看到的工具不会使用http。3
编辑说明:我的原始答案表明使用http进行ABW是可能的。经过进一步的思考,我改变了主意。
yaz
)仅支持UDP。另一方面,您可能能够从三次握手和ack的时间来估算往返延迟。但是下载速度与上传速度一样重要。
JavaScript和任何浏览器组件都不支持测量上传性能。
我唯一能想到的方法是,如果您正在上传到页面/ http处理程序,并且该页面正在接收传入的字节,则可以测量每秒接收多少字节。然后使用会话ID将其存储在某个应用程序范围的字典中。
然后,从浏览器中,您可以定期轮询服务器,使用会话ID获取字典中的值,并向用户显示它。这样就可以了解上传速度如何。
一般情况下这是不可行的,因为入站和出站带宽经常不对称。不同的互联网服务提供商在这方面有显著不同的比例,甚至会根据时间变化而有所不同。