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

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

3天内不再提示

TCP状态机设计与实现

CHANBAEK 来源:嵌入式攻城狮 作者:安迪西 2023-04-21 11:47 次阅读

1.TCP状态机

TCP状态机是TCP连接的变化过程。 TCP在三次握手和四次挥手的过程,就是一个TCP的状态说明,由于TCP是一个面向连接的,可靠的传输,每一次的传输都会经历连接,传输,关闭的过程,无论是哪个方向的传输,必须建立连接才行,在双方通信的过程中,TCP的状态是不一样的

下图说明了TCP状态的变化过程

图片

上图中不同线条的含义

  • 粗线:主动发起连接(可理解为客户端模型)
  • 虚线:被动发起连接(可理解为服务器模型)
  • 细线:两端同时操作

TCP各个状态的解释如下:

CLOSED 表示初始状态

LISTEN 表示服务器端的某个socket处于监听状态,可以接受连接

SYN_SENT 与SYN_RCVD呼应,当客户端socket执行connect连接时,它首先发送SYN报文,随即进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。 该状态表示客户端已发送SYN报文

SYN_RCVD 表示接收到SYN报文,正常情况下,该状态是服务器端的socket在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂。 此种状态时,当收到客户端的ACK报文后,会进入到ESTABLISHED状态

ESTABLISHED 表示连接已经建立

FIN_WAIT_1 表示等待对方的FIN报文,当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态

FIN_WAIT_2 主动关闭链接的一方,发出FIN收到ACK以后进入该状态,称为半连接或半关闭状态,此时socket只能接收数据,不能发。 当对方回应ACK后,socket即进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到

TIME_WAIT 表示收到了对方的FIN报文,并发送出了ACK报文,等2MSL后即可回到CLOSED可用状态。 如果FIN_WAIT_1状态下,收到对方同时带 FIN标志和ACK标志的报文时,可以直接进入到TIME_WAIT状态,而无须经过FIN_WAIT_2状态

CLOSING 这种状态较特殊,属于一种较罕见的状态。 正常情况下,当发送FIN报文后,按理来说是应该先收到(或同时收到)对方的 ACK报文,再收到对方的FIN报文。 但是CLOSING状态表示你发送FIN报文后,并没有收到对方的ACK报文,反而却也收到了对方的FIN报文。 什么情况下会出现此种情况呢? 如果双方几乎在同时close一个socket的话,那么就出现了双方同时发送FIN报文的情况,也即会出现CLOSING状态,表示双方都正在关闭socket连接

CLOSE_WAIT 此种状态表示在等待关闭。 当对方关闭一个socket后发送FIN报文给自己,系统回应一个ACK报文给对方,此时进入CLOSE_WAIT状态。 接下来察看是否还有数据发送给对方,若无,则可close这个socket,发送FIN报文给对方,即关闭连接。 所以在CLOSE_WAIT状态下,需要关闭连接

LAST_ACK 该状态是被动关闭一方在发送FIN报文后,最后等待对方的ACK报文。 当收到ACK报文后,即可以进入到CLOSED可用状态

2.TCP状态分析

2.1 TCP状态分析工具

利用网络助手 + nc命令 + netstat命令工具,来查看及分析TCP状态:

使用网络调试助手创建服务器(或客户端)

使用nc命令(netcat)创建客户端(服务端)

connect to somewhere:   nc [-options] hostname port[s] [ports] ...
listen for inbound:     nc -l -p port [options] [hostname] [port]
options:
        -d              detach from console, background mode
        -e prog         inbound program to exec [dangerous!!]
        -g gateway      source-routing hop point[s], up to 8
        -G num          source-routing pointer: 4, 8, 12, ...
        -h              this cruft
        -i secs         delay interval for lines sent, ports scanned
        -l              listen mode, for inbound connects
        -L              listen harder, re-listen on socket close
        -n              numeric-only IP addresses, no DNS
        -o file         hex dump of traffic
        -p port         local port number
        -r              randomize local and remote ports
        -s addr         local source address
        -t              answer TELNET negotiation
        -c              send CRLF instead of just LF
        -u              UDP mode
        -v              verbose [use twice to be more verbose]
        -w secs         timeout for connects and final net reads
        -z              zero-I/O mode [used for scanning]
