0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

什么是TCP状态转移

汽车电子技术 来源:物联网IoT开发 作者: 杰杰mcu 2023-02-14 10:35 次阅读

TCP状态转移

在前一篇文章【面试必考】TCP协议“三次握手”与“四次挥手”已经介绍了TCP协议的三次握手和四次挥手。总的来说,TCP通信过程包括三个步骤:建立TCP连接(三次握手)、数据传输、终止TCP连接(四次挥手)。但是在这个通信过程中,有非常复杂的状态问题,下面就来了解一下进行TCP协议通信时候的状态转移。

TCP协议根据连接时接收到报文的不同类型,采取相应动作也不同,还要处理各个状态的关系,如当收到握手报文时候、超时的时候、用户主动关闭的时候等都需要不一样的状态去采取不一样的处理。在LwIP中,为了实现TCP协议的状态描述,定义了11种连接时候的状态:

1static const char *const tcp_state_str[] = {
 2  "CLOSED",     //关闭状态(无连接)
 3  "LISTEN",     //监听状态
 4  "SYN_SENT",   //已发起请求连接(等待确认)
 5  "SYN_RCVD",   //已收到请求连接
 6  "ESTABLISHED",//稳定连接状态
 7  "FIN_WAIT_1", //单向请求终止连接状态
 8  "FIN_WAIT_2", //对方已应答请求终止连接
 9  "CLOSE_WAIT", //等待终止连接
10  "CLOSING",    //两端同时关闭  
11  "LAST_ACK",   //服务器等待对方接受关闭
12  "TIME_WAIT"   //关闭成功(2MSL等待状态)
13};
  • LISTEN:表示监听状态。服务器调用了listen函数进入监听状态,客户端可以开始进行连接了。
  • SYN_SENT:表示客户端已经发送了SYN报文请求连接(同时在等待服务器的确认)。当客户端调用connect函数发起连接时,首先发SYN给服务端,然后自己进入SYN_SENT状态,并等待服务端发送ACK+SYN报文(握手应答报文)进行确认。
  • SYN_RCVD:在每一个 TCP 连接建立时,都要进行三次握手,这个状态表示服务器接收到客户端发来的同步报文段(第一次握手),并且向客户端发送了确认同步报文段(第二次握手)之后的状态,在这个状态时,其实连接已经经历了两次握手。
  • ESTABLISHED:这个状态是处于稳定连接状态,建立连接的TCP协议两端的主机都是处于这个状态,它们相互知道彼此的窗口大小、序列号、最大报文段等信息
  • FIN_WAIT_1FIN_WAIT_2:处于这个状态一般都是客户端主机单向请求终止连接,然后主机等待服务器的回应,而如果服务器产生应答,则主机状态转移为FIN_WAIT_2,此时<客户端 -> 服务器 >方向上的TCP连接就断开,但是<服务器 -> 客户端>方向上的连接还是存在的。此处有一个注意的地方:如果主机处于FIN_WAIT_2状态,说明主机已经发出了FIN报文段,并且服务器也已对它进行确认,除非客户端是在实行半关闭状态,否则将等待服务器主机的应用层处理关闭连接,因为服务器已经意识到它已收到FIN报文段,它需要发一个 FIN 来关闭<服务器 -> 客户端>方向上的连接。这样客户端这端才会从FIN_WAIT_2状态进入TIME_WAIT状态。如果是网络不好或者是服务器不发送FIN报文段的时候,这意味着客户端这端可能永远保持这个FIN_WAIT_2状态,从而无法 进入CLOSE_WAIT状态,并一直占用这个端口连接或者socket,在嵌入式中,如果存在多个这种状态的话,则这很可能导致内存耗尽。
  • CLOSE_WAIT:在收到客户端主动断开连接的 FIN 报文段(第一次挥手)后,服务器返回给客户端确认报文段(第二次挥手)后的状态。
  • TIME_WAIT状态:TIME_WAIT状态也称为 2MSL等待状态

具体见下图:

  • . 红色虚线:表示服务器的状态转移。

  • . 黑色实线:表示客户端的状态转移。

    图片

    TCP协议状态转移

RST报文

