TCP状态机

1. TCP状态机

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

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

上图中不同线条的含义

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

TCP各个状态的解释:

  • CLOSED:表示初始状态

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

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

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

  • ESTABLISHED:表示连接已经建立

  • FIN_WAIT_1:FIN_WAIT_1和FIN_WAIT_2状态的真正含义都是表示等待对方的FIN报文。区别是:
    FIN_WAIT_1状态是当socket在ESTABLISHED状态时,想主动关闭连接,向对方发送了FIN报文,此时该socket进入到FIN_WAIT_1状态。
    FIN_WAIT_2状态是当对方回应ACK后,该socket进入到FIN_WAIT_2状态,正常情况下,对方应马上回应ACK报文,所以FIN_WAIT_1状态一般较难见到,而FIN_WAIT_2状态可用netstat看到。

  • FIN_WAIT_2:主动关闭链接的一方,发出FIN收到ACK以后进入该状态。称之为半连接或半关闭状态。该状态下的socket只能接收数据,不能发。

  • 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” 可见tcp端口“6666”的状态为:LISTENING

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

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

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

LWIP应用开发|TCP状态机相关推荐

  1. LWIP网络开发从入门到精通

    LWIP网络开发从入门到精通 1. LWIP应用开发 | LWIP协议栈 2. LWIP应用开发 | 以太网基础知识 3. LWIP应用开发 | TCP/IP协议簇一 4. LWIP应用开发 | TC ...

  2. LwIP应用开发笔记之六:LwIP无操作系统TCP客户端

    上一篇我们基于LwIP协议栈的RAW API实现了一个TCP服务器的简单应用,接下来一节我们来实现一个TCP客户端的简单应用. 1.TCP简述 TCP(Transmission Control Pro ...

  3. LwIP应用开发笔记之五:LwIP无操作系统TCP服务器

    前面我们实现了UDP服务器及客户端以及基于其上的TFTP应用服务器.接下来我们将实现同样广泛应用的TCP协议各类应用. 1.TCP简述 TCP(Transmission Control Protoco ...

  4. lwip --- (十七)TCP状态机

      服务器端接收到SYN握手包,向客户端返回带SYN和ACK的握手包,并将相应TCP控制块置为SYN_RCVD状态,并挂在tcp_active_pcbs链表上.以后,继续等待客户端发送过来的握手包,这 ...

  5. 探索TCP状态机之旅:发现网络连接的生命周期与神秘魅力

    目录标题 前言 TCP状态简介 TCP状态机的目的与功能 TCP状态在连接建立.数据传输和连接关闭过程中的作用 TCP状态详解 LISTEN:服务器监听来自客户端的连接请求. SYN\_SENT:客户 ...

  6. python中参数的位置传递和名称传递各有什么优缺点_Python开发TCP和UDP的区别是什么?优缺点对比总结...

    Python开发TCP和UDP的区别是什么?优缺点对比总结:UDP 是面向无连接的通讯协议,UDP 数据包括目的端口号和源端口号信息.TCP 是面向连接的通讯协议,通过三次握手建立连接,通讯完成时四次 ...

  7. C#Socket开发TCP详解(二)

    文章目录 C#Socket开发TCP详解(二)--面向连接的套接字编程 简介: **面向连接的套接字** 1.建立连接 2.发送和接收消息 3.关闭连接 C#Socket开发TCP详解(二)–面向连接 ...

  8. 开发实践 | 使用Android开发TCP、UDP客户端(代码类)

    博主github:https://github.com/MichaelBeechan 博主CSDN:https://blog.csdn.net/u011344545 在进行Android开发的过程中, ...

  9. tcp状态机-三次握手-四次挥手以及常见面试题

    TCP状态机介绍 在网络协议栈中,目前只有TCP提供了一种面向连接的可靠性数据传输.而可靠性,无非就是保证,我发给你的,你一定要收到.确保中间的通信过程中,不会丢失数据和乱序.在TCP保证可靠性数据传 ...

最新文章

  1. 静态路由和默认路由的区别
  2. 形态学处理:膨胀、腐蚀、开运算、闭运算、形态学梯度、顶帽、黑帽
  3. TP自动生成模块目录
  4. 简单介绍tomcat中maxThreads,acceptCount,connectionTimeout
  5. exlsx表格教程_用Ctrl+E处理Excel表格,快到你无法想象!
  6. 7、 MySQL锁机制:数据库核心技术之一
  7. 9个用来爬取网络站点的 Python 库
  8. json_encode ajaxReturn getJSON
  9. web服务优化与健壮性改进_创建健壮的微服务架构所涉及的组件
  10. JAVA安装作用_jdk安装配置及其作用
  11. 谷歌10月15日发布 Pixel 4;高通以31亿美元收购与TDK公司权益;甲骨文、VMware就云技术及支持达成协议……...
  12. mysql 全局不重复_php uniqid() 通过MYSQL实现全局不重复的唯一ID
  13. 卷王李富贵算法每日一题--分治算法(三)--逃亡
  14. Spring Boot 学习之路二 配置文件 application.yml
  15. 服务器迁移虚拟化实施方案,虚拟化实施方案
  16. 如何强制子div为父div的高度的100%而不指定父级的高度?
  17. MYSQL的空间查询
  18. 菠萝狗四足机器人使用手册
  19. 研究生如何写好毕业论文?(上)【中国人民大学龚新奇】
  20. OC-NSString

热门文章

  1. Python面向对象封装案例——士兵突击
  2. 电子协会 C语言 2级 60 、整数奇偶排序(2021年 6月真题)
  3. VsCode官网下载缓慢或者网络连接失败解决方法
  4. ssm excel导入oracle,EXCEL导入
  5. vue3.0 实现旋转木马
  6. 情人节你们过,表白代码我来写(HTML+CSS+JS)
  7. OC URL编码和URL解码
  8. Java Maven Tomcat使用Tesseract-OCR文字识别(Tess4j)
  9. IDEA快捷键设置,选择Eclipse风格的快捷键,自动补全快捷键,关闭当前窗口快捷键Ctrl+W,自动导入设置,引入外部的jar的方式,设置项目字体,设置项目字符集,Maven的方式获取jar
  10. 有氧生活——吸氧的好处_健合家庭医用制氧机