port numbers can be individual or ranges: m-n [inclusive]

nc 连接服务器

nc 127.0.0.1 6666

nc 建立服务器

nc -l -p 6666

使用netstat和find命令查看tcp状态

netstat命令:

显示协议统计信息和当前 TCP/IP 网络连接。
NETSTAT [-a] [-b] [-e] [-f] [-n] [-o] [-p proto] [-r] [-s] [-x] [-t] [interval]
  -a        显示所有连接和侦听端口。
  -b        显示在创建每个连接或侦听端口时涉及的可执行程序。在某些情况下,已知可执
  	    行程序承载多个独立的组件,这些情况下,显示创建连接或侦听端口时涉及的组
  	    件序列。在此情况下,可执行程序的名称位于底部 [] 中,它调用的组件位于顶
  	    部,直至达到 TCP/IP。注意,此选项可能很耗时,并且在你没有足够权限时可
  	    能失败。
  -e        显示以太网统计信息。此选项可以与 -s 选项结合使用。
  -f        显示外部地址的完全限定域名(FQDN)。
  -n        以数字形式显示地址和端口号。
  -o        显示拥有的与每个连接关联的进程 ID。
  -p proto  显示 proto 指定的协议的连接;proto可以是下列任何一个: TCP、UDP、TCPv6 
  	    或 UDPv6。如果与 -s 选项一起用来显示每个协议的统计信息,proto 可以是下
  	    列任何一个: IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 或 UDPv6。
  -q        显示所有连接、侦听端口和绑定的非侦听 TCP 端口。绑定的非侦听端口不一定与
  	    活动连接相关联。
  -r        显示路由表。
  -s        显示每个协议的统计信息。默认情况下,
            显示 IP、IPv6、ICMP、ICMPv6、TCP、TCPv6、UDP 和 UDPv6 的统计信息;
  -p        选项可用于指定默认的子网。
  -t        显示当前连接卸载状态。
  -x        显示 NetworkDirect 连接、侦听器和共享终结点。
  -y        显示所有连接的 TCP 连接模板。无法与其他选项结合使用。
  interval  重新显示选定的统计信息,各个显示间暂停的间隔秒数。按 CTRL+C 停止重新显示
            统计信息。如果省略,则 netstat 将打印当前的配置信息一次。

find命令:

FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] "string" [[drive:][path]filename[ ...]]

  /V         显示所有未包含指定字符串的行。
  /C         仅显示包含字符串的行数。
  /N         显示行号。
  /I         搜索字符串时忽略大小写。
  /OFF[LINE] 不要跳过具有脱机属性集的文件。
  "string"   指定要搜索的文本字符串。
  [drive:][path]filename 指定要搜索的文件。

如果没有指定路径,FIND 将搜索在提示符处键入文本或者由另一命令产生的文本。

2.2 TCP状态分析流程

使用网络调试助手开启一个服务器,监听“127.0.0.1”和端口“6666”

图片

此时使用nc命令 netstat -an -p tcp | find “6666” 可见端口“6666”的状态为:

LISTENING

图片

重开一个cmd命令对话框,使用nc命令nc 127.0.0.1 6666连接服务器

图片

再次使用nc命令netstat -an -p tcp | find “6666” 可见端口“6666”的状态为:

ESTABLISHED

图片

网络调试助手停止监听后,再次查看tcp端口“6666”,此时的状态为:TIME_WAIT

图片

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

    关注

    12

    文章

    9010

    浏览量

    85162
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1348

    浏览量

    78979
  • 状态机
    +关注

    关注

    2

    文章

    492

    浏览量

    27470
  • 客户端
    +关注

    关注

    1

    文章

    289

    浏览量

    16659
