【发布时间】:2012-04-10 20:38:55
【问题描述】:
我一直在从一些提供托管服务的服务中下载文件。很多时候,当我以免费用户身份下载 Firefox(其他浏览器也是如此,但尚未全部检查)时,会告诉我下载速度为 400KB,距离完成还剩 10 分钟。这是 BS,因为下载文件需要 45 分钟或更长时间,例如“还剩 1 分 40 秒”显示几秒钟。
为用户呈现更高的速度。他们是怎么做到的?这是 HTTP 协议作弊还是浏览器作弊?为什么 Firefox 显示错误的值?
【问题讨论】:
我一直在从一些提供托管服务的服务中下载文件。很多时候,当我以免费用户身份下载 Firefox(其他浏览器也是如此,但尚未全部检查)时,会告诉我下载速度为 400KB,距离完成还剩 10 分钟。这是 BS,因为下载文件需要 45 分钟或更长时间,例如“还剩 1 分 40 秒”显示几秒钟。
为用户呈现更高的速度。他们是怎么做到的?这是 HTTP 协议作弊还是浏览器作弊?为什么 Firefox 显示错误的值?
【问题讨论】:
我从来没有遇到过这种情况,但是我从不使用 Firefox 下载文件。
也就是说,远程服务器可能会以高速发送文件,但会以短时间突发的数据平均达到其“免费用户”的速度。 Firefox 可能会看到这些突发期间的数据下载速度,而不是整体平均速度。
【讨论】:
存在许多进度条只是为了让您感觉更好。对于像下载文件这样的事情,很难准确估计。
有多少数据包被丢弃并重新发送?如果带宽在您的机器和服务器之间的某处阻塞怎么办?需要发送多少数据? (对于文件下载,您可以先发送元数据,但这在很多情况下会因为多种原因变得复杂)。
这些都是很难或不可能准确回答的问题,而且猜测起来可能会有问题。
引入用户Don't perceive download times accurately anyway 的想法,实现准确进度条的前景非常没有吸引力。最简单的方法是制作一个进度条。即使是最好的实现也只是不断地修改最佳猜测,无法保证该猜测的准确性。
解决方案是对下载时间估计持怀疑态度,并耐心等待。
【讨论】:
以下是获取实际带宽的方法:
使这个名为“netbps”的脚本可执行
#!/usr/bin/perl
use strict;
use warnings;
use Time::HiRes;
my $reporting_interval = 10.0; # seconds
my $bytes_this_interval = 0;
my $start_time = [Time::HiRes::gettimeofday()];
while (<>) {
if (/ length (\d+):/) {
$bytes_this_interval += $1;
my $elapsed_seconds = Time::HiRes::tv_interval($start_time);
if ($elapsed_seconds > $reporting_interval) {
my $bps = $bytes_this_interval / $elapsed_seconds;
printf "%02d:%02d:%02d %10.2f Bps\n", (localtime())[2,1,0],$bps;
$start_time = [Time::HiRes::gettimeofday()];
$bytes_this_interval = 0;
}
}
}
sudo tcpdump -i wlan0 -l -e -n | ./netbps
我只能说 Firefox 是错误的。该脚本为您提供了每秒字节数的良好估计。大约是firefox估计的1/4。所以新规则:如果感觉 firefox 给出的时间太短,则乘以 4 以获得真实时间。
【讨论】: