TCP协议是无状态的吗?

时间:2013-11-11 05:08:45

标签: http tcp

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

4 个答案:

答案 0 :(得分:39)

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

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

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

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

答案 1 :(得分:7)

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

百科:

  

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

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

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

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

答案 2 :(得分:1)

Here是一个很好的解释:

  

将电话服务视为TCP,并将您与远程家庭成员的关系视为HTTP。您将通过电话服务与他们联系。每次调用它们都是有状态的TCP连接。但是,您不会经常与他们保持通话,因为您将断开连接,并在以后再次呼叫他们。你当然希望他们能记住你在最后一次电话会议上谈到的内容。 HTTP本身并不这样做,但它是Web服务器的一个功能,它维持整个对话的状态。

答案 3 :(得分:1)

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

  

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

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

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