问题 一些猜测客户端连接速度的方法


我必须根据他/她的连接速度做出关于内容权重的动态决定,以发送给客户端。

即:如果客户端使用的是具有3G(或更慢)连接的移动设备,我会向他/她发送轻量级内容。如果他/她使用WiFi或更快的连接,我会向他/她发送完整的内容。

我试着测量重新加载之间的时间,向客户端发送标题 Location: myurl.com (有关客户端的一些信息以识别它)。这适用于桌面浏览器和一些完整的移动浏览器(如Obigo),但它不适用于迷你(代理)浏览器,如Opera Mini或UCWeb。这些浏览器返回我的服务器和代理服务器之间的连接时间,而不是移动设备。

如果我尝试重新加载页面,也会出现同样的情况 <meta> 标签或Javascript document.location

有没有办法发现或测量客户端连接的速度,或者他/她是否使用3G或WiFi等,这适用于迷你浏览器(即,我可以识别通过迷你浏览器的慢速连接)?


1000
2018-06-09 13:58


起源

测量速度可以使用javascript或flash(或类似的客户端技术)下载特定文件并计算需要多长时间。但是要有一个主要的drowback,确保你需要至少1秒钟进行测量(速度是每个时间单位的数据),这实际上将延迟1秒的站点加载。在测量速度之前,您需要为用户提供娱乐,这在大多数情况下实际上并不是用户在您的网站上获得的速度。此外,为了进行精确测量,您可能需要更多时间。 - venimus


答案:


我认为你不应该测量速度或吞吐量。

第一个猜测可能是客户端的浏览器。计算机有许多不同的浏览器,但它们通常与移动设备的浏览器不同。

您可以轻松查看用户使用的浏览器。

你应该提供一个在轻量级和全部内容之间切换的选项,因为你的猜测可能是错误的。


2
2018-06-23 10:42



即使我可以检测到客户端是移动设备,我无法检测它是否使用快速或慢速连接 - 这就是问题所在。无论如何,你完全正确地提供一个选项开关(我已经在另一个项目上做了)。 - Sony Santos
我认为让用户掌控是最佳选择。如果您检测到移动浏览器,请提供“精简”版本,并为用户提供一种简单的方式来交换她获得的版本。 - Hugh Brackett
@Hugh Brackett:这就是我的意思。您不能假设连接速度在整个会话期间保持不变。如果你在WiFi上,用户可以离开热点,他的速度会下降。或者如果有人在浏览会话期间开始通过torrent下载大量数据呢? - ayckoster
虽然这个答案没有说明如何计算客户端速度,但这是解决移动浏览器问题的最佳解决方案。谢谢! (和@Hugh一起帮助澄清这个答案+1。) - Sony Santos
这不是恕我直言的问题的答案,也没有提出任何方法来做任何等效的事情。 - caesarsol


这是一个很好的问题。我之前没有尝试过从浏览器估算客户端速度的任何技术。不过,我确实有一个想法;我没有花太多时间思考这个问题,但希望它会给你一些想法。另外,请原谅我的冗长:

首先,在处理客户端 - 服务器性能时需要考虑两件事:吞吐量和延迟。通常,与桌面客户端相比,移动客户端将具有低带宽(因此具有低吞吐量)。此外,移动客户端的连接可能更容易出错,因此具有更高的延迟。但是,在我有限的经验中,高延迟并不意味着低吞吐量。相反,低延迟并不意味着高吞吐量。

因此,你 可能 需要区分延迟和吞吐量。假设客户端发送一个时间戳(让我们称之为“A”)与每个HTTP请求,服务器只是回复它。然后,客户端可以使用其当前时间减去此返回的时间戳,以估计进行往返的请求所花费的时间。此时间几乎包括所有内容,包括网络延迟以及服务器完全接收您的请求所花费的时间。

现在,假设服务器在发送整个响应主体之前首先在响应头中发回时间戳“A”。还假设您可以逐步读取服务器的响应(例如,非阻塞IO。有多种方法可以执行此操作。)这意味着您可以在读取服务器响应之前获取回显时间戳。此时,客户端时间“B”减去请求时间戳“A”是您的延迟的近似值。保存这个,以及客户端时间“B”。

