状态转移图

状态分析

客户端

  • CLOSED
    初始状态

    1. 调用connect将发起主动打开,发送SYN J到服务端,进入SYN_SENT状态。
  • SYN_SENT
    客户端已经发送SYN报文

    1. 接收到服务端发回的ACK J+1,以及SYN K,并且发回ACK K+1进入ESTABLISHED状态.此时表明连已经建立了。
    2. 主动调用close或者超时将回到CLOSED状态。
  • ESTABLISHED
    连接已经建立,可以进行数据传输

    1. 主动调用close,发送FIN到服务端,进入FIN_WAIT_1状态。
  • FIN_WAIT_1
    主动调用了close,发送FIN到服务端,等待服务端应答。

    1. 接收服务端应答的ACK,进入FIN_WAIT_2状态。
    2. 接收到服务端调用close发来的SYN,ACK并回反ACK进入TIME_WAIT状态。
    3. 接受到了服务端发来的FIN,并应答ACK,进入CLOSING状态。这种状态比较少见,一般只有双方同时close时才有可能出现。
  • FIN_WAIT_2
    等待服务端close。

    1. 接收服务端FIN,应答ACK,进入TIME_WAIT状态。
  • CLOSING
    应答了服务端的FIN,等待服务端的应答。

    1. 接收服务端的ACK,进入TIME_WAIT状态。
  • TIME_WAIT
    1. 等待2MSL后,回到CLOSED状态。

服务端

  • CLOSED
    初始状态

    1. 调用accept进入监听状态。
  • LISTEN
    监听状态,等待客户的连接。

    1. 接收SYN,发送ACK,以及SYN,进入SYN_RCVD状态。
  • SYN_RCVD
    等待客户的ACK。

    1. 接收ACK,进入ESTABLISHED状态。
  • ESTABLISHED
    数据传输状态。

    1. 接受客户close发送的FIN,并应答ACK,进入CLOSE_WAIT状态。
  • CLOSE_WAIT
    准备调用close。

    1. 调用close,发送FIN到客户端,进入LAST_ACK状态。
  • LAST_ACK
    等待客户端的ACK。

    1. 接收客户端的ACK,回到CLOSED状态。

关于TIME_WAIT状态存在的原因

  1. 实现TCP全双工连接的终止。当客户主动中断连接时,根据TCP协议,客户必须接收服务器的FIN信息并给予ACK应答。因此客户需要维护状态信息,以便能回复ACK。如果过程中ACK丢失,它必须能够重传,否则将会产生错误。而处于TIME_WAIT状态没有关闭可以实现。

  2. 允许老的重复分节在网络中消失。如果一个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的状态转移的更多相关文章

  1. 使用 tcpdump 抓包分析 TCP 三次握手、四次挥手与 TCP 状态转移

    目录 文章目录 目录 前文列表 TCP 协议 图示三次握手与四次挥手 抓包结果 抓包分析 TCP 三次握手 数据传输 四次挥手 TCP 端口状态转移 状态转移 前文列表 <常用 tcpdump ...

  2. 读懂TCP状态转移

    读懂TCP状态转移过程,对理解网络编程颇有帮助,本文将对TCP状态转移过程进行介绍,但各状态(总共11个)含义不在本文介绍的范围,请参考文末的书目列表. TCP状态转换图(state transiti ...

  3. TCP端口状态说明ESTABLISHED、TIME_WAIT

    TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理 ...

  4. TCP端口状态LISTENING ESTABLISHED CLOSE_WAIT TIME_WAIT SYN_SENT

    TCP状态转移要点 TCP协议规定,对于已经建立的连接,网络双方要进行四次握手才能成功断开连接,如果缺少了其中某个步骤,将会使连接处于假死状态,连接本身占用的资源不 会被释放.网络服务器程序要同时管理 ...

  5. Rest(表述性状态转移)

    本文的主要内容有: 1.了解Rest 2.了解RESTful WebService 3.使用SpringMvc实现RESTful ------------------------------我是华丽的 ...

  6. 查看 Apache并发请求数及其TCP连接状态

    查看 Apache并发请求数及其TCP连接状态 (2011-06-27 15:08:36) 服务器上的一些统计数据: 1)统计80端口连接数 netstat -nat|grep -i "80 ...

  7. 查看 并发请求数及其TCP连接状态【转】

    服务器上的一些统计数据: 1)统计80端口连接数netstat -nat|grep -i "80"|wc -l 2)统计httpd协议连接数ps -ef|grep httpd|wc ...

  8. 【分布式协调器】Paxos的工程实现-Cocklebur状态转移

    集群中的主机经过选举过程由Looking状态变为了Leadering或Following状态.而这些状态之间转移的条件是什么呢?先来个直观的,上状态图. 图 4.1 Cocklebur选举过程中的状态 ...

  9. 动手学习TCP:TCP特殊状态

    前面两篇文章介绍了TCP状态变迁,以及通过实验演示了客户端和服务端的正常状态变迁. 下面就来看看TCP状态变迁过程中的几个特殊状态. SYN_RCVD 在TCP连接建立的过程中,当服务端接收到[SYN ...

随机推荐

  1. Implement a deployment tool such as Ansible, Chef, Puppet, or Salt to automate deployment and management of the production environment

    Implement a deployment tool such as Ansible, Chef, Puppet, or Salt to automate deployment and manage ...

  2. python中的pop

    pop()将列表指定位置的元素移除,同时可以将移除的元素赋值给某个变量,不填写位置参数则默认删除最后一位 pop()根据键将字典中指定的键值对删除,同时可以将删除的值赋值给变量 举个例子: 1 a = ...

  3. 如何在github上创建仓库,并将本地的文件上传到对应的远程仓库

    1.安装git,可从 http://www.bootcss.com/p/git-guide/下载git 2.在github上创建仓库,注意不勾选Initialize this repository w ...

  4. C#用log4net记录日志

    1.首先安装 log4net. 2.新建 log4net.config 文件,右键-属性 “复制到输出目录”设置为“始终复制” 3.设置 log4net.config 配置文件 <?xml ve ...

  5. Appium-We wanted {"required":["value"]} and you sent ["text","sessionId","id","value"]

    APK 链接:https://pan.baidu.com/s/17oeTM1qA0QjPBqLh6pS0Yg 提取码:s9ru # coding:utf-8from appium import web ...

  6. uiautomator:Error while obtaining UI hierarchy XML file: com.android.ddmlib.SyncException: Remote object doesn't exist!

    尝试用android sdk的uiautomatorviewer抓元素的时候报错:Error while obtaining UI hierarchy XML file: com.android.dd ...

  7. Navicat for MySQL 安装和破解(完美)

    Navicat for MySQL 安装软件和破解补丁: 链接:https://pan.baidu.com/s/1oKcErok_Ijm0CY9UjNMrnA   密码:4xb1 navicat fo ...

  8. opencv给图片添加文字水印<转>

    其中有一些改动为了文字大小等还有一些图片的尺寸,真正使用的时候可以把尺寸的屏蔽掉 头文件: //==================================================== ...

  9. 尚硅谷springboot学习19-日志切换

    查看相关依赖关系,排除相关依赖,引入新的日志依赖 slf4j+log4j的方式: <dependency> <groupId>org.springframework.boot& ...

  10. Spring/SpringBoot定义统一异常错误码返回

    配置 大致说下流程, 首先我们自定义一个自己的异常类CustomException,继承RuntimeException.再写一个异常管理类ExceptionManager,用来抛出自定义的异常. 然 ...