HTTP有HTTP Cookie。 Cookie允许服务器跟踪用户状态,连接数,最后连接数等。
HTTP具有持久连接(Keep-Alive),其中可以从同一TCP连接发送多个请求。
答案 0 :(得分:111)
即使可以通过同一个HTTP连接发送多个请求,服务器也不会通过同一个套接字附加任何特殊含义。这仅仅是一种性能问题,旨在最大限度地减少为每个请求重新建立连接所花费的时间/带宽。
就HTTP而言,它们仍然是单独的请求,并且必须包含足够的信息才能完成请求。这就是“无国籍”的本质。如果没有服务器知道的某些共享信息,请求将不会彼此关联,这在大多数情况下是cookie中的会话ID。
答案 1 :(得分:92)
来自Wikipedia:
HTTP是无状态协议。无状态协议不需要 服务器保留有关每个用户的信息或状态 多个请求的持续时间。
但是一些Web应用程序可能必须跟踪用户的进度 页面到页面,例如,当需要Web服务器进行自定义时 用户网页的内容。这些案件的解决方案 包括:
- 使用HTTP Cookie。
- 服务器端会话,
- 隐藏变量(当前页面包含表单时)和
- 使用URI编码的参数重写URL,例如/index.php?session_id=some_unique_session_code。
协议无状态的原因是服务器不是 required 来跟踪多个请求的状态,而不是如果它想要的话就不能这样做。这简化了客户端和服务器之间的合同,并且在许多情况下(例如通过CDN提供静态数据)最小化了需要传输的数据量。如果服务器 required 以维持客户端访问的状态,则发出和响应请求的结构将更加复杂。实际上,模型的简单性是其最大的特征之一。
答案 2 :(得分:19)
因为无状态协议不要求服务器在多个请求期间保留有关每个通信伙伴的会话信息或状态。
HTTP是一种无状态协议,这意味着一旦事务结束,浏览器和服务器之间的连接就会丢失。
答案 3 :(得分:3)
如果协议HTTP作为状态完整协议给出,则浏览器窗口使用单个连接与Web服务器通信,以便向Web应用程序发出多个请求。这使浏览器窗口有机会长时间访问浏览器窗口和Web服务器之间的连接并且长时间保持它们处于空闲状态。即使客户端中的大多数连接处于空闲状态,这也可能创建达到Web服务器最大连接的情况。
答案 4 :(得分:3)
HTTP是无连接的,这是HTTP是无状态协议的直接结果。服务器和客户端仅在当前请求期间相互了解。之后,他们两个都忘记了彼此。由于协议的这种性质,客户端和浏览器都不能在网页上的不同请求之间保留信息。
答案 5 :(得分:2)
HTTP 被称为无状态协议,因为每个请求都是独立执行的,无需知道之前执行过的请求,这意味着一旦交易结束浏览器与服务器之间的连接也丢失了。
使协议成为无状态的原因是,在其原始设计中, HTTP 是一种相对简单的文件传输协议:
即使是同一客户端,一个连接和另一个连接之间也没有保持任何关系。这样可以简化客户端与服务器之间的合同,并且在许多情况下可以将需要传输的数据量降到最低。
答案 6 :(得分:1)
什么是无状态的?
发出请求并将响应呈现回客户端后,连接将被删除或终止。服务器将忘记请求者的所有信息。
为什么无状态?
网络选择采用无状态协议。这是一个天才的选择,因为网络的最初目标是允许将文档(网页)提供给非常大的编号。使用非常基本的服务器硬件的人。
维护长时间运行的连接将非常耗费资源。
如果选择网络作为有状态协议,则服务器上的负载会增加,以维持访问者的连接。
答案 7 :(得分:0)
HTTP是无状态的。 TCP是有状态的。 没有所谓的“ HTTP连接”,只有“ HTTP请求”和“ HTTP响应”。我们不需要维护任何内容即可发出另一个“ HTTP请求”。 连接头为“保持活动状态”,意味着后续的HTTP请求和响应将重新使用TCP,而不是一直断开并重新建立TCP连接。
答案 8 :(得分:0)
我认为有人为无状态概念选择了一个非常不幸的名字,这就是造成整个误解的原因。这与存储任何类型的资源无关,而是与客户端和服务器之间的关系有关。
客户:我将所有资源都保留在一边,并向您发送所有需要处理的重要项目的“清单”。做你的工作。
服务器:好的。让我负责过滤重要内容以给您适当的响应。
这意味着服务器是客户端的“从属”,在每次请求后都必须忘记其“主”。实际上,STATELESS仅指服务器的状态。
https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3
答案 9 :(得分:0)
在1994年Netscape发明cookie和HTTPS之前,http被认为是无状态的。随着时间的流逝,出于各种原因(包括性能和安全性),越来越多的重要方面被添加。
尽管HTTP 1最初被认为是无状态的,但许多HTTP / 2组件却是有状态的定义。 HTTP / 2放弃了无状态目标。
没有理性的人可以阅读HTTP / 2 RFC并认为它是无状态的。错误的“ HTTP是无状态的”旧时教条是错误的,与当前有状态HTTP的现实相去甚远。
以下是状态HTTP / 1和HTTP / 2组件的有限列表,但并不详尽:
HTTP / 2 RFC的5.1节是HTTP / 2标准定义的状态机制的一个很好的例子。
Web应用程序将HTTP / 2视为无状态协议是否安全?
HTTP / 2是一个有状态协议,但这并不意味着您的HTTP / 2应用程序不能是无状态的。您可以选择仅对HTTP / 2功能的一部分使用不对无状态HTTP / 2应用程序使用某些有状态功能。
Cookies和其他一些有状态机制,或者不太明显的有状态机制,是后来的HTTP添加。 HTTP 1被认为是无状态的,尽管在实践中我们使用标准化的有状态机制,例如cookie,TLS和缓存。与HTTP / 1不同,HTTP / 2从一开始就在其标准中定义了状态组件。特定的HTTP / 2应用程序可以使用HTTP / 2功能的子集来维护无状态性,但是协议本身认为状态是一种规范,而不是例外。
如果试图无状态使用现有的应用程序,甚至是HTTP 1应用程序,则需要状态的应用程序也会中断。如果禁用了cookie,则可能无法登录某些HTTP / 1.1网站,从而破坏了应用程序。假定特定的HTTP 1应用程序不使用状态可能并不安全。对于HTTP / 2来说没什么不同。
最后一次跟我说:
HTTP / 2是一个有状态协议。
答案 10 :(得分:-10)