剑指Offer(网络)——TCP协议的四次挥手原理详解

news/2024/5/17 15:14:13 标签: TCp

这里是TCP协议三次握手的笔记:https://blog.csdn.net/qq_41936805/article/details/103441134

所谓挥手,就是指的终止连接,TCP的四次挥手流程图如下:

这个行为,由客户端或者服务端任意一着触发close来触发,这里我们假设由客户端触发close

在这里插入图片描述

  1. 当数据传输完毕之后,双方才可以释放连接。

  2. 最开始的时候,客户端和服务端都处于Established状态,然后假设客户端主动关闭。

  3. 首先客户端发送连接释放报文,并且停止发送数据,在该数据报的报头中,携带的flag为FIN=1,sequence=u,这里的u,指的是刚才在连接状态下传送过来的最后一条信息的最后一个序号加上1,此时,客户端就进入了FIN_WAIT-1的状态,也就是第一次挥手

  4. TCP规定,即使FIN报文段不携带任何数据,也要消耗掉一个序号,让下一步回复报文的时候能够让sequence+1,那当我们的服务器收到了连接释放报文之后呢,也要发出确认报文,即ACK=1,ack=u+1,而自己的序列号sequence=v,此时服务端就进入了CLOSE-WAIT状态,这个时候,服务端处于半关闭状态,意味着客户端已经没有数据要发送了,但是服务端要是发送数据,客户端还是可以接受的,这种状态会持续到CLOSE-WAIT结束,也就是第二次挥手

  5. 此时,客户端就进入了FIN-WAIT-2的状态,等待服务器继续发送释放连接报文,也就是第三次挥手,并且要注意,这个时候服务器还是可以继续发送数据的,此时携带的flag为FIN=1,ACK=1,sequence=w,ack=u+1,当这条报文发送之后,就进入了LAST-ACK的状态,也就是服务端最终确认状态,等待客户端的最终确认

  6. 当客户端这个时候收到了服务端最后释放的报文之后,发送报文ACK=1,sequence=u+1,ack=w+1,之后进入TIME_WAIT状态,这时就是第四次挥手

  7. 等待2MSL(最长报文段寿命)之后,TCP Client就进入了关闭状态。之后当服务端接受到了客户端的报文之后,也会立刻进入到关闭状态

问题1:为什么会有TIME_WAIT状态?

  1. 确保有足够的时间让对方收到ACK,如果对方没有收到ACK,就会重传FIN,一来一回,正好是2MSL
  2. 防止这个连接和后面的连接混在一起,因为有些路由器会缓存报文数据包。

问题2:为什么需要四次挥手才能断开连接?

因为是全双工的,发送方和接收方都需要FIN报文和ACK报文,也就是说,这传递的过程,发送方和接收方都得各自发送两次,加在一起就是四次了。

问题3:服务器出现大量CLOSE_WAIT的原因?

当客户端发送过来一个FIN报文之后,服务端没有发送ACK,或者来确认FIN报文,说白了,就是对方关闭socket连接,我方忙于读或写,没有及时关闭连接。

一般这种情况都是程序中有bug,我们需要检查释放资源的代码


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

相关文章

Python守护进程和脚本单例运行

Python 守护进程 守护进程简介 进程运行有时候需要脱离当前运行环境,尤其是Linux和Unix环境中需要脱离Terminal运行,这个时候就要用到守护进程。守护进程可以脱离当前环境要素来执行,这些要素包括:未关闭的文件描述符、控制终端、…

java中 匿名对象的说明及Random类概述和基本使用

Anonymous–匿名 创建对象的标准格式; 类名称 对象名 new 类名称(); 匿名对象就是只有右边的对象,没有左边的名字和赋值运算符。 格式; new 类名称(); new Test();这…

剑指Offer(Spring)——SpringIOC原理

首先咱们先来了解一下什么是IOC(Inversion of Control) IOC(Inversion of Control):控制反转。它是Spring最核心的部分,也是任意组件的基本,但是,这并不算是一种技术,而是一种思想,它可以让你从繁琐的对象…

剑指Offer(Spring)——SpringIOC容器

也是先来说一下容器内部的运行原理 当Spring启动的时候读取应用程序提供的bean配置信息并在Spring容器中生成一份相应的bean配置注册表,然后根据这张注册表去实例化bean,装配好bean之间的依赖关系之后,为上层提供准备就绪的运行环境&#xff…

java 中 ArrayList 集合概述和基本使用

ArrayList ArrayList – 数组列表(翻译) ArrayList 是最为简单的一种集合。(首字母大写,这是一个类)。 跟数组的区别 数组的长度不可以发生改变。但是ArrayList集合的长度是可以随意变化的。 对于ArrayList来说&a…

自动化测试模型

在介绍自动化测试模型之前,我们试着来解释自动化测试库、框架和工具之间的区别。 库的英文叫做 Library,库是由代码集合成的一个产品,供程序员调用。面对对象的代码组成形成的库叫类库,面向过程的代码组织形成的库叫函数库。所以从…

java 字符串概述与特点

字符串 String String类代表字符串,java程序中的所有字符串字面值(如;“abc”)都作为此类的实例实现。其实是说;程序中所有的双引号字符串,都是String类的对象。 字符串特点; 1.字符串内容永…

剑指Offer(Spring)——Spring AOP

AOP——面向切面编程 在软件工程方面有一个重要的概念: 即关注点分离:不同的问题交给不同的部分去解决。 AOP就是一种关注点分离的技术,比如我们在写一个Javaweb,需要写缓存,业务逻辑,日志,出…