无状态协议和有状态协议

41

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

7个回答

56

HTTP是一种无状态协议,也就是服务器会忘记与客户端/浏览器状态相关的所有信息。尽管Web应用程序几乎使其看起来像有状态。

无状态协议可以被强制表现得像有状态一样。这可以通过服务器将状态发送给客户端,并且如果客户端每次都将其发送回服务器来实现。

在HTTP中,有三种方法可以实现这一点:

a)第一种是使用cookies,在这种情况下,状态作为HTTP头发送和返回。

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

c)第三种是“隐藏表单字段”,在这种情况下,状态作为响应的一部分发送到客户端,并作为表单的隐藏数据返回到服务器。

可扩展性和高可用性

HTTP之所以具有良好的可扩展性,其中一个主要原因是其无状态性。无状态协议可以减轻复制的问题,因为状态本身不需要存储在服务器上。

实现可靠的有状态协议在互联网上逻辑上非常繁重。无状态服务器也很容易扩展,而对于有状态服务器,可扩展性是有问题的。无状态请求可以随时发送到任何节点,而对于有状态请求则不是这种情况。

HTTP作为无状态协议增加了无状态Web应用程序的可用性,否则将难以实现或不可能实现。如果连接丢失,则不会丢失状态,简单地重新发送请求即可解决该问题。无状态请求也可以被缓存。

在此处查看更多


1
b) 第二种情况是URL扩展,此时状态作为URL的一部分作为请求发送。这是错误的,URL不是客户端的“响应”,而是一个“请求”,如果是“get”请求,则可以具有URL参数,然后由服务器进行评估。 c) 第三种情况是“隐藏表单字段”,其中状态作为响应的一部分发送到客户端,并作为表单的隐藏数据返回到服务器。这也必须被更改/重写。 - Timo

20

既然您在询问Web应用程序,那么协议将始终是无状态的。Web的协议是HTTP(或HTTPS),这就是全部内容。

我认为您所想的是在Web应用程序本身中提供状态机制。这方面的典型方法是,在您的Web应用程序中为用户会话创建一个唯一标识符(某种形式的sessionID是常见做法),该标识符在浏览器和服务器之间来回传递。通常使用cookie进行处理,但也可以在URL上进行处理,根据您的平台/框架情况而有所不同。

您的服务器端代码使用sessionID存储有状态信息(通常称为用户会话),以便使用sessionID进行查找。HTTP流量只是简单地传回sessionID。只要存在该标识符,每个HTTP事务都是完全独立的,因此协议流量本身是无状态的。


7

HTTP是一种无状态协议。所有基于Web的应用程序也都是无状态的。

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

如果发送另一个请求,则将视为新请求,并建立新的连接。

为了使HTTP具有状态,我们使用会话管理技术。这样,在处理当前请求时,它使用来自先前请求的数据,即对于一系列客户端服务器交互,它使用相同的连接。

会话管理技术包括:

  1. 隐藏表单字段
  2. Cookie
  3. 会话
  4. URL重写

请求范围、会话范围和应用程序范围也可用于会话管理。 - Kidus Tekeste

7
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是一种无状态协议,这就是为什么它会忘记用户信息的原因。

我们使用JSON Web Token(JWT)将HTTP变成有状态协议,即在每个发送到服务器的请求中,服务器将首先使用JWT验证用户。


1
很好的解释 - Rahul_Patil

2
你的问题非常到位,如果你与银行的网络交易采用有状态连接将会很好。但遗憾的是,HTTP是无状态的,这是由于1989年BSD中FTP的一个奇怪的错误和部分套接字表中的12个套接字限制所导致的。Marcus Ranum在这里解释了所有这些。
因此,HTTP放弃了从TCP继承的状态,并必须在应用程序层面重新创建状态,以cookie的形式。糟糕的互联网安全就是其结果。 Seif项目提议使用“安全的JSON over TCP”来解决所有这些问题。不需要DNS和证书颁发机构。该协议和seifnode.js已经完成并发布在GitHub上,采用MIT许可证。

1

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

从此链接


0

基本上是这样,但你别无选择,只能使用 HTTP,这也是网站服务的地方。因此,你必须处理妥协以使 HTTP 有状态,即会话管理。可能性基本上是通过 URL 在每个调用中传递会话 ID,这样你就知道你正在与之前谈论过的某个人交谈,或者通过 cookie,它们可以在不混乱 URL 的情况下实现相同的目标。然而,大多数现代 Web 开发语言都会为你处理这些问题;如果你搜索你选择的语言 +“会话管理”,你应该能够得到一些关于如何完成它的想法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接