为什么说“ HTTP是无状态协议”?


170

HTTP具有HTTP Cookie。Cookies允许服务器跟踪用户状态,连接数,最后连接等。

HTTP具有持久连接(保持活动),可以从同一TCP连接发送多个请求。


3
我看不到“无状态性”的另一个领域是授权-尤其是代理授权。在协商过程中,它似乎是有状态的。对于NTLM身份验证,客户端需要记住代理身份验证的类型,并且服务器必须是有状态的,因为NTLM消息类型有序列。所以我不确定我是否理解答案。
林赛·莫西约

1
我现在应该添加HTTP / 1.1吗?因为我认为HTTP / 2具有状态。
Jose Nobile

4
HTTP / 2是有状态的。HTTP 1是无状态的。 后来针对HTTP 1的添加(例如cookie)添加了状态。这些添加不属于“核心” HTTP 1规范。这就是为什么HTTP 1被称为无状态协议的原因,尽管实际上并非如此。另一方面,HTTP / 2的设计中加入了有状态的组件。不需要添加任何内容即可满足被标记为“有状态”的要求。
Zamicol

Answers:


130

即使可以通过同一HTTP连接发送多个请求,服务器也不会对通过同一套接字到达的请求赋予任何特殊含义。这纯粹是一种性能,旨在最大程度地减少为每个请求重新建立连接所花费的时间/带宽。

就HTTP而言,它们仍然是单独的请求,并且必须自己包含足够的信息才能满足请求。那就是“无国籍”的本质。如果没有服务器知道的一些共享信息,请求将不会彼此关联,在大多数情况下,这些信息是cookie中的会话ID。


1
服务器记住会话(服务器端)并根据会话自定义用户体验时会发生什么?
NurShomik

3
@NurShomik:有关会话通常如何工作的说明,请参见stackoverflow.com/a/3521393/319403
cHao 2016年

12
@Andrew:HTTP不是“建立在” TCP上的,并且TCP的状态不是HTTP的状态。这两个协议是堆栈中不同层的完全独立的协议。如果您愿意的话,可以通过命名管道提供HTTP服务,或者,如果有足够的受虐狂同意同意,甚至可以通过发送文件来进行服务,这完全可以工作,因为HTTP与传输协议无关。在那个级别上,这仅仅是请求和响应。这使得HTTP本身成为无状态的,而不管低级或高级协议可以使用/维护/要求什么状态。
cHao

@cHao好的,我承认。如果我们将无状态定义为“ 不一定需要具有状态才能运行”(请参阅​​dimo414的答案,以下列出了Wikipedia引用的HTTP中的状态选项),并且我们是否严格按照本身而不是基于其下层来查看每个协议,那么是的,我可以同意HTTP是“无状态的”。
安德鲁

101

维基百科

HTTP是无状态协议。无状态协议不需要服务器在多个请求的持续时间内保留有关每个用户的信息或状态。

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

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

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


21

因为无状态协议不需要服务器在多个请求的持续时间内保留有关每个通信伙伴的会话信息或状态。

HTTP是无状态协议,这意味着一旦交易结束,浏览器和服务器之间的连接就会丢失。


2
但是,HTTP可以使用cookie将信息保存在服务器中。保持连接的HTTP不会在每个请求上关闭连接。
Jose Nobile 2012年


18
在服务器上保存信息并不意味着该连接一直存在。
斯里兰卡2012年

1
@srijan好吧,不。所以?没有人声称其他。
Mark Amery

10

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

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

  1. 请求以URL命名的文件,
  2. 得到文件作为回应,
  3. 断开。

即使在同一客户端,一个连接和另一个连接之间也没有保持任何关系。这简化了客户端和服务器之间的合同,并且在许多情况下将需要传输的数据量减到最少。


3

如果将HTTP协议指定为State Full协议,则浏览器窗口使用单个连接与Web服务器进行通信,以向Web应用程序发出多个请求。它们长时间处于空闲状态。即使客户端中的大多数连接都处于空闲状态,也可能导致达到Web服务器的最大连接数的情况。


1
HTTP已经具有保持活动状态,这意味着服务器不会关闭连接,并且客户端可以在同一连接上发出许多请求。
Jose Nobile 2014年

3

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


1

什么是无状态?

发出请求并将响应呈现回客户端后,连接将被删除或终止。服务器将忘记所有关于请求者的信息。

为什么无国籍?

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

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

如果选择Web是有状态协议,则服务器上的负载将增加以维持访问者的连接。


1

HTTP是无国籍的。TCP是有状态的。没有所谓的HTTP connection,只有HTTP requestand HTTP response。我们不需要维护其他任何东西HTTP request“保持活动状态”的连接头意味着TCP后续HTTP请求和响应将重新使用该连接头,而不是TCP始终断开连接并重新建立连接。


0

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

客户:我将所有资源都保留在一边,并向您发送所有需要处理的重要物品的“清单”。做你的工作。

服务器:好的..让我负责过滤重要的内容以给您适当的答复。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.