收藏 人收藏

    评论

    相关推荐

    FPGA工程师:如何在FPGA中实现状态机

    安全高效的状态机设计对于任何使用FPGA的工程师而言都是一项重要技能。选择Moore状态机、Mealy状态机还是混合机取决于整个系统的需求。无论选择哪种类型的状态机,充分掌握
    发表于 03-29 15:02 1.3w次阅读
    FPGA工程师:如何在FPGA中<b class='flag-5'>实现状态机</b>?

    Spring状态机实现原理和使用方法

    说起 Spring 状态机,大家很容易联想到这个状态机和设计模式中状态模式的区别是啥呢?没错,Spring 状态机就是状态模式的一种
    的头像 发表于 12-26 09:39 1868次阅读
    Spring<b class='flag-5'>状态机</b>的<b class='flag-5'>实现</b>原理和使用方法

    高效安全的状态机设

    本帖最后由 eehome 于 2013-1-5 09:56 编辑 高效安全的状态机设
    发表于 08-13 17:53

    状态机设计的例子

    本帖最后由 eehome 于 2013-1-5 09:56 编辑 状态机设计的例子
    发表于 08-19 23:01

    状态机设计指导

    状态机设计指导
    发表于 08-20 23:45

    状态机设计问题

    状态机设计中always @(*) beginnext = 2'bx;case (state)idle: next=s1;s1: next=s2;s2: next=idle;end以上代码先给
    发表于 10-06 18:49

    一个简单的状态机设

    笔试时也很常见。[例1] 一个简单的状态机设计--序列检测器序列检测器是时序数字电路设计中经典的教学范例,下面我们将用Verilog HDL语言来描述、仿真、并实现它。序列检测器的逻辑功能...
    发表于 02-16 07:29

    如何写好状态机

    如何写好状态机:状态机是逻辑设计的重要内容,状态机的设计水平直接反应工程师的逻辑功底,所以许多公司的硬件和逻辑工程师面试中,状态机设计几乎是必选题目。本章在引入
    发表于 06-14 19:24 97次下载

    状态机设

    状态机设计:8.1.1 数据类型定义语句TYPE语句的用法如下:TYPE 数据类型名IS 数据类型定义OF 基本数据类型;或TYPE 数据类型名IS 数据类型定义;TYPE st1 IS ARRAY ( 0 TO 15 ) OF STD_L
    发表于 08-09 23:07 36次下载

    高速环境下FPGA或CPLD中的状态机设

        本文给出了采用这些技术的高速环境状态机设计的规范及分析方法和优化方法,并给出了相应的示例。       为了使FPGA或CPLD中的状态机设
    发表于 04-15 11:27 665次阅读
    高速环境下FPGA或CPLD中的<b class='flag-5'>状态机设</b>计

    如何使用STATECAD进行多状态机设计实例分析

    有限状态机设计的关键是如何把一个实际的时序逻辑关系抽象成一个时序逻辑函数,传统的电路图输入法通过直接设计寄存器组来实现各个状态之间的转换, 而用硬件描述语言来描述有限
    发表于 11-11 09:49 2076次阅读
    如何使用STATECAD进行多<b class='flag-5'>状态机设</b>计实例分析

    VHDL有限状态机设计-ST

    EDA的有限状态机,广义而言是指只要涉及触发器的电路,无论电路大小都可以归结为状态机。有限状态机设计在学习EDA时是很重要的一章。
    发表于 06-08 16:46 3次下载

    状态机实现哪些内容

    状态机模式是一种行为模式,通过多态实现不同状态的调转行为的确是一种很好的方法,只可惜在嵌入式环境下,有时只能写纯C代码,并且还需要考虑代码的重入和多任务请求跳转等情形,因此实现起来着实
    的头像 发表于 06-22 14:26 702次阅读
    <b class='flag-5'>状态机</b>要<b class='flag-5'>实现</b>哪些内容

    基于FPGA的状态机设

    状态机的基础知识依然强烈推荐mooc上华科的数字电路与逻辑设计,yyds!但是数电基础一定要和实际应用结合起来,理论才能发挥真正的价值。我们知道FPGA是并行执行的,如果我们想要处理具有前后顺序的事件就需要引入状态机
    的头像 发表于 07-28 10:02 930次阅读
    基于FPGA的<b class='flag-5'>状态机设</b>计

    什么是状态机状态机的种类与实现

    状态机,又称有限状态机(Finite State Machine,FSM)或米利状态机(Mealy Machine),是一种描述系统状态变化的模型。在芯片设计中,
    的头像 发表于 10-19 10:27 8970次阅读