TCP状态转换(图解+文字解说)
《深入分析 javaweb 技术内幕》P38 读书扩展
作者:淮左白衣
写于2018年4月12日20:58:36
目录
听了刘德华的《17岁》,华仔在中间喊话:还记不记得我17岁的时候你们多少岁啊?是不是和我一样都是17岁啊?亦是当时只是小孩子啊?莫名哀伤时间流逝
17岁的华仔,那时刚出道!想想我的17岁,青春既没开花,也没喂狗,只是平淡的流走了!没有人永远17岁,但是永远有人17岁!
TCP状态转换图解
TCP的一次通信,分为建立连接(三次握手)、关闭连接(四次挥手);
图解三次握手
实线代表服务器 的状态转换、虚线代表客户端 的转态转换;
文字讲解三次握手:
- 最开始客户端和服务器,都处于
CLOSED
状态,二者之间没有任何联系; - 客户端向服务器发起连接请求,具体操作是发送一个 SYN 给服务器,客户端状态转而变为
SYN-SENT
,这是第一次握手 ; - 由于客户端向服务器发送请求了,服务器被动的进入
LISTEN
状态; - 如果服务器没有想要客户端的请求,则客户端得不到服务器的回应,请求就会超时,一旦请求超时,客户端的状态,就会再次进入
CLOSED
; - 如果服务器响应了这个请求,具体操作是:接收到了客户端发送的 SYN,同时向客户端发送回应 SYN+ACK,表示我收到你的请求了;然后服务器的状态,进入
SYN-RECEIVED
; 这是第二次握手 ; - 客户端收到服务器的回应 SYN+ACK,然后再次向服务器发送一个 ACK,表示我收到你的回应了 ;客户端的状态进入
ESTABLISHED
;这是第三次握手 ; - 服务器收到客户端的响应 ACK 以后,状态进入
ESTABLISHED
; - 至此,三次握手完成,客户端与服务器建立了可靠的连接,可以进行数据传输了 ;
上面有个特殊的地方:
假如客户端发送请求报文SYN的时候,服务器也发送了请求报文SYN ,则客户端进入 SYN-RECEIVED
状态,角色变为服务器; 一般这种情况是,没有绝对的客户端、服务器;通信的两台机器,可以在客户端和服务器之间进行角色的切换 ;
图解四次挥手
实线代表主动关闭方 的状态转换、虚线代表被动关闭方 的转态转换;
文字讲解四次挥手:
- 主动关闭方,发送 FIN 给被动关闭方,然后进入
FIN-WAIT-1
状态 ; - 被动关闭方,收到主动关闭方的 FIN,会送一个回应 ACK 给主动发送方,然后进入
CLOSE-WAIT
; - 主动方收到被动方回应的ACK,并且也回应一个ACK,然后进入
FIN-WAIT-2
; - 既然主动方要关闭连接,那么被动方也不能死皮赖脸的不关啊,它也就向主动方发送一个请求FIN,然后进入
LAST-ACK
; - 被动方收到主动方的回应ACK,进入
CLOSED
主动方收到被动方发送的 FIN 之后,发送回应 ACK(主动方在接收到被动方发送的FIN,将不再接受任何信息,但是可以发送信息),进入
TIME-WAIT
上面是有一方先于对方,发起关闭请求 ,下面说下,双方同时发起关闭请求的情况;
当双方同时发起关闭请求的时候,双方在发送完FIN 以后,都进入
FIN-WAIT-1
状态;然后如果双发又同时收到对方的FIN,以及同时收到对方回应的ACK,则直接进入TIME-WAIT
;
如果双方同时收到FIN,但是没有同时收到ACK,则先进入CLOSING
,然后,在双方都收到 ACK 以后,再进入TIME-WAIT
;
为什么在进入 TIME-WAIT
的状态以后,会等待 2MSL 的时间,再进入 CLOSED
?
MSL 翻译为:报文最大生存时间 ;,2MSL则是两个报文最大生存世时间,等待这个时间的原因:是因为在网络不好的时候,有时候,需要重新发送报文,因此进入这里的等待下 ;
TCP状态转换(图解+文字解说)的更多相关文章
- TCP状态转换
最近笔试遇到一个题目:如果tcp建立连接时第三次握手失败,tcp会做何操作?该问题的本质是判断我们对tcp的状态转换是否能有比较深刻的理解.只要理解了下面的状态转换图,很容易回答上述问题. 在此,将& ...
- 《UNP》学习之TCP状态转换
CLOSED:TCP起始状态 LISTEN:绑定端口后进入listen状态,一般是服务端 SYN_SENT:发送SYN连接请求,主动打开连接的一方进入SYN_SENT SYN_RCVD:接收到SYN连 ...
- TCP 连接建立和断开,以及状态转换
1. TCP报文结构 TCP是一种可靠.面向连接.全双工的传输层协议,其报文格式如下所示: 源端口.目的端口:16位长.标识出远端和本地的端口号. 顺序号:32位长.表明了发送的数据 ...
- TCP的状态转换
TCP的状态转换图 手写的状态转换图 一.服务端状态变迁: 服务端创建套接字之后调用listen函数将套接字有一个未连接的主动套接字转换为被动套接字,指示内核应接受指向该套接字的连接请求,套接字状态 ...
- java 22 - 18 多线程之 线程的状态转换、线程组
线程的状态转换图解:图片 线程的线程组: 线程组: 把多个线程组合到一起. 它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制. 首先创建一个Runnable的实现类 publi ...
- 传输控制协议(TCP) -- TCP状态转换图
TCP状态转换图 在<UNIX网络编程 卷1>一书中,作者给出了TCP状态转换图(如下).本文也将围绕此图进行阐释. 注:上图红框表示比较特殊的地方. TCP状态转换两条主线 图2-4中的 ...
- TCP状态转换图解析
本文参考Unix网络编程卷1,对TCP状态转换进行总结,方便掌握TCP链接中各个状态及故障分析. 1.Linux下TCP相关工具 基于Linux系统查看网络状态,首先了解几个基本查看指令. Linux ...
- TCP状态知识总结(图解)
tcp状态: LISTEN:侦听来自远方的TCP端口的连接请求 SYN-SENT:再发送连接请求后等待匹配的连接请求 SYN-RECEIVED:再收到和发送一个连接请求后等待对方对连接请求的确认 ...
- TCP连接建立与终止,及状态转换
TCP连接建立 三路握手 三路握手发生在客户端发起connect请求到服务端accept返回中,在三路握手发生前,服务端必须准备好接受外来连接,这通常通过服务端调用 (socket.bind.list ...
随机推荐
- TCP四次握手断开连接
建立连接非常重要,它是数据正确传输的前提:断开连接同样重要,它让计算机释放不再使用的资源.如果连接不能正常断开,不仅会造成数据传输错误,还会导致套接字不能关闭,持续占用资源,如果并发量高,服务器压力堪 ...
- XFTP 乱码
- OpenFOAM动网格技术介绍【转载】
转载自:http://blog.sina.com.cn/s/blog_e256415d0101nfhp.html Chalmers大学的Andreu Oliver González对OpenFOAM中 ...
- Vue源码分析(一) : new Vue() 做了什么
Vue源码分析(一) : new Vue() 做了什么 author: @TiffanysBear 在了解new Vue做了什么之前,我们先对Vue源码做一些基础的了解,如果你已经对基础的源码目录设计 ...
- 常见的可以写入VIM配置文件中的设置参数
常见的可以写入.vimrc文件中的设置参数 设置参数 含义 :set nu :set nonu 设置与取消行号 :syn on :syn off 是否依据语法显示相关的颜色帮助,在VIM修改相关的配置 ...
- Vrms、Vpk、W、dBm、dBW、dBuV、dBm/Hz
负载阻抗Z 在做这些单位转换前第一个需要提到的就是负载阻抗(Z, Ohm),我们在测试测量中说某个量为上面的某一个单位时候,都包含了一个前提条件,那就是负载阻抗,离开了负载阻抗你说的这些总带有一丝耍流 ...
- struct2json -- C结构体与 JSON 快速互转库V1.0发布
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/zhutianlong/article/d ...
- jmeter分布式遇到的问题记录
遇到的问题记录: 问题一: 配置好执行机和调度机后,调度机跑执行机器出现下面的报错 java.io.FileNotFoundException:rmi_keystore.jks(系统找不到指定的文件) ...
- using kafkacat reset kafka offset
1. install kafkacat Ubuntu apt-get install kafkacat CentOS install deepenency yum install librdkafka ...
- Python中列表,元组,字典,集合的区别
参考文档https://blog.csdn.net/Yeoman92/article/details/56289287 理解Python中列表,元组,字典,集合的区别 列表,元组,字典,集合的区别是p ...