HTTP有HTTP Cookies。Cookies允许服务器跟踪用户状态、连接数、上次连接时间等。
HTTP有持久连接(Keep-Alive),可以通过同一TCP连接发送多个请求。
HTTP有HTTP Cookies。Cookies允许服务器跟踪用户状态、连接数、上次连接时间等。
HTTP有持久连接(Keep-Alive),可以通过同一TCP连接发送多个请求。
来自维基百科:
HTTP是一种无状态协议。无状态协议不要求服务器在多个请求期间保留有关每个用户信息或状态。
但某些Web应用程序可能需要跟踪用户从页面到页面的进度,例如当Web服务器需要为用户定制Web页面内容时。这些情况的解决方案包括:
- 使用HTTP cookies。
- 服务器端会话,
- 隐藏变量(当当前页面包含表单时),以及
- 使用URI编码参数进行URL重写,例如,/index.php?session_id=some_unique_session_code。
使该协议无状态的原因在于服务器不被要求跨多个请求跟踪状态,并非不能这样做。这简化了客户端和服务器之间的合同,在许多情况下(例如通过CDN提供静态数据)最小化了需要传输的数据量。如果服务器必须维护客户访问的状态,则发出和响应请求的结构将更加复杂。因此,该模型的简单性是其最大特点之一。
HTTP 被称为一种“无状态协议”,因为每个请求都是独立执行的,没有关于之前执行的请求的任何信息。这意味着一旦事务结束,浏览器和服务器之间的连接也会断开。
协议 无状态
的原因在于,在它最初的设计中,HTTP 是一个相对简单的 文件传输协议
:
甚至来自同一客户端的多个连接之间也没有维护关系。这简化了客户端和服务器之间的协议,并在许多情况下最小化了需要传输的数据量。
在 Netscape 在 1994 年发明了 cookie 和 HTTPS 之前,HTTP 可以被认为是无状态的。随着时间的推移,出于各种原因,包括性能和安全性,许多有状态的组件被正式添加。但这些有状态的补充只是额外的内容,所以从俗语上说,HTTP 仍然是无状态的,因为最初的核心明确要求它是无状态的。
虽然 HTTP/1 最初追求无状态,但许多 HTTP/2 组件则完全符合有状态的定义。HTTP/2 放弃了无状态的目标。有状态的组件不再是“补充”,而是在 HTTP/2 标准的核心中定义。在 HTTP/2 规范(RFC 7540) 中有 125 处提到了"state",而没有提到"stateless"。
以下是有状态的 HTTP/1 和 HTTP/2 组件的简要列表(不详尽):
HTTP/2 RFC的第5.1节是HTTP/2标准定义的有状态机制的一个很好的例子。
对于Web应用程序来说,将HTTP/2视为无状态协议是否安全?
HTTP/2是一个有状态的协议,但您的HTTP/2应用程序可以忽略有状态的特性以保持无状态。
现有的需要状态的HTTP/1和HTTP/2应用程序如果尝试以无状态方式使用它们,将会出现错误。例如,如果禁用了cookie,登录某些HTTP/1.1网站可能变得不可能,从而破坏应用程序。因此,不能安全地假设特定的HTTP/1或HTTP/2应用程序是无状态的。
如果HTTP协议被设置为有状态协议,浏览器窗口将使用单个连接与Web服务器通信,以处理发给Web应用程序的多个请求。这使得浏览器窗口有机会在浏览器窗口和Web服务器之间建立长时间连接,并将它们保持在空闲状态长时间。尽管客户端中的大部分连接是空闲的,但这可能导致达到Web服务器的最大连接数。
HTTP
是无状态的。而TCP
是有状态的。
没有所谓的HTTP连接
,只有HTTP请求
和HTTP响应
。我们不需要维护任何东西来使另一个HTTP请求
。
一个名为"keep-alive"的连接头意味着后续的HTTP
请求和响应将重用TCP
,而不是一直断开和重新建立TCP
连接。
HTTP是一种无连接的协议,这导致了HTTP是一种无状态的协议。服务器和客户端仅在当前请求期间彼此知晓。之后,它们都会忘记对方。由于协议的这种性质,无论是客户端还是浏览器都无法在不同的网页请求之间保留信息。
什么是无状态?
一旦请求被发出并且响应被返回给客户端,连接将会中断或终止。服务器将完全忘记请求者。
为什么要无状态?
Web选择了无状态协议。这是一个非常聪明的选择,因为Web最初的目标是允许使用非常基本的服务器硬件向大量用户提供文档(网页)。
维护一个长时间运行的连接将会消耗巨大的资源。
如果Web选择有状态协议,则服务器的负载将增加以维护访问者的连接。