25

HTTP,驻留在 TCP 协议之上的协议是无状态的,IP 协议也是无状态的 但是我们怎么能断定 TCP 是无状态的呢?

4

4 回答 4

59

您不能仅查看堆栈上的其他协议就假定任何堆栈协议是有状态或无状态的。有状态协议可以构建在无状态协议之上,无状态协议可以构建在有状态协议之上。分层网络模型的要点之一是您正在寻找的那种关系(任何给定协议的状态在它与之结合使用的协议的功能中)不存在。

TCP 协议是有状态的协议,因为它是什么,而不是因为它是通过 IP 使用的,也不是因为 HTTP 是建立在它之上的。TCP 以窗口大小(端点相互告知它们准备接收多少数据)和数据包顺序(端点在从对方接收到数据包时必须相互确认)的形式维护状态。这种状态(其他人可以接收多少字节,以及他是否确实收到了最后一个数据包)允许 TCP 即使在本质上不可靠的协议上也是可靠的。因此,TCP 是一个有状态的协议,因为它需要状态才能有用。

我还想指出,虽然 HTTP 和 HTTPS(实际上只是基于 SSL/TLS 的 HTTP)本质上是无状态的(每个请求都是每个协议的有效独立请求),但基于 HTTP 和 HTTPS 构建的应用程序不是不一定是无国籍的。例如,网站可能会要求您在发送消息之前访问登录页面。即使客户端发送消息的请求是有效的独立请求,应用程序也不会接受它,除非客户端之前对其进行了身份验证。这意味着应用程序通过HTTP 实现状态。

附带说明一下,HTTP 的状态性可能有点令人困惑,因为几个应用程序(在明显不同的OSI 层上)会将它们的状态泄露给 HTTP。例如,如果用户试图查看不存在的博客文章,博客应用程序可能会发送回带有 404 状态代码的响应,即使找到了处理博客文章搜索本身的文件。

于 2013-11-11T05:42:34.470 回答
10

Zneak 是正确的,您可以将任何通信用于有状态的目的,但要问的问题是协议本身是否是有状态的。

维基百科:

在计算中,无状态协议是一种通信协议,它将每个请求视为与任何先前请求无关的独立事务,因此通信由独立的请求和响应对组成。无状态协议不要求服务器在多个请求期间保留有关每个通信伙伴的会话信息或状态。相反,需要在服务器上保持内部状态的协议称为有状态协议。

要应用这个定义,首先我们必须了解什么是“请求”。

  • IP - IP 数据包
  • TCP - TCP 数据包
  • HTTP - HTTP 请求/响应

这将使 TCP 成为有状态的协议,因为各方必须记住对方处于什么状态,以及对方拥有什么字节。因此TCP状态

于 2013-11-11T05:14:42.230 回答
5

是一个很好的解释:

将电话服务视为 TCP,并将您与远方家庭成员的关系视为 HTTP。您将通过电话服务与他们联系。对它们的每次调用都是一个有状态的 TCP 连接。但是,您不会经常与他们通电话,因为您会断开连接并稍后再给他们回电。您当然会希望他们记住您在上次通话中谈到的内容。HTTP 本身并没有这样做,但它是维护整个转换状态的 Web 服务器的一项功能。

于 2016-02-10T18:05:32.063 回答
2

为了正确回答这个问题,我们需要一个用于管理外部有状态资源的无状态协议的概念。http://laurel.datsi.fi.upm.es/_media/docencia/asignaturas/ws-modelingresources.pdf的第 2.4 节是关于实现这种协议的服务:

如果将状态管理的责任委托给另一个组件(例如数据库或文件系统),则可以将作用于有状态资源的服务描述为“无状态”。... 无状态的结果是给定消息交换执行所需的任何动态状态必须是:

  • 在请求消息中明确提供,无论是直接按值还是间接按引用,和/或
  • 隐式维护在 Web 服务可以与之交互的其他系统组件中。

因此,http 协议是无状态的,如果我们考虑服务的文件、访问的数据库等与协议本身的实现是分开的。与双方相关的无状态服务(实现协议)可能不会在每一方都显示为无状态,因为另一方可以携带状态。

于 2016-05-21T07:24:40.293 回答