(学习笔记-TCP连接断开)TCP四次挥手

TCP四次挥手过程

TCP断开连接是通过四次挥手实现的,双方都可以主动断开连接,断开连接后主机中的资源将被释放,四次挥手的过程如下:

  •  客户端打算关闭连接时,会发送一个TCP首部FIN标志位为1的报文,也就是FIN报文,之后客户端进入FIN_WAIT_1状态。
  • 服务端收到该报文后,就向客户端发送ACK应答报文,接着服务端进入CLOSE_WAIT状态。
  • 客户端收到服务端的ACK应答报文后,之后进入FIN_WAIT_2状态。
  • 等待服务端处理完数据后,也向客户端发送FIN报文,之后服务端进入LAST_ACK状态。
  • 客户端收到服务端的FIN报文后,回一个ACK应答报文,之后进入TIME_WAIT状态
  • 服务端收到了ACK应答报文后,就进入了CLOSE状态,至此服务端已经完成连接的关闭。
  • 客户端在经过2MSL一段时间后,自动进入了CLOSE状态,至此客户端也完成了连接的关闭。

可以看到,每个方向都需要一个FIN和一个ACK,因此通常被称为四次握手

PS:主动关闭连接的,才有TIME_WAIT状态。


为什么需要四次挥手?

回顾一下四次挥手双方FIN包的过程就能理解为什么需要四次挥手了。

  • 关闭连接时,客户端向服务端发送FIN时,仅仅表示客户端不再发送数据了但是还能接收数据。
  • 服务端收到客户端的FIN报文时,先回一个ACK应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FIN报文给客户端来表示同意现在关闭连接。

从上面过程可知,服务端通常需要等待完成数据的发送和处理,所以服务端的ACKFIN一般会分开发送,因此是需要四次挥手


第一次挥手丢失

当客户端(主动关闭方)调用close函数后,就会向服务端发送FIN报文,试图与服务端断开连接,此时客户端的连接进入到FIN_WAIT_1状态

正常情况下,如果能及时收到服务端(被动关闭方)的ACK,则会很快变为FIN_WAIT2状态。

如果第一次挥手丢失了,那么客户端迟迟收不到被动方的ACK的话,也就会触发超时重传机制,重传FIN报文,重发次数tcp_orphan_retries参数控制。

当客户端重传FIN报文的次数超过tcp_orphan_retries后,就不再发送FIN报文,则会再等待一段时间(时间为上一次超时时间的2倍),如果还是没能收到第二次挥手,那么直接进入到close状态.

 具体过程:

  • 当客户端超时重传3次FIN报文后,由于tcp_orphan_retries为3,已达到最大重传次数,于是再等待一段时间(时间为上次超时时间的2倍),如果还是没能收到服务端的第二次挥手(ACK报文),那么客户端就会断开连接

第二次挥手丢失

当服务端收到客户端的第一次挥手后,就会先回一个ACK确认报文,此时服务端的连接进入到CLOSE_WAIT状态。

由于ACK报文不会重传,所以如果服务端的第二次挥手丢失了,客户端就会触发超时重传。重传FIN报文,直到服务端的第二次挥手,或者达到最大重传次数。

 具体过程:

  • 当客户端超时重传2次FIN报文后,由于tcp_orphan_retries为2,已达到最大超时重传次数,于是再等待一段时间(时间为上一次超时时间的2倍)如果还是没能收到服务端的第二次挥手(ACK报文),那么客户端就会断开连接。

当客户端收到第二次挥手后,会处于FIN_WAIT_2状态,这个状态需要等待服务端第三次挥手,也就是服务端的FIN报文。

对于close函数关闭的连接,由于无法再发送和接收数据,所以FIN_WAIT_2状态不可以持续太久,而tcp_fin_timeout控制了这个状态下连接的持续时长,默认值是60秒

这意味着对于调用close关闭的连接,如果在60秒后还没有收到FIN报文,客户端(主动关闭方)的连接就会直接关闭:

但是,如果主动关闭方使用shutdown函数关闭连接,指定了只关闭发送方向,而接受方向并没有关闭,那么意味着主动关闭方还是可以接收数据的。