读完响应后,响应正文中的数据量除以新客户端时间“C”减去之前的客户端时间“B”就是吞吐量的近似值。例如,假设C-B = 100ms,并且您已读取100kb数据,那么您的吞吐量为10kb / s。

再一次,移动客户端连接容易出错,并且随着时间的推移会有强度变化的趋势。因此,您可能不希望一次测试吞吐量。实际上,您还可以测量每个响应的吞吐量,并保持一个 移动平均线 客户的吞吐量。这将降低一个请求上异常糟糕的吞吐量导致客户端质量降级的可能性,反之亦然。

如果此方法有效,那么您需要做的就是决定用于决定客户端获取内容的策略。例如,您可以从“低质量”模式开始,然后如果客户端在一段时间内具有足够的吞吐量,则将它们升级为高质量内容。然后,如果它们的吞吐量降低,则将它们降级为低质量。

编辑:澄清了一些事情并增加了吞吐量示例。


6
2018-06-21 18:11



你的解释非常有趣,但我不确定它是“代理证明”。我还没有测试你的算法,但我想它会在迷你浏览器的代理上注册客户端时间戳而不是真正的移动设备时间戳。代理将读取整个页面(并且它将采取措施),处理它(通过压缩,降级图像质量等)然后将结果发送到移动设备。在这种情况下,吞吐量和延迟将相对于代理而不是设备。如果您有不同的想法,请告诉我如何。 - Sony Santos
你可能是对的 - 我不确定在代理的情况下你能做多少事情。您可以使用总请求+响应大小除以总往返时间作为吞吐量的近似值。这可能会让你足够接近。 - Tom
+1:您的答案在桌面浏览器上非常有用。谢谢! - Sony Santos
这个答案是最好的。这个问题已经很老了,但是我想建立一个JS库来做类似描述的事情。 - caesarsol


第一件事:运行SSL(HTTPS)将避免a 批量 代理废话。它还会阻止像压缩这样的东西(可能会使HTML,CSS等加载更快,但对已经压缩的数据无效)。

加载页面的时间是 潜伏 +(带宽 × 尺寸)。即使延迟未知,测量小文件和大文件也可以为您提供带宽:

Let L be latency, B be bandwidth, both unknown.
Let t₁ and t₂ be the measured download times.
In this example, the two sizes are 128k and 256k.

t₁ = L + B × 128                             // sure would be nice if SO had Τεχ
t₂ = L + B × 256
t₂ - t₁ = (L + B × 256) - (L + B × 128)
        = L + B × 256 - L - B × 128
        = 256(B) - 128(B)
        = 128(B)

因此,您可以看到,如果您将时间差除以页面大小的差异,则可以获得带宽。由于延迟和带宽不恒定,进行单次测量可能会产生奇怪的结果。重复几次(并抛出异常值和荒谬的[例如,负值])将收敛于真实的平均带宽。

您可以使用任何AJAX框架在后台轻松地使用JavaScript进行这些测量。获取当前时间,发送请求,而不是收到响应时的时钟时间。请求本身应该是相同的大小,因此发送请求的开销只是延迟的一部分。您可能希望使用不同的主机,以打败持久连接。或者将服务器配置为拒绝持久连接,但仅限于您的测试文件。

我想我实际上是在滥用延迟这个词,它包括所有持续开销的时间(例如,发送请求)。好吧,它希望接收有效载荷的第一个字节的延迟。


4
2018-06-23 18:47





这是你可以在客户端发现的东西吗?如果您需要绕过代理,那么您始终可以在客户端发现连接类型并将其发回。另一种方法是通过某种脚本机制在客户端下载文件,记录每秒的字节数,并将该信息返回给服务器端。


0
2018-06-21 15:55



对不起,但我看不出我怎么能“总是发现客户端的连接类型”。你能给出一个Javascript示例吗? - Sony Santos


比较来自同一客户端的两个请求的服务器端时间。

请求内容的URL的简单ajax查询怎么样?只需将客户端的ip存储在第一个请求的时间服务器端(文件或数据库),然后将其与客户端javascript请求的时间进行比较,并在比较两次选择后提供URL一个任意的“快速”或“慢”时间限制,并提供适当速度的内容的URL。


0
2018-06-22 20:57