我正在研究 Mozilla 的HTTP 协议参考,但我不明白以下部分的含义:
连接由传输层控制,因此从根本上来说超出了 HTTP 的范围。HTTP 不要求底层传输协议基于连接;它只要求它可靠,或者不丢失消息(至少在这种情况下会出现错误)。在互联网上最常见的两种传输协议中,TCP 是可靠的,而 UDP 则不可靠。因此,HTTP 依赖于基于连接的 TCP 标准。
有一些说法看上去是矛盾的:
- HTTP 不要求底层传输协议基于连接。
- HTTP 依赖于基于连接的 TCP 标准。
我的问题:
是否存在这样的情况,在发送 HTTP(或任何应用程序级别)请求之前,我们不需要通过传输协议与服务器建立连接,这就是基于连接的意思吗?
在 HTTP 创建时,TCP 是互联网上主要的通用传输协议,它提供了必要的属性——使用 UDP 是可能的,但需要 HTTP 本身来提供可靠性,RDP(如可靠数据协议)很少被采用,SCTP 还没有被发明,等等,而 TCP 几乎在每个具有 IP 实现的系统上都可用1。
因此,TCP 成为 HTTP 服务器和客户端的自然选择,并且由于所有实现都需要就传输达成一致,因此实际上 HTTP 依赖 TCP 实现互操作性。
但是,HTTP 明确不保留任何每个连接的状态——无论是通过单个 TCP 连接还是通过不同的连接,两个 HTTP 请求的行为都会相同——因此它不依赖于 TCP 的“基于连接”属性;它仅依赖于 TCP 的其他属性。
(不过最近,许多实现已经开始支持 QUIC 作为替代传输方式。它有点像但不完全是“UDP 上的 HTTP”,因为就它为应用程序协议提供的属性而言,QUIC 实际上与 TCP 处于几乎相同的级别。)
HTTP 可以以这种方式工作;如上所述,它不保留任何连接级状态,因此它可以在没有明确连接或断开连接的传输上工作。(我见过 UDP 上的 HTTP、D-Bus 上的 HTTP 等)
有许多应用程序级协议不使用基于连接的传输;DNS 和 NTP 是两个最常见的例子,它们都基于一次性请求交换,没有任何明确的连接/断开操作。(DNS 可以并且经常使用 TCP,但 UDP 仍然是大多数操作的默认传输。)
1(实际上,没有“IPv2”或“IPv3”的原因是,在被分成版本 4 的两个 TCP/IP 层之前,它被称为“TCPv2”和“TCPv3”......)