顺便再提一点不太常见的TCP协议状态转移,主要是针对服务器端的(绿色那条):

  1. 服务器在收到SYN握手报文后,再收到了客户端的RST报文,那么它会重新进入监听状态,再重新等待连接。

一般说来,无论何时一个报文段发往基准的连接出现错误, TCP都会发出一个复位报文段(这里提到的基准的连接是指由目的 IP地址、目的端口号、源 IP地址和源端口号都是已知的连接。

此外产生复位的另一种常见情况是当连接请求到达时,目的端口并没有在监听中,当一个数据报到达目的端口时,它将产生一个ICMP端口不可达的信息,同时TCP协议将进行复位,当然啦,在lwip中这些ICMP端口不可达报文都会被丢弃的,也不用管那么多。

TIME_WAIT状态

第一次看这个转移图的时候,可能很多人都有疑惑,为什么要有一个 TIME_WAIT 状态?为什么不能直接到达 CLOSED 状态?

每个具体TCP连接的实现必须选择一个TCP报文段最大生存时间MSLMaximum Segment Lifetime),就如IP数据报中的TTL字段表示报文在网络中生存的时间一样。MSL是任何报文段被丢弃前在网络内的最长时间,这个时间是有限的,为什么需要等待呢?我们知道 IP数据报 是不可靠的,而TCP报文段是封装在IP数据报中,TCP协议必须保证发出的 ACK 报文段是正确被对方接收, 因此处于该状态的主机必须在这个状态停留最长时间为2倍的MSL,以防最后这个ACK丢失,因为TCP协议必须保证数据能准确送达目的地。

我们来假设一下 :假设没有 TIME_WAIT 这种状态。现实中,网络环境不是理想的。在数据包传输的过程中,难免会有一些延时啊、丢包啊的情况发生。如果在客户端的最后一个确认报文段发出去之后,由于某种原因,没有到达服务端,服务端在超时后,就会向客户端重新发一个 FIN 报文段,请求重传这个已经丢失的确认报文段。但由于在客户端,连接实际上已经断开,端口已经关闭。那么在客户端收到这个报文段后,会向服务端发送一个 RST 报文段请求重连(这也是为什么我要在前面讲解RST的原因 ),而此时服务器收到这个 RST报文段后,会认为是错误的,因为在服务器看来都没断开连接,它所期望收到的是确认报文段。所以这个时候客户端是不允许直接CLOSE关闭了事的,因此它需要等待服务器确认了,再CLOSE

假设一下:如果没有 TIME_WAIT 这种状态,客户端在关闭连接后,再次成功建立新的连接,客户端任然可能会收到服务器的最后一个确认报文段,但是由于序号不同(重新建立连接时的序号是随机的,这点很重要,要记住),客户端会要求服务端重传数据包,这样,连接就必然会混乱出错。而在 TIME_WAIT 这种状态等待一段时间是为了让本次连接的时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的报文。

TIME_WAIT 状态的等待时间一般是 2MAL ,并且客户端连接的端口没有释放,这样,让前一个连接的报文段有足够的时间被处理或者丢弃,也就不会出现这个问题。

这才是TCP协议优雅且可靠的终止连接方式啊!太强大了,我得膜拜一下~

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 状态
    +关注

    关注

    0

    文章

    16

    浏览量

    11903
  • LwIP
    +关注

    关注

    1

    文章

    82

    浏览量

    26620
  • TCP协议
    +关注

    关注

    1

    文章

    83

    浏览量

    12004
