202

HTTP 有 HTTP Cookie。Cookies 允许服务器跟踪用户状态、连接数、上次连接等。

HTTP 具有持久连接 (Keep-Alive),其中可以从同一个 TCP 连接发送多个请求。

4

10 回答 10

149

Even though multiple requests can be sent over the same HTTP connection, the server does not attach any special meaning to their arriving over the same socket. That is solely a performance thing, intended to minimize the time/bandwidth that'd otherwise be spent reestablishing a connection for each request.

As far as HTTP is concerned, they are all still separate requests and must contain enough information on their own to fulfill the request. That is the essence of "statelessness". Requests will not be associated with each other absent some shared info the server knows about, which in most cases is a session ID in a cookie.

于 2012-11-02T17:24:44.130 回答
109

来自维基百科

HTTP 是一种无状态协议。无状态协议不要求服务器在多个请求期间保留有关每个用户的信息或状态。

但是某些 Web 应用程序可能必须跟踪用户从一个页面到另一个页面的进度,例如当需要 Web 服务器为用户自定义网页内容时。这些情况的解决方案包括:

  • HTTP cookie 的使用。
  • 服务器端会话,
  • 隐藏变量(当当前页面包含表单时),以及
  • 使用 URI 编码参数的 URL 重写,例如 /index.php?session_id=some_unique_session_code。

使协议无状态的原因是服务器不需要跟踪多个请求的状态,而不是如果它愿意就不能这样做。这简化了客户端和服务器之间的合同,并且在许多情况下(例如通过 CDN 提供静态数据)最大限度地减少了需要传输的数据量。如果要求服务器维护客户端访问的状态,则发出和响应请求的结构将更加复杂。事实上,模型的简单性是其最大的特点之一。

于 2012-11-02T17:53:30.280 回答
19

Because a stateless protocol does not require the server to retain session information or status about each communications partner for the duration of multiple requests.

HTTP is a stateless protocol, which means that the connection between the browser and the server is lost once the transaction ends.

于 2012-11-02T17:25:05.630 回答
19

HTTP被称为a是stateless protocol因为每个请求都是独立执行的,不知道之前执行的请求,这意味着一旦事务结束,浏览器和服务器之间的连接也会丢失。

使该协议stateless的原因在于,在其最初的设计中,HTTP是一个相对简单的file transfer protocol

  1. 请求以 URL 命名的文件,
  2. 获取文件作为响应,
  3. 断开。

一个连接和另一个连接之间没有任何关系,即使来自同一个客户端也是如此。这简化了客户端和服务器之间的合同,并且在许多情况下最大限度地减少了需要传输的数据量。

于 2019-01-05T13:02:22.523 回答
8

现代 HTTP 是有状态的。过去的 HTTP 是无状态的。

在 Netscape 在 1994 年发明 cookie 和 HTTPS 之前,HTTP 可以被认为是无状态的。随着时间的推移,出于各种原因(包括性能和安全性)添加了许多有状态组件。但是有状态的添加就是这样,添加,所以它仍然通俗地说 HTTP 是无状态的,因为核心明确寻求无状态。

虽然 HTTP/1 最初寻求无状态,但许多 HTTP/2 组件正是有状态的定义。 HTTP/2 放弃了无状态目标。不再是有状态组件的“添加”,而是在 HTTP/2 标准的核心中定义了有状态组件。

以下是有状态 HTTP/1 和 HTTP/2 组件的有限列表,但并不详尽:

  • Cookies,被 RFC 命名为“HTTP 状态管理机制”。
  • HTTPS,它存储密钥因此状态。
  • HTTP 身份验证需要状态。
  • 网络存储。
  • HTTP 缓存是有状态的。
  • 流标识符的真正目的是状态。它甚至以 RFC 部分的名称“流状态”。
  • 建立流标识符的标头块是有状态的。
  • 引用流标识符的帧是有状态的。
  • HTTP RFC 明确表示有状态的标头压缩是有状态的。
  • 机会加密是有状态的。

HTTP/2 RFC 的第 5.1 节“流状态”是 HTTP/2 标准定义的状态机制的一个很好的例子。第 5.3.4 节甚至被命名为“优先状态管理”。

Web 应用程序将 HTTP/2 视为无状态协议是否安全?

HTTP/2 是有状态的协议,但这并不意味着您的 HTTP/2 应用程序不能是无状态的。您可以选择不对无状态 HTTP/2 应用程序使用有状态功能。

如果尝试无状态地使用它们,需要状态的现有 HTTP/1 和 HTTP/2 应用程序将中断。例如,如果禁用 cookie,则可能无法登录某些 HTTP/1.1 网站,从而破坏应用程序。假设特定的 HTTP/1 或 HTTP/2 应用程序是无状态的可能并不安全。

TL;博士:

有状态机制是后来对原始无状态标准的 HTTP 添加。HTTP/1 通俗地说是无状态的,尽管在实践中我们使用标准化的有状态机制,如 cookie、TLS 和缓存。与 HTTP/1 不同,HTTP/2 从一开始就在其标准中定义了有状态组件。特定的 HTTP/2 应用程序可以使用 HTTP/2 功能的子集来保持无状态,但协议本身预计状态是常态,而不是例外。

错误的“HTTP 是无状态的”是古老的教条,与 HTTP 的现代有状态现实相去甚远。

于 2020-08-03T02:54:20.510 回答
5

如果协议 HTTP 作为状态完整协议给出,浏览器窗口使用单个连接与 Web 服务器进行通信,以向 Web 应用程序发出多个请求。这使浏览器窗口有机会长时间参与浏览器窗口和 Web 服务器之间的连接并保持它们长时间处于空闲状态。即使客户端中的大部分连接都处于空闲状态,这也可能会造成Web服务器达到最大连接数的情况。

于 2014-01-21T05:56:40.727 回答
3

HTTP 是无连接的,这是 HTTP 是无状态协议的直接结果。服务器和客户端仅在当前请求期间才知道彼此。之后,两个人都忘记了对方。由于协议的这种性质,客户端和浏览器都不能保留跨网页的不同请求之间的信息。

于 2014-04-04T06:29:25.627 回答
3

HTTP是无国籍的。TCP是有状态的。没有所谓的HTTP connection,只有HTTP requestHTTP response。我们不需要维护任何东西来制作另一个HTTP request. 一个“keep-alive”的连接头意味着TCP将被后续的HTTP请求和响应重用,而不是一直断开和重新建立TCP连接。

于 2018-06-25T12:59:26.287 回答
2

什么是无国籍??

一旦发出请求并将响应返回给客户端,连接将被丢弃或终止。服务器将忘记请求者的所有信息。

为什么是无国籍??

网络选择使用无状态协议。这是一个天才的选择,因为网络的最初目标是允许将文档(网页)提供给非常大的数量。的人为服务器使用非常基本的硬件。

维持长时间运行的连接将非常耗费资源。

如果 web 被选择为有状态协议,那么服务器上的负载将会增加以维持访问者的连接。

于 2020-02-13T16:51:24.387 回答
2

我认为有人为无状态概念选择了非常不幸的名称,这就是造成整个误解的原因。它不是关于存储任何类型的资源,而是关于客户端和服务器之间的关系。

客户:我把所有的资源都放在我这边,并把所有需要处理的重要项目的“清单”发给你。做你的工作。

服务器:好吧..让我负责过滤重要的内容,以便给您正确的响应。

这意味着服务器是客户端的“奴隶”,每次请求后都必须忘记他的“主人”。实际上,STATELESS 仅指服务器的状态。

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3

于 2020-03-16T17:31:08.923 回答