因此,从TCP数据包(包含您将在浏览器中处理的大部分流量)中可以看出,它们是有序的,但没有上限。这意味着,数据包标题将显示“包号:6”,但不是“包号:6/180”。
那么,你怎么能给出一个准确的加载条?您无法计算当前/最大比率,因为最大值不存在。
我在将大型文件(如电影)下载到文件系统或仅在单页应用程序中接收一些JSON blob的情况下询问此问题。在这两种情况下,精确的加载杆如何工作?
我知道许多SPA使用的旋转器没有明确的百分比,但是一些SPA(如YouTube和Instagram)确实使用了加载条。
在TCP级别,既不知道传输文件的长度,也不存在文件的概念 - 它只是一个字节流,可能在将来的某个时间关闭。甚至可能通过此字节流传输多个实际文件,但在TCP级别上不知道这些文件。
可用于某些进度条的知识来自应用程序级别。当使用HTTP下载文件(即今天通常使用的协议)时,服务器在大多数情况下会在HTTP标头中发送一个Content-length
字段,该字段显示响应的最终长度。由于客户端知道已经接收了多少字节,因此可以显示接收数据的百分比。
它也类似于上传,其中客户端知道要上载的数据的长度并知道它已经发送了多少数据。请注意,客户端不确定数据实际收到了多少。但TCP的机制确保在“飞行中”还有一个有限的字节窗口,并且一旦服务器确认了足够的先前数据,客户端将只能发送更多数据。
但请注意,在所有情况下都不可能使用这种进度表。即使使用HTTP,服务器也不需要预先发送长度。传输所有数据后,它可以简单地省略此信息并关闭TCP连接。或者它可以使用分块传输编码,它以较小的块发送数据,前缀为长度,但响应的最终长度不是预先知道的。在这种情况下,浏览器无法显示正确的进度表,因为不知道最终长度,因此通常仅显示仍有一些正在进行的传输但不进行传输完成的次数。
这只适用于HTTP协议。但是其他应用程序协议的相似之处在于可能存在预先知道的长度或者可能没有,在这种情况下,某些进度表可能会显示已传输或未传输的百分比。