收藏 人收藏

    评论

    相关推荐

    状态转移图的研究及单流程编程训练实验

    状态转移图的研究及单流程编程训练实验 一、实验目的
    发表于 12-26 22:41 4956次阅读
    <b class='flag-5'>状态</b><b class='flag-5'>转移</b>图的研究及单流程编程训练实验

    TCP通讯状态如何获取

    工控机与外围设备以太网TCP通讯,如何获得通讯的状态,比如是否建立连接,是否空闲中,是否数据发送中等因为需要在设备中启动前判断通讯是否正常,发送数据后是否接受成功,有没有发送完成等信号?初用labview用以太网通讯,还望指点? 感激不尽
    发表于 03-05 16:24

    关于VISA端口状态转移方式

    VISA端口 就以串口举例 状态转移A情况:比如只有一个COM1方法:1.初始化COM1后 直接连线 地球人都知道2.初始化后写入功能全局变量(其实就是未初始化的移位寄存器),下次调用的时候读出该
    发表于 07-05 18:21

    关于VISA状态转移问题

    VISA端口 就以串口举例 状态转移A情况:比如只有一个COM1方法:1.初始化COM1后 直接连线 地球人都知道2.初始化后写入功能全局变量(其实就是未初始化的移位寄存器),下次调用的时候读出该
    发表于 07-05 18:24

    基于状态转移的独立按键程序设计

    基于状态转移的独立按键程序设计本章所描述的按键程序要达到的目的:检测按键按下,短按,长按,释放。即通过按键的返回值我们可以获取到如下的信息:按键按下(短按),按键长按,按键连发,按键释放。不知道大家
    发表于 03-19 14:45

    状态机下载到片子,状态转移

    我用VHDL编写的程序,Modelsim跑前后仿真都没有问题。下载到片子上怎么都没结果。后来考虑可能是没有进状态机,试着用LED发现没有状态转移。后来编写了一个最基本的状态机程序,发现
    发表于 09-29 10:11

    CC3200 freertos TCP client 检测连接状态是什么

    cc3200 TCP client 连接 PC端 tcp server成功后, sl_Recv 接收处于阻塞状态。当tcp server 关闭后,1,sl_Recv 不会返回0 表示连
    发表于 06-12 14:12

    触发器的状态转移图和激励表

    描述触发器的逻辑功能还可以采用图形方式,即状态转移图来描述。图13-4为基本触发器的状态转移图。图中两
    发表于 08-13 09:31 2.1w次阅读
    触发器的<b class='flag-5'>状态</b><b class='flag-5'>转移</b>图和激励表

    线性系统状态转移矩阵讨论

    状态转移矩阵是现代控制理论的重要概念,在线性控制系统的运动分析起着重要的作用。分别对连续时间线性时变系统.判断矩阵函数一线性系统状态转移矩阵的充分条件,并求出了其对
    发表于 05-23 15:35 0次下载

    TCP IP协议有什么样的状态

    首先介绍一下TCP连接建立与关闭过程中的状态TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用、特定数据包以及超时等,具体
    的头像 发表于 02-24 14:31 2960次阅读
    <b class='flag-5'>TCP</b> IP协议有什么样的<b class='flag-5'>状态</b>

    一种可转移的对话状态生成器

    过度依赖域本体和缺乏跨域知识共享是对话状态跟踪的两个实际但尚未研究的问题。现有方法通常在推理期间无法跟踪未知时隙值,并且常常难以适应新领域。在本文中,我们提出了一种可转移的对话状态生成器(TRADE)
    的头像 发表于 04-09 14:23 2058次阅读

    PLC单流程状态转移图编程怎么操作

    所谓单一过程,就是状态转移只能有一个顺序,没有其他可能。比如转盘使用凸轮和限位开关实现自动控制的控制过程,只有一个顺序,即S0→S20→S21→S22→S0,是典型的单一过程,由单一过程组成的状态
    发表于 12-27 11:19 1637次阅读

    TCP状态机设计与实现

    TCP状态机是TCP连接的变化过程。TCP在三次握手和四次挥手的过程,就是一个TCP状态说明,
    的头像 发表于 04-21 11:47 1146次阅读
    <b class='flag-5'>TCP</b><b class='flag-5'>状态</b>机设计与实现

    TCP状态流转图详解

    接下来再看一下著名的 TCP 状态流转图。 CLOSED状态:表示初始状态。 LISTEN状态:表示服务器端的某个 socket 处于监听
    的头像 发表于 10-08 17:11 569次阅读
    <b class='flag-5'>TCP</b><b class='flag-5'>状态</b>流转图详解

    TCP协议的连接状态

    TCP是一个巨复杂的协议,因为他要解决很多问题,而这些问题又带出了很多子问题和阴暗面。所以学习TCP本身是个比较痛苦的过程,但对于学习的过程却能让人有很多收获。 一、TCP协议的定义 TCP
    的头像 发表于 11-13 15:47 569次阅读
    <b class='flag-5'>TCP</b>协议的连接<b class='flag-5'>状态</b>