TCP的状态转移
状态转移图

状态分析
客户端
- CLOSED
 初始状态- 调用connect将发起主动打开,发送SYN J到服务端,进入SYN_SENT状态。
 
- SYN_SENT
 客户端已经发送SYN报文- 接收到服务端发回的ACK J+1,以及SYN K,并且发回ACK K+1进入ESTABLISHED状态.此时表明连已经建立了。
- 主动调用close或者超时将回到CLOSED状态。
 
- ESTABLISHED
 连接已经建立,可以进行数据传输- 主动调用close,发送FIN到服务端,进入FIN_WAIT_1状态。
 
- FIN_WAIT_1
 主动调用了close,发送FIN到服务端,等待服务端应答。- 接收服务端应答的ACK,进入FIN_WAIT_2状态。
- 接收到服务端调用close发来的SYN,ACK并回反ACK进入TIME_WAIT状态。
- 接受到了服务端发来的FIN,并应答ACK,进入CLOSING状态。这种状态比较少见,一般只有双方同时close时才有可能出现。
 
- FIN_WAIT_2
 等待服务端close。- 接收服务端FIN,应答ACK,进入TIME_WAIT状态。
 
- CLOSING
 应答了服务端的FIN,等待服务端的应答。- 接收服务端的ACK,进入TIME_WAIT状态。
 
- TIME_WAIT
- 等待2MSL后,回到CLOSED状态。
 
服务端
- CLOSED
 初始状态- 调用accept进入监听状态。
 
- LISTEN
 监听状态,等待客户的连接。- 接收SYN,发送ACK,以及SYN,进入SYN_RCVD状态。
 
- SYN_RCVD
 等待客户的ACK。- 接收ACK,进入ESTABLISHED状态。
 
- ESTABLISHED
 数据传输状态。- 接受客户close发送的FIN,并应答ACK,进入CLOSE_WAIT状态。
 
- CLOSE_WAIT
 准备调用close。- 调用close,发送FIN到客户端,进入LAST_ACK状态。
 
- LAST_ACK
 等待客户端的ACK。- 接收客户端的ACK,回到CLOSED状态。
 
关于TIME_WAIT状态存在的原因
- 实现TCP全双工连接的终止。当客户主动中断连接时,根据TCP协议,客户必须接收服务器的FIN信息并给予ACK应答。因此客户需要维护状态信息,以便能回复ACK。如果过程中ACK丢失,它必须能够重传,否则将会产生错误。而处于TIME_WAIT状态没有关闭可以实现。 
- 允许老的重复分节在网络中消失。如果一个TCP连接关闭,过了一会又在相同的IP和端口建立新的连接。TCP需要防止之前连接没有传完的数据在新的连接出现。而如果连接处于TIME_WAIT状态,就不会给这个相同IP和端口建立新的连接。之前没有传完的数据将会在TIME_WAIT结束前在网络中消失,因为TIME_WAIT的持续时间是数据的生存时间MSL的两倍。 
参考:
http://blog.csdn.net/xvjixiang/article/details/26811717
http://www.cnblogs.com/lenolix/articles/3762575.html
TCP的状态转移的更多相关文章
- 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移
		目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ... 
- 读懂TCP状态转移
		读懂TCP状态转移过程,对理解网络编程颇有帮助,本文将对TCP状态转移过程进行介绍,但各状态(总共11个)含义不在本文介绍的范围,请参考文末的书目列表. TCP状态转换图(state transiti ... 
- TCP端口状态说明ESTABLISHED、TIME_WAIT
		TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理 ... 
- TCP端口状态LISTENING ESTABLISHED CLOSE_WAIT TIME_WAIT SYN_SENT
		TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理 ... 
- Rest(表述性状态转移)
		本文的主要内容有: 1.了解Rest 2.了解RESTful WebService 3.使用SpringMvc实现RESTful ------------------------------我是华丽的 ... 
- 查看 Apache并发请求数及其TCP连接状态
		查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ... 
- 查看 并发请求数及其TCP连接状态【转】
		服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ... 
- 【分布式协调器】Paxos的工程实现-Cocklebur状态转移
		集群中的主机经过选举过程由Looking状态变为了Leadering或Following状态.而这些状态之间转移的条件是什么呢?先来个直观的,上状态图. 图 4.1 Cocklebur选举过程中的状态 ... 
- 动手学习TCP:TCP特殊状态
		前面两篇文章介绍了TCP状态变迁,以及通过实验演示了客户端和服务端的正常状态变迁. 下面就来看看TCP状态变迁过程中的几个特殊状态. SYN_RCVD 在TCP连接建立的过程中,当服务端接收到[SYN ... 
随机推荐
- spring 之 init-method & InitializingBean
			init-method 是bean (第一次)实例化的时候被调用的. 先看个异常: INFO: Overriding bean definition ; dependencyCheck=; aut ... 
- Http协议基础知识
			r equest POST https://re.csdn.net/csdnbi HTTP/1.1方法 url/uri 协议的版本号 1.1Host: re.csdn.netConnection: k ... 
- Python linux 上的管理工具 pyenv 安装, pip 使用,  python项目(版本分割, 项目分割, 虚拟环境创建)
			01: 假设你有一个最小环境安装的 centos-6.x 的linux操作系统 02: 安装 git => yum -y install git 03: 安装依赖 => yum -y in ... 
- 用代码检查Windows程序的位数
			方法就是通过读取程序文件的头部来判断,具体代码如下: #include <stdio.h> #include <windows.h> int CrnGetImageFileMa ... 
- 为什么我希望用C而不是C++来实现ZeroMQ
			原文在这里 开始前我要先做个澄清:这篇文章同Linus Torvalds这种死忠C程序员吐槽C++的观点是不同的.在我的整个职业生涯里我都在使用C++,而且现在C++依然是我做大多数项目时的首选编程语 ... 
- WDA-2-事件执行先后
			WebDynpro 中事件执行顺序 一:WebDynpro 启动时的 hokeMethod 执行顺序 (这里观察一个 view)从上至下,依次进行 如果这个 view 上还有一个 button(能触发 ... 
- Leetcode 题解  Combinations:回溯+求排列组合
			罗列出从n中取k个数的组合数组. 首先,求C(n,k)这个实现,很粗糙,溢出也不考虑,好的方法也不考虑.笨蛋.心乱,上来就写.. 另外,发现在递归中,不能申请太大的数组?貌似不是这个问题,是我自己越界 ... 
- pod install vs pod update
			Podfile文件,Podfile.lock文件 Podfile文件:指定依赖库的版本规则 Podfile.lock文件:记录当前工程中使用的依赖库的版本号 pod install会去安装podfil ... 
- spark  Kryo serialization failed: Buffer overflow 错误
			今天在写spark任务的时候遇到这么一个错误,我的spark版本是1.5.1. Exception in thread "main" com.esotericsoftware.kr ... 
- C# 2018.9.17
			C#的优点:1,不会有运行时崩溃,解决了C++的痛点一,难预防,难查错2,使用文件不需要包含进来,只需要using namespace即可,解决了C++的痛点二,包含复杂,路径复杂,编译复杂3,编译速 ... 
