HTTP 是如何变成无状态的?

Ant*_*t's 27 networking web tcp

据说 HTTP 是无状态的。意思是,它不需要存储用于数据传输的信息。

但是 HTTP 使用 TCP,它是面向状态的。

如果是这样,HTTP 是如何变成无状态的?

Law*_*ceC 43

HTTP 不关心并且独立于任何用于传输自身的低级协议,即使它本身是无状态的。

传输技术可以是 TCP,或 Novell 的旧 SPX,或 SCTP,或任何你能想到的东西,而 HTTP 仍然可以正常工作。HTTP 确实需要一个流或面向连接的协议——并且依赖于可解析的 URL——但并不关心它是如何实现的。

这就是分层模型或网络栈存在的原因之一:应用层不需要关心低层。

仅仅因为较低级别的协议是有状态的,并不意味着它之上的任何内容都会自动变为有状态或需要有状态。

HTTP 本身是无状态的。所以这意味着应用程序必须在 HTTP 之上实现另一个层来建立状态。这通常是通过会话 cookie 完成的。

  • 这张图很好地解释了它。http://vichargrave.com/wp-content/uploads/2013/01/Network-Stack-Models1.png (3认同)
  • 巧合的是,HTTP 忽略了底层连接(几乎总是 TCP)的状态这一事实是各种 [HTTP2](https://en.wikipedia.org/wiki/HTTP/2) 方法的主要性能缺陷之一试图解决。 (2认同)
  • @Fiasco:严格来说,路由发生在 IP 级别。路由基于 Internet 地址,基本路由中不使用 TCP 层的信息。 (2认同)

Jan*_*dec 10

“HTTP 是无状态的”意味着每个 HTTP 事务(请求-响应对)都可以独立于先前请求-响应对中的任何状态进行处理。

要传输特定的请求-响应对,您需要一个能够在那里携带任意大块并返回任意大块的协议,并且要在数据包大小有限的层上执行此操作,TCP 必须是有状态的。

但是跨越事务边界,没有状态。客户端可以断开连接并为下一个请求建立一个新的连接。事实上,这是早期版本中的唯一选项,如果客户端不包含Connection: keep-alive标头,它仍然可以这样工作。

下一个请求也可以很容易地由不同的服务器处理而客户端永远不会知道,因为服务器不需要维护任何状态(除非应用程序在 HTTP 之上添加自己的状态,通常以会话的形式;随之而来的复杂性负载平衡是对在 HTTP 上构建有状态协议的惩罚)。这在负载平衡繁忙的服务器中得到了利用。