此时,如果主动关闭方一直没收到第三次挥手,那么主动方的连接会一直处于FIN_WAIT2状态(tcp_fin_timeout 无法控制 shutdown 关闭的连接


第三次挥手丢失

当服务端收到客户端的FIN报文后,内核会自动回复ACK,同时连接处于CLOSE_WAIT状态,它表示等待应用程序调用close函数关闭连接。

此时内核是没有权利代替进程关闭连接诶,必须由进程主动调用close函数来触发服务端发送FIN报文。

服务端处于CLOSE_WAIT状态时,调用了close函数,内核就会发出FIN报文,同时连接进入LAST_ACK状态,等待客户端返回ACK来确认连接关闭。

如果迟迟收不到这个ACK,服务端就会重发FIN报文,重发次数依然由tcp_orphan_retries参数控制,这与客户端重发FIN报文的重传次数控制方式是一样的

 具体过程:

  • 当服务端重传第三次挥手报文的次数达到了3次后,由于tcp_orphan_retries 为3,达到了重传最大次数,于是再等待一段时间(时间为上次超时时间的2倍),如果还是没能收到客户端的第四次挥手(ACK报文),那么服务端就会断开连接。

第四次挥手丢失

当客户端收到服务端的第三次挥手的FIN报文后,就会回ACK报文,也就是第四次挥手,此时客户端连接进入TIME_WAIT状态。

在linux系统中,TIME_WAIT状态会维持2MSL后才会进入关闭状态

然后,服务端(被动关闭方)没有收到ACK报文前,还是处于LAST_ACK状态。

如果第四次挥手的ACK报文没有到达服务端,服务端就会重发FIN报文,重发次数依然由tcp_orphan_retries 参数控制。

具体过程:

  • 当服务端重传第三次挥手报文到达2时,达到了最大重传次数,于是再等待一段时间(时间为上次超时时间的2倍),如果还是没能收到客户端的第四次挥手(ACK报文),那么服务端就会断开连接
  • 客户端在收到第三次挥手后,就会进入TIME_WAIT状态,开启时长为2MSL的定时器,如果途中再次收到第三次挥手(FIN报文)后,就会重置定时器,当等待2MSL时长后,客户端就会断开连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4616.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基础语言模型LLaMA

LLaMA包含从7B到65B参数的基础语言模型集合。Meta在数万亿个tokens上训练了模型,LLaMA-13B在大多数基准测试中优于GPT-3(175B)。 来自:LLaMA: Open and Efficient Foundation Language Models 目录 背景概述方法预训练数据架构Op…

LangChain + Embedding + Chromdb,关联使用ChatGLM的本地搭建训练平台教程

一.介绍 OpenAI 在国内用户注册会遇到各种阻力,目前可行的方法是使用本地数据集的功能实现联网搜索并给出回答,提炼出TXT、WORD 文档里的内容。 现在主流的技术是基于强大的第三方开源库:LangChain 。 文档地址:🦜…

基于单片机的教室智能照明台灯控制系统的设计与实现

功能介绍 以51单片机作为主控系统;LCD1602液晶显示当前时间、年月日、时分秒、前教室人数;2路红外探头用来感应当前教室进出人数;按键可以设置当前时间、自动手动模式、开启和关闭教室灯光时间;在手动模式下,可以通过按…

Ip-Limit: 轻量级注解式IP限流组件(一)

author: van , ggfanwentaogmail.comIp-Limit: 轻量级注解式IP限流组件 项目简介 基于JVM缓存的轻量级、注解式IP限流组件,方便项目快速引用,满足多线程场景。 默认为滑动窗口限流器,内置令牌桶限流器,可通过注解的属性配置修改…

uni-app:单位像素rpx

rpx:响应式单位,长宽可以随着屏幕大小改变,其尺寸根据iPhone 6的标准来参考(750rpx为占满屏幕宽,1334rpx为占满屏幕长。7501334rpx) 例子: 现在展示型号为iPhone 12 pro的型号,这里750px和750…

关于 let/var/const 的常见面试题

1、题目一 function func(){if(true){var s 123}console.log(s) } func() 打印的答案: 123 》 var是属于函数作用域 2、题目二 function func(){if(true){let s 123}console.log(s) } func() 打印的答案: s is not defined 》 let是属于块级作…

51单片机学习--矩阵键盘、电子密码锁

矩阵键盘的模块原理图&#xff1a; 功能&#xff1a;按下矩阵按键&#xff0c;在LCD上显示对应的数值。 采用模块化编程&#xff0c;在此只给出MatrixKey.c 和 main.c 两部分代码 #include <REGX52.H> #include "Delay.h"/*矩阵键盘读取键码按下不放&#xf…

【有功功率、无功功率】可再生能源配电馈线的鲁棒经济调度研究[IEEE13节点](Matlab代码实现)

&#x1f4a5;1 概述 "有功功率和无功功率" 是与电力系统中能量传输和功率控制相关的两个重要概念。 有功功率&#xff08;Active Power&#xff09;是指电力系统中传输和消耗能量的功率&#xff0c;也被称为实功功率。它负责提供电力系统中的实际电能需求&#xf…

DTU凭什么可以为数据提供高效可靠的稳定传输?

当谈及到智能化的发展时&#xff0c;其实它已经正在影响着各行各业&#xff0c;当前许多传统行业也正在向智能化转变。如果你细心留意的话&#xff0c;就会发现在我们日常生活中多少都会见到它们的身影&#xff0c;例如&#xff1a;村庄各家各户墙外所挂的煤改电设备、居民楼小…

【数学建模】统计分析方法

文章目录 1.回归分析2. 逻辑回归3. 聚类分析4. 判别分析5. 主成分分析6. 因子分析7. 对应分析 1.回归分析 数据量要多&#xff0c;样本总量n越大越好——>保证拟合效果更好&#xff0c;预测效果越好 一般n>40/45较好 方法 建立回归模型 yiβ0β1i……βkxkiεi 所估计的…

vite动态加载图片

参考CSDN 方法一 根据官网的提示, 就是在将asset 前面加上src <img v-if"post.welcomeScreen" :src"/src/assets/blogPhotos/${name}.jpg" alt"" />方法二 关于第二个方法&#xff0c;官网说&#xff1a;“实际上&#xff0c;Vite 并不…

Ubuntu系统cron服务运行 .sh 脚本

1、安装cron # 安装 apt-get install cron 2、常用命令 # 查看状态 sudo systemctl status cron # 开启服务 sudo systemctl start cron # 停止服务 sudo systemctl stop cron # 重启服务 sudo systemctl restart cron 3、编写要定时执行 hello.sh 脚本 #!/bin/bash echo &…

IDEA使用GIT提交代码中文日志(commit message)乱码

最近换了新的开发环境&#xff0c;导致提交gti中文注释乱码&#xff0c;遂记录一下解决方案 idea中查看git提交信息显示中文是正常的 gitee上显示乱码 本地显示也是乱码 一、命令修改编码格式 git 安装目录下执行 git config --global i18n.commitencoding utf-8git config …

使用ext2fsd将装有Ubuntu的硬盘挂载到Windows后,导致Ubuntu系统无法启动

Ubuntu是一种流行的Linux操作系统&#xff0c;而Windows则是最常用的桌面操作系统之一。有时&#xff0c;我们可能需要将Ubuntu的硬盘连接到Windows系统上&#xff0c;以访问、备份或修改其中的文件。然而&#xff0c;这样的操作可能会导致Ubuntu系统无法正常启动&#xff0c;这…

pdf怎么翻译?有这个工具就够了

pdf怎么翻译&#xff1f;PDF文档一直是我们日常生活和工作中不可避免的一部分。但是&#xff0c;当我们需要翻译PDF文件时&#xff0c;我们往往会感到无助&#xff0c;因为PDF文档不能像其他文本文件一样直接复制和粘贴。那么今天就给大家介绍一款可以帮助我们进行PDF翻译的工具…

【技能实训】DMS数据挖掘项目-Day09

文章目录 任务9【任务9.1.1】升级DataBase类为可序列化的类&#xff0c;以便在文件保存或网络中传递【任务9.1.2】升级LogRec类为可序列化的类&#xff0c;以便在文件保存或网络中传递【任务9.1.3】升级MatchedLogRec类为可序列化的类&#xff0c;以便在文件保存或网络中传递【…

Java编程-基本排序算法

冒泡排序 图解 &#xff08;注&#xff1a;图片来源网络&#xff09; Java代码 package suanfa_Ja;import org.apache.hadoop.security.SaslOutputStream;// 基本排序算法&#xff0c;冒泡排序 时间复杂度 O(n^2) 空间复杂度O(1) public class BubbleSort {public static v…

SPEC CPU 2006 在 CentOS 5.0 x86_64 古老系统测试【4】-O3 不支持 编译失败

gcc -O3 编译失败 结论&#xff1a;默认情况下SPEC CPU 2006 1.2 不支持 gcc -O3编译参数。

Linux 安装 nginx

正常是两种安装方式 一种是使用系统的包管理软件&#xff0c;比如centos的yum -y install nginx命令&#xff08;简单但不推荐&#xff0c;配置文件分散不易管理&#xff0c;且需要配置第三方源yum -y install epel-release等&#xff0c;如果是简单使用&#xff0c;配置文件什…

1.15 什么是后端服务

文章目录 什么是后端服务后端服务的功能后端服务的技术栈结论 什么是后端服务 后端服务&#xff08;Backend Service&#xff09;是指在软件应用中负责处理数据、逻辑和业务功能的组件或模块。它通常运行在服务器端&#xff0c;为前端应用或客户端提供数据和服务支持。 后端服…