TCP协议是无状态的吗?

30

HTTP,作为驻留在TCP协议之上的协议,是无状态的,而IP协议也是无状态的。 那么我们如何得出TCP是否无状态的结论呢?


4
TCP 是一种面向连接的协议,根据定义是有状态的。否则,TCP 将无法保证通过 TCP 发送的所有字节的按顺序传递。 - Mark Hendrickson
服务器是否知道客户端是否已连接?在等待下一个数据包时,它是否会记住过去的某些信息(如TCP序列号)? - sinelaw
那么HTTPS协议呢?它和HTTP一样也是无状态的吗? - tourist
2
你对“无状态协议”的确切定义是什么? - Ulrich Eckhardt
4个回答

62
您不能仅通过查看堆栈上的其他协议来假设任何堆叠协议是有状态的或无状态的。有状态协议可以建立在无状态协议之上,无状态协议也可以建立在有状态协议之上。分层网络模型的一个要点是,您正在寻找的关系类型(任何给定协议的状态功能与它所使用的协议的关系)不存在。
TCP协议是有状态协议,因为它的本身就是这样,并不是因为它在IP上使用或HTTP是建立在其之上。TCP通过窗口大小(端点告诉对方他们准备接收多少数据)和数据包顺序(端点必须互相确认从对方接收到的数据包)来维护状态。这种状态(对方可以接收多少字节以及是否接收到了上一个数据包)使得TCP即使在本质上不可靠的协议上也能保持可靠性。因此,TCP是有状态协议,因为它需要状态才能发挥作用。

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

顺便说一下,HTTP的有状态性可能会有些令人困惑,因为一些应用程序(在明显不同的OSI层上)会将它们的状态泄漏到HTTP上。例如,如果用户尝试查看不存在的博客文章,则博客应用程序可能会发送带有404状态码的响应,即使处理博客文章搜索的文件本身被找到。


4
我认为没有人是通过“只看协议栈上的其他协议”来确定TCP的状态性的。其他协议仅作为比较的参考。您提出了正确的观点,即状态独立于协议栈中较低或较高的协议。 - Paul Draper

13

简化版:TCP是有状态的协议,需要记住通信另一方的状态和数据。与之相反,UDP是无状态的协议。

虽然Zneak指出你可以使用任何通信方式进行有状态的目的,但实际上正在询问的问题是协议本身是否有状态。

维基百科:

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

TCP的“请求”(通信单位)是TCP数据包。

TCP是一个有状态的协议,因为通信双方必须记住彼此的状态和字节。 因此有TCP状态

与之相反,UDP是一个无状态的协议。 两端点都不保留任何状态概念。(尽管如往常一样,封装的信息可以用于有状态的目的。)


真的是非常好的答案。我也喜欢那个图表的链接。对于所有人来说,看一下这个图表是值得的。 :) - finneycanhelp

5
这里有一个很好的解释:点击这里
假设电话服务是TCP,你与远方家人的关系是HTTP。你将使用电话服务与他们联系。每次呼叫都会建立一个有状态的TCP连接。然而,你不会一直和他们通话,你会在稍后的时间内断开连接并再次呼叫他们。你肯定希望他们记得你上次通话的内容。HTTP本身并不会这样做,但它是维护整个对话状态的Web服务器的功能。

2
为了正确回答这个问题,我们需要了解一个无状态协议的概念,用于管理外部有状态资源。http://laurel.datsi.fi.upm.es/_media/docencia/asignaturas/ws-modelingresources.pdf的第2.4节介绍了实现这种协议的服务:
“如果一个服务作用于有状态资源,但将状态管理责任委托给其他组件(如数据库或文件系统),则可以将其描述为“无状态”。... 无状态的后果是,对于给定的消息交换执行所需的任何动态状态必须通过以下方式之一提供:在请求消息中显式地提供,直接按值或间接按引用提供,和/或在Web服务可以与之交互的其他系统组件中隐式维护。”
因此,如果我们考虑所提供的文件、访问的数据库等与协议本身的实现分离,那么HTTP协议是无状态的。在两个方面都与状态无关的服务(实现协议)可能在每一方面上看起来都不是无状态的,因为另一方面可能会承载状态。

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