在TCP连接上加载Bar进程

时间:2019-03-15 03:58:57

标签: browser tcp cross-browser single-page-application

因此,从我从TCP数据包(包含您将在浏览器中处理的大部分流量)中得知的情况来看,它们是有序的,但没有上限。意思是,数据包标题将显示“ Package Number:6”,而不是“ Package Number:6/180”。

那么,如何提供准确的加载条?您无法计算当前/最大比率,因为最大比率不存在。

我是在将大文件(如电影)下载到文件系统,或者只是在单页应用程序中接收到一些JSON blob的情况下问这个问题的。在这两种情况下,准确的加载栏如何工作?

我知道许多SPA使用的微调器没有明确的百分比,但是某些SPA(例如YouTube和Instagram)确实使用加载条。

1 个答案:

答案 0 :(得分:0)

在TCP级别上,既不知道传输文件的长度,也没有文件的概念-全部都是字节流,将来很可能会关闭。甚至有可能在此字节流上传输多个实际文件,但在TCP级别上尚无此文件。

可用于某些进度条的知识来自应用程序级别。在使用HTTP(即当今通常使用的协议)下载文件时,在大多数情况下,服务器将在HTTP标头中发送一个Content-length字段,该字段显示响应的最终长度。由于客户端知道已经接收了多少字节,因此他可以显示接收到的数据的百分比。

对于上传来说,客户端也知道要上传的数据的长度,并且知道已经发送了多少数据,这与上传类似。请注意,客户端不确定确切接收了多少数据。但是,TCP的机制确保了“运行中”字节窗口也有限,并且一旦服务器确认了足够的先前数据,客户端就只能发送更多数据。

但是请注意,并非在所有情况下都可以使用这种进度表。即使使用HTTP,也不需要服务器预先发送长度。传输所有数据后,它可以简单地忽略此信息并关闭TCP连接。或者,它可以使用分块传输编码,在分块传输编码中以长度为前缀的较小块发送数据,但是响应的最终长度不是预先知道的。在这种情况下,由于不知道最终长度,因此浏览器无法显示适当的进度表,因此通常仅显示仍在进行某些传输,而没有进行多少传输。

这仅适用于HTTP协议。但是其他应用程序协议的相似之处在于,可能有一个预先知道的长度,也可能没有。在这种情况下,某些进度表可能会显示已传输的百分比,或者可能没有。