TCP状态转换图详解
以下对几个关键的中间状态进行说明:
三次握手:
LISTEN:表示服务器的某个SOCKET处于监听状态,可以进行连接了。
SYN_SENT:表示客户端的某个SOCKET与服务器进行connect时,首先发送SYN报文,然后进入SYN_SENT状态,等待服务器发送ACK+SYN报文。
SYN_RECV:表示服务器收到客户端发送的SYN报文,然后向客户端发送SYN+ACK报文,随后服务器进入SYN_RECV状态。
ESTABLISHED:表示连接已经建立,当客户端在SYN_SENT状态时,收到服务器发送的ACK+SYN报文之后,然后进行第三次握手,客户端发送ACK报文,然后进入ESTABLISHED状态,当处于SYN_RECV状态的服务器收到客户端发送的ACK报文之后,也进入ESTABLISHED状态,然后连接建立。
四次挥手:
FIN_WAIT_1:表示客户端SOCKET想主动关闭连接,于是向服务器发送FIN报文,然后进入FIN_WAIT_1状态。
FIN_WAIT_2:表示客户端收到服务器发来的ACK报文,此时客户端进入FIN_WAIT_2状态,此时客户端这边的连接已经关闭,但服务器端的连接还没关闭,也就是服务器还可以继续向客户端发送数据。
CLOSING:这种状态表示此时双方刚好可能都在关闭连接,即客户端向服务器发送FIN报文,进入FIN_WAIT_1状态后,没有收到服务器发来的ACK报文,反而受到服务器发来的FIN报文,说明此时客户端和服务器同时发起关闭连接,随后,客户端进入CLOSING状态。
TIME_WAIT:表示收到了服务器发来的FIN报文,然后客户端发送ACK报文,随后进入TIME_WAIT状态,等待2MSL之后进入CLOSED状态。
CLOSE_WAIT:表示当服务器收到客户端发来的FIN报文之后,发送ACK报文,随后服务器进入CLOSE_WAIT状态。
LAST_ACK:表示服务器主动关闭连接,向客户端发送FIN报文后,随即进入LAST_ACK状态,如果收到了客户端发来的ACK报文之后,就进入CLOSED状态。
需要解释的是为何TIME_WAIT需要等2MSL时间才能回到CLOSED状态:
如果网络不可靠,那么就无法保证最后客户端发送的ACK报文服务器端一定能够收到,因此处于LAST_ACK状态的服务器可能会因为超时而未收到ACK报文,而重新向客户端发送FIN报文,TIME_WAIT的作用就是用来客户端重新发送可能丢失的ACK报文。
TCP状态转换图详解的更多相关文章
- TCP的三次握手以及TCP状态转换图详解
今天来讨论一下TCP的三次握手以及TCP的状态转换图.首先发一个三次握手的流程图如下: 圖 2.4-3.三向交握之封包连接模式A:封包发起当用戶端想要对服务器端发起连接时,就必須要送出一個要求连线的封 ...
- 【转载】TCP /IP协议详解
首先,TCP/IP不是一个协议,而是一个协议族的统称. 里面包括了IP协议,IMCP协议,TCP协议,以及http.ftp.pop3协议等等. TCP/IP协议分层 提到协议分层,我们很容易联想到IS ...
- TCP、UDP详解与抓包工具使用
参考:https://www.cnblogs.com/HPAHPA/p/7737641.html TCP.UDP详解 1.传输层存在的必要性 由于网络层的分组传输是不可靠的,无法了解数据到达终点的时间 ...
- 转。http,状态码详解
转自konglingbinHTTP状态码详解:https://www.cnblogs.com/klb561/p/9205867.html HTTP状态码(HTTP Status Code)是用以表示网 ...
- TCP /IP协议详解【转】
转自:https://www.jianshu.com/p/0cf648510bce?utm_campaign=maleskine&utm_content=note&utm_medium ...
- HTTP协议 (六) 状态码详解
HTTP协议 (六) 状态码详解 HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果 ...
- TCP/IP协议详解概述
TCP/IP协议详解卷1--第一章概述--读书笔记 作者:vpoet 日期:2015/06/25 注:本系列的文章只是作者对TCP/IP协议的理解,难免会出现纰漏或者不完整,当然也有可能很肤浅,希望大 ...
- 传输控制协议(TCP) -- TCP状态转换图
TCP状态转换图 在<UNIX网络编程 卷1>一书中,作者给出了TCP状态转换图(如下).本文也将围绕此图进行阐释. 注:上图红框表示比较特殊的地方. TCP状态转换两条主线 图2-4中的 ...
- js基础--浏览器标签页隐藏或显示状态 visibility详解
欢迎访问我的个人博客:http://www.xiaolongwu.cn 前言 在工作中我们可能会遇到这样的需求,当浏览器切换到别的标签页或着最小化时,我们需要暂停页面上正在播放的视频或者音乐,这个需求 ...
随机推荐
- TS初探
简介 TypeScript具有类型系统,且是JavaScript的超集.它可以编译成普通的JavaScript代码. TypeScript支持任意浏览器,任意环境,任意系统并且是开源的.Ts主要用于解 ...
- C#关于new的用法
1.运算符就是在实例化一个类的时候(运算符的用法) A a=new A(); 2.new 约束指定泛型类声明中的任何类型参数都必须有公共无参数构造函数.当泛型类创建类型的新实例时,将此约束应用于类型参 ...
- linux下动态链接库解决方案(一)
1.c++无法直接调用用c写的动态链接库,如果调用的话可能需要用到一些交叉编译的知识: 2.在c++写的动态链接库无法被调用成功的反思: 在linux下,通常都是使用g++编译器("g++ ...
- 打开VS2012的创建单元测试功能
在VS2010中,在类中点击右键,有一个创建创建单元测试命令,可以很方便的生成单元测试项目和代码.但不知道为什么VS2012反而没有这个功能. 网上搜了一下,好在这个功能是可以通过配置打来的. 传送门 ...
- 转载jQuery图片放大插件[twiPicZoom]
转载http://xuzhihong1987.blog.163.com/blog/static/26731587201312821725913/ 功能说明: 双击查看大图,鼠标滚动放大缩小,能够切换到 ...
- [Android Pro] Dangerous permissions and permission groups.
Permission Group Permissions CALENDAR READ_CALENDAR WRITE_CALENDAR CAMERA CAMERA CONTACTS READ_CONTA ...
- express响应前端ajax请求
后端其实并不需要知道前端发起的请求是不是ajax,后端只需要响应请求即可.例子: 前端这样写: $('button').on('click', function(event) { event.prev ...
- SQL Server多表多列更新
student表: lag表: 要求将student表stu_id列为1的stu_nick列和stu_phont列的数据更新为lag表的lag_nick列和lag_phone列. SQL语句: upd ...
- MVC4过滤器
MVC4提供的四种基本类型过滤器接口,IAuthorizationFilter.IActionFilter.IResultFilter和IExceptionFilter,可通过继承对应的接口和Filt ...
- Swift - enumerateObjectsUsingBlock的用法
enumerateobjectsusingblock:不是Array的方法在NSArray使用.如果你想使用它,你需要一个实例NSArray而不是Array. import Foundation va ...