下载文件使用什么协议?

use*_*855 9 ftp http

假设我从 Jetbrains.com 下载了一个像 Pycharm 这样的可执行文件。HTTP 用于传送网站的内容 - 当我下载文件时是否也使用它?我读到使用了 FTP,但也看到它已被现代浏览器禁用 - 推荐的协议是什么?

此外,如果网络中断,有时我可以继续下载而不会丢失进度。这是因为创建了一个“会话”,我可以重新加入会话并继续下载吗?在我必须从头开始下载之前,是什么决定了这段时间的持续时间?

use*_*686 30

假设我从 Jetbrains.com 下载了一个像 Pycharm 这样的可执行文件。HTTP 用于传送网站的内容 - 当我下载文件时是否也使用它?我读到使用了 FTP,但也看到它已被现代浏览器禁用 - 推荐的协议是什么?

查看下载列表中显示的 URL - 如果显示http://https://,则是,使用 HTTP 下载文件。

现在几乎所有从网站下载的文件(甚至大多数不是从网站下载的,例如游戏更新)都是通过 HTTP 完成的。

没有很多选择。匿名 FTP 在过去更常见,但现在其设计的几个方面存在问题(FTP 实际上早于Internet 的 TCP/IP),例如它使用单独的“数据”连接导致与防火墙相关的问题。匿名 NFS (WebNFS) 也从未成为一种东西。

此外,如果网络中断,有时我可以继续下载而不会丢失进度。这是因为创建了一个“会话”,我可以重新加入会话并继续下载吗?

不; 恢复机制是无状态的,就像 HTTP 的其他大部分内容一样。

当您请求静态文件(而不是动态生成的网页)时,浏览器可以请求特定范围而不是整个文件。例如,如果后12300个字节的下载停止,您可以继续在任何时间通过包括Range: 12301-头。

因此,只要文件仍然存在,您需要做的就是不断重新请求相同的 URL,并添加适当的 Range 标头。(浏览器还使用If-Match标头来确保文件没有更改。)

有些网站提供仅限于特定会话的下载(作为 cookie 或嵌入在 URL 中的特殊令牌)。这些下载仍然使用与以前相同的范围请求恢复 - 虽然网络服务器可能会认为您的 URL 已过期并完全阻止继续下载,但这与实际的恢复机制无关。

(当然,网站可以完全通过动态脚本提供下载服务。在这种情况下,是否处理范围请求取决于程序员。例如,从 Google Drive 下载压缩文件夹时,.zip 文件是随时随地生成;即使它的“总大小”也是未知的——在这种情况下,文件可能根本无法恢复。)

  • 此外,FTP 中的专用数据连接还有一个原因:它允许服务器到服务器的传输,而无需强制通过客户端传输数据或将一台服务器的凭据暴露给另一台服务器(如 *scp* 所做的那样)。 (4认同)
  • 请注意,如果服务器为范围请求返回 HTTP 200,则意味着您正在再次下载整个文件,或者“部分失败”。“成功的部分”响应应该是 HTTP 206。 (3认同)
  • @user253751,SimonRichter:我不确定这是否是主要意图,尽管早在 RFC 454 中就明确提到了这种可能性。但我认为它的起源与早期(TCP/IP 之前的) ARPANET 协议设计,其中 FTP“控制”连接被定义为 _TELNET_ 连接(可能是为了利用现有的双向套接字支持、NVT-ASCII 定义等)而单独的数据套接字甚至不需要8 位字节。 (3认同)
  • 也许值得一提的是,Web 浏览器知道根据 `Content-type:` HTTP 标头保存到文件或呈现为网页。https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Type (2认同)