TCPIP状态转换详解

news/2024/5/17 16:16:50 标签: TCP, TIME_WAIT, SYN_RECV

TCP_0">1.TCP的三次握手和四次挥手

在这里插入图片描述

TCP_3">1.1.TCP三次握手(建立通道)

<1>LISTEN

​ 服务端经过 socket,bind,listen 函数之后进入此状态,开始进入监听状态;

<2> SYN_SENT

​ 第一次握手,客户端调用 connect,发送 SYN报文给服务器端。若服务端不能连接,则直接进入初始的CLOSED状态;

<3> SYN_RCVD

​ 第二次握手,服务端接收到客户端的SYN报文,服务端由 LISTEN 进入 SYN_RCVD状态,同时回应一个SYN+ACK报文给客户端;

<4> ESTABLISHED

​ 第三次握手,客户端接收到服务端的SYN+ACK报文后,回应一个 ACK报文后,客户端进入 ESTABLISHED 状态,表明客户端已经准备好;服务端收到客户端的 ACK报文 之后会从 SYN_RCVD 状态转移到 ESTABLISHED 状态,表明服务端已经准备好;

​ 注意:TCP需要两端都准备好才可以进行数据传输,所以ESTABLISHED也可以说是一个数据传送状态;

TCP_23">1.2.TCP四次挥手(断开通道)

<1>FIN_WAIT_1

​ 第一次挥手,主动关闭方(既可是客户端,也可是服务端)终止连接时,调用 close() 发送 FIN报文给对方,然后等待对方返回 ACK;

<2>CLOSE_WAIT

​ 接收到FIN报文后,被动关闭的一方进入此状态,接收到FIN,同时发送 ACK;

TCP关闭是全双工过程,这里主动关闭方执行了关闭,被动方也需要调用close() 关闭,CLOSE_WAIT就是处于这个状态,等待发送 FIN,发送了FIN被动方进入 LAST_ACK 状态;

<3>FIN_WAIT_2

​ 主动关闭方先发送FIN,然后接收到被动方返回的 ACK 后进入此状态;

<4>LAST_ACK

​ 被动方发起关闭请求(发送 FIN),进入此状态。当接收到主动关闭方回应的ACK 时进入CLOSED状态;

<5>CLOSING

​ 两边同时发起关闭请求时,会由FIN_WAIT_1 进入此状态,等待返回ACK;

<6>TIME_WAIT

​ 共有三个状态会进入该状态

  • 由CLOSING进入:同时发起关闭情况下,当主动端接收到ACK后,进入此状态,实际上这里的同时是这样的情况:客户端发起关闭请求,发送FIN之后等待服务器端回应ACK,但此时服务器端同时也发起关闭请求,也发送了FIN,并且被客户端先于ACK接收到;
  • 由FIN_WAIT_1进入:发起关闭后,发送了FIN,等待ACK的时候,正好被动方(服务器端)也发起关闭请求,发送了FIN,这时客户端接收到了先前ACK,也收到了对方的FIN,然后发送ACK(对对方FIN的回应),与CLOSING进入的状态不同的是接收到FIN和ACK的先后顺序;
  • 由FIN_WAIT_2进入:这是不同时的情况,主动方在完成自身发起的主动关闭请求后,接收到了对方发送过来的FIN,然后回应 ACK;

TIME_WAIT的作用

​ 情况1:若最后回应的ACK丢失,那么被动关闭方将继续发送最终的FIN报文:

​ <1>若主动关闭方维护TIME_WAIT状态,主动关闭方将重发最后的ACK,来实现全双工关闭;

​ <2>若主动关闭方没有TIME_WAIT状态,将处于CLOSED状态,那么将发送RST报文。服务端收到后RST后,解释成一个错误,也就无法实现全双工关闭(可能是主动方单方的关闭);

​ 情况2:若通信双方都已经调用了close(),没有TIME_WAIT状态,将到达CLOSED状态

