TCP协议是无状态的吗?

nav*_*rri 14 tcp http

HTTP,驻留在TCP协议上的协议是无状态的,IP协议也是无状态的但是我们如何得出结论TCP是无状态的?

zne*_*eak 40

您不能假设任何堆叠协议只是查看堆栈上的其他协议是有状态的或无状态的.有状态协议可以建立在无状态协议之上,无状态协议可以建立在有状态协议之上.分层网络模型的一个要点是,您正在寻找的关系类型(任何给定协议的状态,与其协同使用的协议的功能)不存在.

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

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

另一方面,HTTP的状态有点令人困惑,因为几个应用程序(在明显不同的OSI层上)会将其状态泄露给HTTP.例如,如果用户尝试查看不存在的博客帖子,则博客应用程序可能会发回包含404状态代码的响应,即使找到了处理博客帖子搜索本身的文件也是如此.

  • 我认为没有人通过“仅查看堆栈上的其他协议”来确定 TCP 的状态。其他协议仅作为比较点被引用。您正确地指出,状态与堆栈中较低或较高的协议无关。 (3认同)

Pau*_*per 7

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

维基百科:

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

要应用此定义,首先我们必须了解"请求"是什么.

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

这将使TCP成为一个有状态的协议,因为各方必须记住另一个状态,以及另一个拥有的字节.因此TCP 状态图.


Bax*_*Bax 6

这是一个很好的解释:

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