首先看一张图片:

虚线表示服务端的状态转移,实现表示客户端的状态转移。

初始的close状态并不是真是的状态,只是为了方便描述开始和终止状态而构造出来的。

从服务端的状态转移开始说:

服务端打开后处于listen状态,等待客户端的连接请求。当服务端收到客户端发来的SYN时,服务端回复SYN和ACK进入SYNRECEIVE状态,这里对应三次握手的第一次和第二次,即 客户端发送请求,服务端回复ACK并发送SYN。服务端再次受到ACK时,服务端认为连接已经建立,进入ESTABLISHED状态。服务端收到FIN时,表明客户端要关闭连接,这时服务端进入CLOSE_WAIT状态,此时,服务端不再接收数据,但是可以继续发生数据,当服务端的数据发送完成后,服务端发送FIN,进入LASK_ACK状态,在LASK_ACK状态下,收到客户端发来的针对FIN的ACK后,服务端关闭连接,进入CLOSE状态。

客户端的状态转移:

客户端发送SYN进入SYNSNED 状态,当收到服务端发来的SYN和ACK后,发送ACK, 这里是三次握手中,第三次的过程。客户端发送完ACK进入连接建立状态ESTABLISHED。客户端发送FIN主动关闭连接,进入FIN_WAIT_1,在这个状态下,服务可能回复:

1.ACK(表明服务端还要继续发送数据), 此时,客户端进入FIN_WAIT_2状态,等待服务端关闭连接。

2.或者收到FIN(服务端刚好也要关闭连接),此时,客户端发送ACK,并进入CLOSING状态,等待接收之前发送FIN 对应的ACK。

3.或者收到FIN+ACK(服务端收到关闭连接请求同时也发生关闭连接),此时,客户端发送ACK,进入TIME_WAIT状态。

对于1和2情况,当收到服务端发来的FIN回复ACK(1的情况)或收到ACK(2的情况)后,客户端进入TIME_WAIT状态。

TIME_WAIT 状态是在服务端发送FIN后,客户回复ACK后,客户端需要等待2MSL时间,此时若是客户端回复的ACK因为网络的原因,服务端没有收到,服务端要重发FIN,客户端此时处于TIME_WAIT状态,可以继续发送ACK。 总体来说TIME_WAIT状态时为了保证最后一个ACK因丢失,而等待重发的时间。

上面的解释 仅仅是正常状态的变迁。(粗实线和粗的虚线) 当SYNRECEIVE状态是由LISTEN状态进入时,(收到RST)才能变迁至LISTEN状态。

~~~~~

tcp 状态转移图详解的更多相关文章

  1. TCP/IP详解学习笔记

    TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议, ...

  2. TCP/IP详解 (转)

    TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣经中 ...

  3. 『TCP/IP详解——卷一:协议』读书笔记——10

    2013-08-22 22:57:17 3.8 ifconfig命令 这个命令在Linux系统下可以通过下面的指令阅读说明文档: ifconfig 由于书中作者用的系统比较早的某Unix系统,所以我的 ...

  4. 《TCP/IP详解卷1:协议》第1章 概述-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

  5. TCP/IP详解

    第一篇 TCPIP协议详解 第1章 TCPIP协议族 第2章 IP协议详解 第3章 TCP协议详解 第4章 TCP/IP通信案例:访问Internet上的Web服务器 一.TCP/IP协议族 TCP/ ...

  6. TCP/IP详解--发送ACK和RST的场景

    在有以下几种情景,TCP会把ack包发出去: 1.收到1个包,启动200ms定时器,等到200ms的定时器到点了(第二个包没来),于是对这个包的确认ack被发送.这叫做“延迟发送”: 2.收到1个包, ...

  7. TCP/IP详解--连接状态变迁图CLOSE_WAIT

    终止一个连接要经过4次握手.这由TCP的半关闭(half-close)造成的.既然一个TCP连接是全双工(即数据在两个方向上能同时传递,可理解为两个方向相反的独立通道),因此每个方向必须单独地进行关闭 ...

  8. TCP IP详解(转)

    大学学习网络基础的时候老师讲过,网络由下往上分为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 网络七层协议简称OSI.TCP/IP刨除了物理层,并把上三层(会话层.表示层和应用层)统称 ...

  9. 《TCP/IP详解卷1:协议》第2章 链路层-读书笔记

    章节回顾: <TCP/IP详解卷1:协议>第1章 概述-读书笔记 <TCP/IP详解卷1:协议>第2章 链路层-读书笔记 <TCP/IP详解卷1:协议>第3章 IP ...

随机推荐

  1. [BZOJ 2957]楼房重建(THU2013集训)(线段树维护单调栈)

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2957 分析: 根据题意,就是比较斜率大小 只看一段区间的话,那么这段区间能看见的楼房数量就是这 ...

  2. 分享最新申请IDP账号的过程,包含duns申请的分享(2013年6月)

    5月份接到公司要申请开发者账号的任务,就一直在各个论坛找申请的流程,但都是一些09年10年的比较旧的流程,现在都已经不适用了,好不容易找到2012年分享的流程吧,才发现申请过程中少了DUNS编码的步骤 ...

  3. linux-启动脚本-souce与sh

    source:        在当前shell程序中执行,  因此当前shell程序中的变量和环境变量,均可见.   执行的脚本,能更新到当前shell程序. sh:            开启一个新 ...

  4. ssh-agent

    ssh-agent是一种控制用来保存公钥身份验证所使用的私钥的程序. ssh-agent是一个密钥管理器,运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管,其他程序需要身 ...

  5. 【微信】微信小程序 调用this.setData报错this.setData is not a function;

    在调用方法过程中 报错如下: 代码如下: Page({ /** * 页面的初始数据 */ data: { userLocalInfo:'用户地址' }, /** * 返回swapping页面 */ b ...

  6. hdoj 1159最长公共子序列

     /*Common Subsequence A subsequence of a given sequence is the given sequence with some elements ( ...

  7. Console-算法:fun1(do while)

    ylbtech-Arithmetic:Console-算法[do while]-XX   1.A,Demo(案例) 1.B,Solution(解决方案) using System; namespace ...

  8. oracle数据库中函数和存储过程中的区别

    一.函数必须有返回值,过程没有返回值: 二.函数可以单独执行,过程必须通过execute执行: 三.函数可以嵌入SQL中执行,过程不能. 可以将比较复杂的查询写成函数,然后在过程中调用.

  9. 创建es索引{"acknowledged"=>true, "shards_acknowledged"=>false}

    创建es索引{"acknowledged"=>true, "shards_acknowledged"=>false} [2018-05-19T13: ...

  10. sql习题练习

    表结构: create database MyCompany go use MyCompany go create table Departments ( Department_ID ,) prima ...