当前位置: 首页 > news >正文

基础:TCP四次挥手做了什么,为什么要挥手?


1. TCP 四次挥手在做些什么


在这里插入图片描述

1. 第一次挥手

1)挥手作用:主机1发送指令告诉主机2,我没有数据发送给你了。

2)数据处理:主机1(可以是客户端,也可以是服务端),设置 Sequence NumberAcknowledgment Number,向主机2发送一个 FIN 报文段;随后,主机1 进入 FIN_WAIT_1 状态。



2. 第二次挥手

1)挥手作用:主机2收到主机1信息后,回复报文给主机1,告诉主机1我也没有数据发送给你了,可以进行关闭连接。

2)数据处理:主机2收到了主机1发送的 FIN 报文段,向主机1回一个 ACK 报文段,Acknowledgment NumberSequence Number 加1;主机1进入 FIN_WAIT_2 状态。



3. 第三次挥手

1)挥手作用:主机2向主机1发送关闭连接指令请求。

2)数据处理:主机2向主机1发送 FIN 报文段,请求关闭连接,同时主机2进入 CLOSE_WAIT 状态;。



4. 第四次挥手

1)挥手作用:主机1收到主机2的关闭请求后,回复确认关闭指令给主机2,关闭链接。

2)数据处理:主机1收到主机2发送的 FIN 报文段,向主机2发送 ACK 报文段,然后主机1进入 TIME_WAIT 状态;主机2收到主机1的 ACK 报文段以后,就关闭连接;此时,主机1等待 2MSL 后依然没有收到回复,则证明 Server 端已正常关闭,那好,主机1也可以关闭连接了。


2. 为什么要四次挥手


1. TCP 协议是一种面向连接的、可靠的、基于字节流的运输层通信协议。

2. TCP 是全双工 模式,这就意味着,当主机1发出 FIN 报文段时,只是表示主机1已经没有数据要发送了,主机1告诉主机2, 它的数据已经全部发送完毕了;但是,这个时候主机1还是可以接受来自主机2的数据。

3. 当主机2返回 ACK 报文 段时,表示它已经知道主机1没有数据发送了,但是主机2还是可以发送数据到主机1。

4. 当主机2也发送了 FIN 报文段时,这个时候就表示主机2也没有数据要发送,就会告诉主机1,我也没有数据要发送了。

5. 主机1收到主机2的 FIN 报文后,回复 ACK 确认之后彼此就会愉快的中断这次TCP连接。


3. 四次挥手状态参数说明

  • FIN_WAIT_1FIN_WAIT_1 针对主动发起关闭一方来讲;FIN_WAIT_1FIN_WAIT_2 状态的真正含义都是表示等待对方的 FIN 报文。而这两种状态的区别是:FIN_WAIT_1 状态实际上是当SOCKETESTABLISHED 状态时, 它想主动关闭连接,向对方发送了 FIN 报文,此时该 SOCKET 即进入到 FIN_WAIT_1 状态。而当对方回应 ACK 报 文后,则进入到 FIN_WAIT_2 状态,当然在实际的正常情况下,无论对方何种情况下,都应该马上回应 ACK 报文,所以 FIN_WAIT_1 状态一般是比较难见到的,而FIN_WAIT_2 状态还有时常常可以用 netstat 看到。

  • FIN_WAIT_2FIN_WAIT_2 针对主动发起关闭一方来讲;FIN_WAIT_2 状态下的 SOCKET表示半连接,也即有一方要求 close 连接,但另外还告诉对方,我暂时还有点数据需要传送给你(ACK 信息),稍后再关闭连接。

  • CLOSE_WAITCLOSE_WAIT针对被动关闭一方来讲;表示在等待关闭。当主动关闭一方 close 一个 SOCKET 后发送 FIN 报文给自己,被动关闭一方会回应一个 ACK 报文给对方,此时则进入到 CLOSE_WAIT 状态。接下来,被动关闭一方要看是否还有数据发送给对方,如果没有的话,那么可以 close 这个 SOCKET,发送 FIN 报文给对方,也即关闭连接。被动关闭一方在CLOSE_WAIT状态下,需要完成的事情是等待自己去关闭连接。

  • LAST_ACKLAST_ACK针对被动关闭一方来讲;表示被动关闭一方在发送 FIN 报文后,最后等待对方的 ACK 报 文。当收到 ACK 报文后,也即可以进入到 CLOSED 可用状态。

  • TIME_WAITTIME_WAIT主动发起关闭一方来讲;表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL 后即可回到 CLOSED 可用状态。 如果 FINWAIT1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,可以直接进入到 TIME_WAIT 状态,而无须经过 FIN_WAIT_2 状态。

  • CLOSED表示连接中断。

相关文章:

  • 编程题:相同数字的积木游戏(Java)
  • 暴力快速入门强化学习
  • 2024年阿里云服务器地域和可用区所在地区城市分布表
  • MT2191 整数大小比较(高精度)
  • React—— props校验(非typescript校验类型)
  • 目标检测——PP-YOLO算法解读
  • 33-Java服务定位器模式 (Service Locator Pattern)
  • js中的new Map的用法
  • [ESP32] 编码旋钮驱动
  • 备考ICA----Istio实验7---故障注入 Fault Injection 实验
  • 一种基于约化因子上三角矩阵求逆方法与MATLAB仿真
  • 【数据结构】栈与队列
  • transfomer知识点梳理
  • 工业相机采图方式、图像格式(BYTE、HObject和Mat)转换
  • 队列的实现(C语言链表实现队列)
  • #Java异常处理
  • 【Leetcode】104. 二叉树的最大深度
  • 〔开发系列〕一次关于小程序开发的深度总结
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • ECMAScript 6 学习之路 ( 四 ) String 字符串扩展
  • ES6 学习笔记(一)let,const和解构赋值
  • java 多线程基础, 我觉得还是有必要看看的
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • Vue实战(四)登录/注册页的实现
  • Webpack 4x 之路 ( 四 )
  • 安装python包到指定虚拟环境
  • 关于 Linux 进程的 UID、EUID、GID 和 EGID
  • 关于Android中设置闹钟的相对比较完善的解决方案
  • 基于HAProxy的高性能缓存服务器nuster
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 树莓派 - 使用须知
  • 微信支付JSAPI,实测!终极方案
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 云大使推广中的常见热门问题
  • 正则学习笔记
  • AI算硅基生命吗,为什么?
  • NLPIR智能语义技术让大数据挖掘更简单
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​一些不规范的GTID使用场景
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $.ajax中的eval及dataType
  • $.proxy和$.extend
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (3)llvm ir转换过程
  • (5)STL算法之复制
  • (6)添加vue-cookie
  • (黑马出品_高级篇_01)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式
  • (万字长文)Spring的核心知识尽揽其中
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 表达式计算:Expression Evaluator
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .Net的DataSet直接与SQL2005交互