​ <1>现在若新连接被建立(使用原有的IP地址和端口),若原先的连接中还有数据报残存在网络之中,这样新的连接建立以后传输的数据极有可能就是原先的连接的数据报。

​ 因此:TCP不允许从处于TIME_WAIT状态的socket建立一个连接,且处于TIME_WAIT状态的socket在等待了2MSL时间后,才会转变为CLOSED状态;

1.3.RST标志位

​ RST表示复位,用来关闭异常或不存在的连接。发送RST包时,不必等缓冲区的包都发出去(不像上面的FIN包),直接发送RST包。而接收端收到RST包后,也不必发送ACK包来确认,直接关闭连接。

TCP_74">2.TCP状态转换图

在这里插入图片描述


http://www.niftyadmin.cn/n/1335947.html

相关文章

CDN技术详解及实现原理

原文地址http://www.itdaan.com/blog/2016/09/05/96da97123453c778fbc07c127a6c7062.html  CDN技术详解 一本好的入门书是带你进入陌生领域的明灯&#xff0c;《CDN技术详解》绝对是带你进入CDN行业的那盏最亮的明灯。因此&#xff0c;虽然只是纯粹的重点抄录&#xff0c;我也…

MP3数据结构

1.MP3简述 ​ MP3全称为MPEG Audio Layer 3&#xff0c;它是一种高效的计算机音频编码方案&#xff0c;它以较大的压缩比将音频文件转换成较小的扩展名为.mp3的文件&#xff0c;基本保持源文件的音质&#xff0c;MP3是ISO/MPEG标准的一部分&#xff0c;现已形成MPEG Layer1、L…

Python数据分析Pandas库方法简介

Pandas 入门 Pandas简介 背景&#xff1a;pandas是一个Python包&#xff0c;提供快速&#xff0c;灵活和富有表现力的数据结构&#xff0c;旨在使“关系”或“标记”数据的使用既简单又直观。它旨在成为在Python中进行实际&#xff0c;真实世界数据分析的基础高级构建块。此外&…

MSCDN一种实时流负载均衡+CDN方案设计

1.概述 MSCDN主要用于支持“CDN负载均衡集群服务热切主备”功能。 1.1.CDN 当用户请求内容时&#xff0c;该内容能够由以最快速度向用户提供&#xff0c;这个挑选“最优”的过程就叫做负载均衡。 ​ CDN骨干点和CDN POP点在功能上不同&#xff0c;中心和区域节点一般称为骨干…

github fork项目和原项目同步

1、首先先通过 github 的 web 页面 fork 目标的项目 前提是自己已经设置好了git,并且配置了相应的权限 然后使用git clone命令在本地克隆自己 fork 的项目&#xff1a;git clone https://github.com/Sijiu/pptr.dev.git 2、然后需要复制被自己fork的项目的git地址 切换到自己之…

Golang并发实践:笔记本秒变暖宝宝

早晨来到办公室&#xff0c;手是非常凉啊&#xff0c;一模笔记本&#xff0c;比手还凉&#xff0c;手指都快不能动了。歪脑筋一动&#xff0c;把笔记本编程暖手宝先暖暖手吧&#xff0c;这不就都暖和了。怎么变呢&#xff1f;当然是你学的Golang并发啦。 package mainimport (&…

【UBUNTU】 18.04.03安装mysql数据库

1.背景 ​ 系统版本UBUNTU 18.04.03 2.在线安装 apt install -y mysql-server3.离线安装 3.1.离线包下载 访问MYSQL下载页面&#xff0c;下载对应版本的离线数据包&#xff0c;此处测试版本为UBUNTU18.04的mysql 8.0.18和mysql 5.7.28;访问libmecab下载页面&#xff0c;下…

前端路由的实现方式

前端路由与单页页面 路由就是指随着浏览器地址栏的变化&#xff0c;展示给用户的页面也不相同。 传统的网页根据用户访问的不同的地址&#xff0c;浏览器从服务器获取对应页面的内容展示给用户。这样造成服务器压力比较大&#xff0c;而且用户访问速度也比较慢。在这种场景下&a…