文件下载器如何知道文件从哪里开始?

文件下载器如何知道文件从哪里开始?

假设我正在通过 HTTP 协议下载一个文件。包含文件片段的数据包可能以任何顺序到达。那么,下载器如何知道哪个数据包是顺序中的第一个?我正在查看 HTTP 数据包的字段这里并没有找到任何“序列号”字段。

经过一番思考,我得出的结论是,HTTP 是第 7 层协议,并且依赖于底层协议。TCP 是第 4 层协议,它为 HTTP 提供了对数据进行排序的服务,因为 TCP 标头确实有一个序列号 (在这里找到)。

但我不确定这个理论是否正确,所以我想请教专家。还有其他机制可以解决这个问题吗?

答案1

因此实际上,如果没有中断,文件是通过单个 TCP 连接下载的。因此您的下载器甚至不知道它是碎片化的。

你可以使用 wireshark 看看这个例子

在此处输入图片描述

例如,如果连接断开,或者下载管理器想要拆分下载以便使用 4 个连接,则它必须设置RANGE 标头

GET /z4d4kWk.jpg HTTP/1.1
Host: i.imgur.com
Range: bytes=0-1023

在这种情况下,答案是

HTTP/1.1 206 Partial Content
Content-Range: bytes 0-1023/146515
Content-Length: 1024

答案2

你猜到了。来自 RFC 2616 第 1.4 节总体操作,重点补充:

HTTP 通信通常通过 TCP/IP 连接进行。默认端口为 TCP 80 [19],但也可以使用其他端口。这并不妨碍 HTTP 在互联网或其他网络上的任何其他协议之上实现。HTTP 仅假定可靠的传输;任何提供此类保证的协议都可以使用;HTTP/1.1 请求和响应结构到相关协议的传输数据单元的映射超出了本规范的范围。

“可靠传输”是网络术语,指“传输数据时不丢失(除非发出信号)、不重复/重放、不更改或不乱序”。

同样,HTTPS 运行在 TLS(以前称为 SSL)上,TLS 建立在 TCP 之上,提供基本相同的服务(可靠的字节流传输),但增加了机密性和完整性(除非发出错误信号),即使面对智能攻击者,而不仅仅是自然错误和故障。性能存在差异,但据我所知,唯一的服务差异是 TLS 不提供 TCP 的“紧急”指针(又称带外),也不提供像 TCP 的“半关闭”状态那样的每个方向的单独关闭,而 HTTP/HTTPS 不需要这些。

相关内容