【问题标题】:stateless protocol and stateful protocol无状态协议和有状态协议
【发布时间】:2011-08-15 18:21:41
【问题描述】:

如何理解无状态协议和有状态协议? HTTP 是无状态协议,FTP 是有状态协议。对于需要大量交互的 Web 应用程序,底层协议应该是有状态的。我的理解对吗?

【问题讨论】:

    标签: http networking network-protocols


    【解决方案1】:

    HTTP 是一种无状态协议,换句话说,服务器会忘记与客户端/浏览器状态相关的所有内容。尽管 Web 应用程序使它看起来几乎是有状态的。

    可以强制无状态协议表现得好像它是有状态的。如果服务器每次都将状态发送给客户端,并且客户端将其再次发送回服务器,则可以实现这一点。

    在 HTTP 中可以通过三种方式实现:

    a) 一种是 cookie,在这种情况下,状态在 HTTP 标头中发送和返回。

    b) 第二个是 URL 扩展,在这种情况下,状态将作为 URL 的一部分作为响应发送。

    c) 第三种是“隐藏表单域”,其中状态作为响应的一部分发送给客户端,并作为表单隐藏数据的一部分返回给服务器

    可扩展性和高可用性

    HTTP 可扩展性如此之好的主要原因之一是它的无状态性。无状态协议缓解了复制问题,因为状态本身不需要存储在服务器上。

    有状态协议在逻辑上很繁重,难以在 Internet 中可靠地实施。无状态服务器也很容易扩展,而有状态服务器的可扩展性是有问题的。无状态请求可以随时发送到任何节点,而有状态则不是这种情况。

    HTTP 作为无状态协议提高了无状态 Web 应用程序的可用性,否则这些应用程序将难以或不可能实现。如果有连接丢失,没有状态丢失,简单的请求重发即可解决问题。无状态请求也是可缓存的。

    see more here

    【讨论】:

      【解决方案2】:

      由于您询问的是 Web 应用程序,因此协议将始终是无状态的——Web 的协议是 http(或 https),这就是她所写的全部内容。

      我认为您正在考虑的是在您的 Web 应用程序本身中提供一种状态机制。典型的方法是在 Web 应用程序中为用户的会话创建一个唯一标识符(一种或另一种形式的 sessionID 是常见的做法),该标识符在浏览器和服务器之间来回传递。这通常在 cookie 中完成,但也可以在 URL 上完成,但根据您的平台/框架,这对您来说会更麻烦。

      您的服务器端代码存储有状态信息(同样,通常称为用户会话),但它希望使用 sessionID 来查找它。 http 流量只是交还 sessionID。只要该标识符存在,每个 http 事务就完全独立于所有其他事务,因此协议流量本身是无状态的。

      【讨论】:

        【解决方案3】:

        HTTP 是一个stateless protocol。所有基于网络的应用程序也是stateless

        当请求发送到服务器时,客户端和服务器之间建立连接。服务器接收请求,处理请求并发送回响应,然后关闭连接。

        如果再发送一个请求,之后会被当作一个新的请求,建立一个新的连接。

        为了制作 HTTP stateful,我们使用了会话管理技术。 因此,它在处理当前请求时使用来自先前请求的数据,即,它使用相同的连接进行一系列客户端服务器交互。

        会话管理技术是:

        1. 隐藏的表单域
        2. 饼干
        3. 会话
        4. URL 重写

        【讨论】:

        • request scopesession scopeapplication scope 也可用于会话管理
        【解决方案4】:
        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 验证用户。

        【讨论】:

        • 很好的解释
        【解决方案5】:

        您的问题是正确的,是的,如果您与银行的网络交易是通过有状态连接完成的,那就太好了。唉,由于 FTP 中的一个古怪错误和 1989 年 BSD 中的部分套接字表中的 12 个套接字限制,HTTP 是无状态的。Marcus Ranum 解释了这一切 here

        所以 HTTP 丢弃了它从 TCP 继承的状态,必须在应用层以 cookie 的形式重新创建状态。结果就是糟糕的互联网安全。

        Seif project 建议使用“基于 TCP 的安全 JSON”来解决所有问题。不需要 DNS 和证书颁发机构。协议和 seifnode.js 已完成并在 github 上使用 MIT 许可证。

        【讨论】:

          【解决方案6】:

          HTTP 不会“继承” TCP,而是将其用于传输。 HTTP 使用 TCP 进行有状态连接,但随后断开连接。稍后,如果需要,它将再次连接。因此,当您浏览网站时,您会创建许多不同的连接。这些连接中的每一个都是有状态的,但作为一个整体的对话不是,因为您正在与每个对话断开连接。

          From this link

          【讨论】:

            【解决方案7】:

            基本上是的,但是您别无选择,只能使用 HTTP,这是提供网站服务的地方。因此,您必须做出妥协以使 HTTP 有状态,也就是会话管理。可能性基本上是通过 URL 中的每个调用传递会话 id,以便您知道何时与您之前谈论过的人交谈,或者通过 cookie 实现相同的目标而不会弄乱 url。但是,大多数现代 Web 开发语言都会为您解决这个问题;如果你用谷歌搜索你选择的语言+“会话管理”,你应该知道它是如何完成的。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-08-11
              • 1970-01-01
              • 2016-07-10
              • 2013-11-22
              • 2012-09-29
              • 2012-10-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多