【发布时间】:2011-08-15 18:21:41
【问题描述】:
如何理解无状态协议和有状态协议? HTTP 是无状态协议,FTP 是有状态协议。对于需要大量交互的 Web 应用程序,底层协议应该是有状态的。我的理解对吗?
【问题讨论】:
标签: http networking network-protocols
如何理解无状态协议和有状态协议? HTTP 是无状态协议,FTP 是有状态协议。对于需要大量交互的 Web 应用程序,底层协议应该是有状态的。我的理解对吗?
【问题讨论】:
标签: http networking network-protocols
HTTP 是一种无状态协议,换句话说,服务器会忘记与客户端/浏览器状态相关的所有内容。尽管 Web 应用程序使它看起来几乎是有状态的。
可以强制无状态协议表现得好像它是有状态的。如果服务器每次都将状态发送给客户端,并且客户端将其再次发送回服务器,则可以实现这一点。
在 HTTP 中可以通过三种方式实现:
a) 一种是 cookie,在这种情况下,状态在 HTTP 标头中发送和返回。
b) 第二个是 URL 扩展,在这种情况下,状态将作为 URL 的一部分作为响应发送。
c) 第三种是“隐藏表单域”,其中状态作为响应的一部分发送给客户端,并作为表单隐藏数据的一部分返回给服务器
可扩展性和高可用性
HTTP 可扩展性如此之好的主要原因之一是它的无状态性。无状态协议缓解了复制问题,因为状态本身不需要存储在服务器上。
有状态协议在逻辑上很繁重,难以在 Internet 中可靠地实施。无状态服务器也很容易扩展,而有状态服务器的可扩展性是有问题的。无状态请求可以随时发送到任何节点,而有状态则不是这种情况。
HTTP 作为无状态协议提高了无状态 Web 应用程序的可用性,否则这些应用程序将难以或不可能实现。如果有连接丢失,没有状态丢失,简单的请求重发即可解决问题。无状态请求也是可缓存的。
【讨论】:
由于您询问的是 Web 应用程序,因此协议将始终是无状态的——Web 的协议是 http(或 https),这就是她所写的全部内容。
我认为您正在考虑的是在您的 Web 应用程序本身中提供一种状态机制。典型的方法是在 Web 应用程序中为用户的会话创建一个唯一标识符(一种或另一种形式的 sessionID 是常见的做法),该标识符在浏览器和服务器之间来回传递。这通常在 cookie 中完成,但也可以在 URL 上完成,但根据您的平台/框架,这对您来说会更麻烦。
您的服务器端代码存储有状态信息(同样,通常称为用户会话),但它希望使用 sessionID 来查找它。 http 流量只是交还 sessionID。只要该标识符存在,每个 http 事务就完全独立于所有其他事务,因此协议流量本身是无状态的。
【讨论】:
HTTP 是一个stateless protocol。所有基于网络的应用程序也是stateless。
当请求发送到服务器时,客户端和服务器之间建立连接。服务器接收请求,处理请求并发送回响应,然后关闭连接。
如果再发送一个请求,之后会被当作一个新的请求,建立一个新的连接。
为了制作 HTTP stateful,我们使用了会话管理技术。
因此,它在处理当前请求时使用来自先前请求的数据,即,它使用相同的连接进行一系列客户端服务器交互。
会话管理技术是:
【讨论】:
request scope、session scope 和application scope 也可用于会话管理
Anything that forgets whatever it did in past is stateless, such as http
Anything that can keep the history is statefull, such as database
Http是无状态协议,所以会忘记用户信息。
我们使用 jsonWebToken(JWT) 将 http 作为有状态的协议,即在每个发送到服务器的请求时,服务器将首先使用 JWT 验证用户。
【讨论】:
您的问题是正确的,是的,如果您与银行的网络交易是通过有状态连接完成的,那就太好了。唉,由于 FTP 中的一个古怪错误和 1989 年 BSD 中的部分套接字表中的 12 个套接字限制,HTTP 是无状态的。Marcus Ranum 解释了这一切 here。
所以 HTTP 丢弃了它从 TCP 继承的状态,必须在应用层以 cookie 的形式重新创建状态。结果就是糟糕的互联网安全。
Seif project 建议使用“基于 TCP 的安全 JSON”来解决所有问题。不需要 DNS 和证书颁发机构。协议和 seifnode.js 已完成并在 github 上使用 MIT 许可证。
【讨论】:
HTTP 不会“继承” TCP,而是将其用于传输。 HTTP 使用 TCP 进行有状态连接,但随后断开连接。稍后,如果需要,它将再次连接。因此,当您浏览网站时,您会创建许多不同的连接。这些连接中的每一个都是有状态的,但作为一个整体的对话不是,因为您正在与每个对话断开连接。
【讨论】:
基本上是的,但是您别无选择,只能使用 HTTP,这是提供网站服务的地方。因此,您必须做出妥协以使 HTTP 有状态,也就是会话管理。可能性基本上是通过 URL 中的每个调用传递会话 id,以便您知道何时与您之前谈论过的人交谈,或者通过 cookie 实现相同的目标而不会弄乱 url。但是,大多数现代 Web 开发语言都会为您解决这个问题;如果你用谷歌搜索你选择的语言+“会话管理”,你应该知道它是如何完成的。
【讨论】: