【问题标题】:Is TCP protocol stateless?TCP协议是无状态的吗?
【发布时间】:2013-11-22 20:01:51
【问题描述】:

HTTP,基于TCP协议的协议是无状态的,IP协议也是无状态的 但是我们怎么能断定TCP是无状态的呢?

【问题讨论】:

  • TCP 是一种面向连接的协议,根据定义是有状态的。否则,TCP 无法保证通过 TCP 发送的所有字节按顺序传递。
  • 服务器是否知道客户端是否连接?它在等待下一个数据包(例如 TCP 序列)时是否记得过去的某些内容?
  • 那么 HTTPS 协议是不是也像 HTTP 一样无状态?
  • 您对“无状态协议”的确切定义是什么?

标签: http tcp


【解决方案1】:

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

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

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

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

【讨论】:

  • 我认为没有人通过“仅查看堆栈上的其他协议”来确定 TCP 的状态。其他协议仅作为比较点引用。您提出了正确的观点,即状态性独立于堆栈中较低或较高的协议。
【解决方案2】:

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

维基百科:

在计算中,无状态协议是一种通信协议, 将每个请求视为一个独立的事务,与 任何先前的请求,以便通信由独立的 请求和响应对。无状态协议不需要服务器保留 每个通信伙伴的会话信息或状态 多个请求的持续时间。相比之下,一个协议 需要在服务器上保持内部状态被称为 有状态协议。

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

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

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

【讨论】:

    【解决方案3】:

    Here 是一个很好的解释:

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-07-10
        • 2011-08-15
        • 1970-01-01
        • 2019-01-07
        • 2012-10-23
        • 2011-08-11
        • 2011-08-20
        • 2013-10-05
        • 1970-01-01
        相关资源
        最近更新 更多