TCP 通信过程中各步骤的状态

状态图 1

状态图 2

对于上面的图 N 多人都知道,它排除和定位网络或系统故障时大有帮助,但是怎样牢牢地将这张图刻在脑中呢?那么你就一定要对这张图的每一个状态,及转换的过程有深刻的认识,不能只停留在一知半解之中。下面对这张图的11种状态详细解析一下,以便加强记忆!不过在这之前,先回顾一下 TCP
建立连接的三次握手过程,以及关闭连接的四次握手过程,详情请看《浅谈 TCP 三次握手和四次挥手》

CLOSED: 这个没什么好说的了,表示初始状态。

LISTEN: 这个也是非常容易理解的一个状态,表示服务器端的某个 SOCKET 处于监听状态,可以接收连接了。

SYN_RCVD: 这个状态表示接收到了 SYN 报文,在正常情况下,这个状态是服务器端的SOCKET 在建立 TCP 连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用 netstat 你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次 TCP 握手过程中最后一个 ACK 报文不予发送。因此这种状态时,当收到客户端的 ACK 报文后,它会进入到 ESTABLISHED 状态。

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

ESTABLISHED:这个容易理解了,表示连接已经建立了。

FIN_WAIT_1: 这个状态要好好解释一下,其实 FIN_WAIT_1 和 FIN_WAIT_2 状态的真正含义都是表示等待对方的 FIN 报文。而这两种状态的区别是:FIN_WAIT_1 状态实际上是当 SOCKET 在 ESTABLISHED 状态时,它想主动关闭连接,向对方发送了 FIN 报文,此时该 SOCKET 即进入到
FIN_WAIT_1 状态。而当对方回应 ACK 报文后,则进入到 FIN_WAIT_2 状态,当然在实际的正常情况下,无论对方何种情况下,都应该马 上回应 ACK 报文,所以 FIN_WAIT_1 状态一般是比较难见到的,而 FIN_WAIT_2 状态还有时常常可以用 netstat 看到。

FIN_WAIT_2:上面已经详细解释了这种状态,实际上 FIN_WAIT_2 状态下的 SOCKET,表示半连接,也即有一方要求 close 连接,但另外还告诉对方,我暂时还有点数据需要传送给你,稍后再关闭连接。

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: 这种状态的含义其实是表示在等待关闭。怎么理解呢?当对方 close 一个 SOCKET 后发送 FIN 报文给自己,你系统毫无疑问地会回应一个 ACK 报文给对方,此时则进入到 CLOSE_WAIT 状态。接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有的话,那么你也就可以 close 这个 SOCKET,发送 FIN 报文给对方,也即关闭连接。所以你在 CLOSE_WAIT 状态下,需要完成的事情是等待你去关闭连接。

LAST_ACK: 这个状态还是比较容易好理解的,它是被动关闭一方在发送 FIN 报文后,最后等待对方的 ACK 报文。当收到 ACK 报文后,也即可以进入到 CLOSED 可用状态了。

转自:http://www.cnblogs.com

时间: 2024-10-15 23:40:24

TCP 通信过程中各步骤的状态的相关文章

怎样解决W5200/W5500在TCP通信过程中意外断开?(Keepalive)

在使用W5200和W5500的TCP通信过程中,有一个非常容易被问到的问题: (这里以W5200为例) W5200作为服务器,假如客户端的网线断开 或 瞬间停电,服务器该怎样判断? 那么当客户端由于这些原因忽然断开,该怎样解决? 今天给大家介绍解决以上问题的办法,即如何使用Keepalive. 什么是Keepalive? Keepalive即心跳检测,以下简称KA,之所以称之为心跳检测是因为它像心跳一样每隔一段时间发一次,以此来告诉对方自己是否存活.心跳检测用于TCP通讯过程中服务器检测客户端是

http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤

http通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤: (1)    建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络.HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能,才能进行更层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80 (2)    Web

BLE通信过程中,一次连接间隔最多可以发多少包,BLE的最大通信速度为多少

最大吞吐量(简单了解) 兼容IOS的情况下,20ms间隔,最大通信速率 6KBytes/S,单独安卓为7.5ms间隔时,通信速率为16KBytes/S IOS一个连接间隔最多交互4次: 安卓一个连接间隔最多交互6次: 可参考LightBlue的引用(详细了解) https://punchthrough.com/blog/posts/maximizing-ble-throughput-on-ios-and-android 关于BLE,在通信过程中,首次通信,Master和Slave交互一次是20个

讲一下数据分析有哪些步骤,在你做项目的过程中哪个步骤需要花费的时间最久?为什么?

数据分析的步骤 1.定义问题,明确需要解决的需求是什么. 2.问题拆分.对于最终需要解决或探索的问题,进行细分,拆分成不同层面的问题. 3.确定指标.根据不同的细分问题,确定需要探索的指标 4.数据收集.收集整理分析项目所需的数据. 5.数据清洗.删除重复数据,异常值,缺失值处理她,特征筛选,数据归一化或标准化处理. 6.数据分析.对相关数据指标进行描述分析,利用可视化进行探索性分析. 7.趋势预测.根据数据建立数据挖掘模型,利用历史数据预测未来数据,并提升预测精度. 8.撰写报告.梳理分析结论

HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤

1. 建立TCP连接 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络.HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80. 2. Web浏览器向Web服务器发送请求命令 一旦建立了TCP连接,Web浏览器就会向Web服务器发送

TCP连接建立过程中为什么需要“三次握手”(转)

传输控制协议(Transmission Control Protocol, TCP)是一种面向连接的.可靠的.基于字节流的运输层(Transport layer)通信协议.是专门为了在不可靠的互联网络上提供一个可靠的端到端字节流而设计的.互联网络与单个网络不同,因为互联网络的不同部分可能有着截然不同的拓扑.带宽.延迟.分组大小和其他参数.TCP的设计目标是能够动态的适应互联网络的这些特性,而且当面对多种失败的时候仍然能够健壮. 每一次TCP连接都需要三个阶段:连接建立.数据传送和连接释放.“三次

jquery异步ajax与服务器通信过程中如何通过then方法链式传递多层数据

我们在有些地方可能需要对服务器返回的参数做多步处理,或者很多复杂的操作必须等到服务器返回结果之后才会执行,那么我们可以用链式调用的then方法让这里做到更加易于扩展,也更加容易分离出各个功能模块.基本的方法如下. 1 doSubmit: function(){ 3 $.ajax({ 4 url: url, 5 type: 'post', 6 data: $("#fm").serialize(), 7 dataType: 'html' 8 }).then(function(data){

ORACLE安装过程中检查步骤出现的错误和解决方法【转】

Checking operating system requirements ...Expected result: One of redhat-3,redhat-4,SuSE-9,asianux-1,asianux-2Actual Result: redhat-4Check complete. The overall result of this check is: Passed==========================================================

清晰易懂TCP通信原理解析(附demo、简易TCP通信库源码、解决沾包问题等)

目录 说明 TCP与UDP通信的特点 TCP中的沾包现象 自定义应用层协议 TCPLibrary通信库介绍 Demo演示 未完成功能 源码下载 说明 我前面博客中有多篇文章讲到了.NET中的网络编程,与TCP和UDP相关的有: 1.http://www.cnblogs.com/xiaozhi_5638/p/3167794.html 2.http://www.cnblogs.com/xiaozhi_5638/p/3169641.html 3.http://www.cnblogs.com/xiaoz