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 ...
随机推荐
- vmware使用vsphere的镜像
vsphere镜像导出后可以使用vmware station打开, vsphere镜像导出时需要关机,否则会提示失败,有文件不能导出.
- pm2操作总结
PM2是一个node.js的进程管理器,(并且呢在应用程序的生产运行时自带负载均衡的这种操作,很厉害): --> pm2主要解决的问题是kill node进程时无法正常停止的问题. 主要特征: ...
- linux驱动开发第一步hello
先查看Ubuntu的版本 cat /etc/issue lin@lin-virtual-machine:~$ cat /etc/issue Ubuntu 12.04 LTS \n \l 或者使用 li ...
- Vue.js——60分钟组件快速入门(下篇)
转自:https://www.cnblogs.com/keepfool/p/5637834.html 概述 上一篇我们重点介绍了组件的创建.注册和使用,熟练这几个步骤将有助于深入组件的开发.另外,在子 ...
- 深度学习原理与框架-Tensorflow基本操作-变量常用操作 1.tf.random_normal(生成正态分布随机数) 2.tf.random_shuffle(进行洗牌操作) 3. tf.assign(赋值操作) 4.tf.convert_to_tensor(转换为tensor类型) 5.tf.add(相加操作) tf.divide(相乘操作) 6.tf.placeholder(输入数据占位
1. 使用tf.random_normal([2, 3], mean=-1, stddev=4) 创建一个正态分布的随机数 参数说明:[2, 3]表示随机数的维度,mean表示平均值,stddev表示 ...
- 机器学习进阶-案例实战-答题卡识别判 1.cv2.getPerspectiveTransform(获得投射变化后的H矩阵) 2.cv2.warpPerspective(H获得变化后的图像) 3.cv2.approxPolyDP(近似轮廓) 4.cv2.threshold(二值变化) 7.cv2.countNonezeros(非零像素点个数)6.cv2.bitwise_and(与判断)
1.H = cv2.getPerspectiveTransform(rect, transform_axes) 获得投射变化后的H矩阵 参数说明:rect表示原始的位置左上,右上,右下,左下, tra ...
- day40-socket编程
一.socket介绍 看socket之前,先来回顾一下五层通讯流程: 但实际上从传输层开始以及以下,都是操作系统帮咱们完成的 Socket又称为套接字,它是应用层与TCP/IP协议族通信的中间软件抽象 ...
- git学习入门
git: 安装 git是目前最流行的版本管理系统,分为github(公共开源,代码可随意下载)和gitlib(私有化,企业使用).
- Oracle函数使用
数据格式化截取: Trunc(data,[yyyy]) oracle的特有if判断: decode(sex, 0, '男', 1, '女') 分组排序:row_number() over(parti ...
- APP-5-百度电子围栏
1.代码部分 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <me ...