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

news2024/10/5 14:15:53

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.coloradmin.cn/o/769072.html

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

相关文章

在gitlab中生成增量代码质量分析报告

作为管理者,你是否想在组员创建merge request时,生成代码质量分析报告,今天它来了: .gitlab-ci.yml: image: python:3.11flake8:allow_failure: true#rules: 这里不能加rules,否则无法正确生成质量报告# …

05-1_Qt 5.9 C++开发指南_Model/View结构基础(基本原理;数据模型;试图组件;代理)

Model/View(模型/视图) 结构是 Qt 中用界面组件显示与编辑数据的一种结构,视图 (View)是显示和编辑数据的界面组件,模型 (Model) 是视图与原始数据之间的接口。Model/View 结构的典型应用是在数据库应用程序中,例如数据库中的一个数据表可以在…

如何使用ArcGIS Pro制作一张天府机场区位图

ArcGIS系列产品的重要功能之一就是制图,相较于ArcGIS, ArcGIS Pro在制图这块有很大的改进,用户可以连接上ArcGIS Online丰富的在线资源,感受到ArcGIS Pro强大的制图能力,但是在开始的时候可能会有些不习惯,因为在操作上…

C#在工业自动化领域的应用前景如何?

在2021年,C#与工业自动化已经开始结合,并且这种趋势有望在未来继续发展。C#是一种功能强大的编程语言,其面向对象的特性、跨平台支持以及丰富的类库和工具,使其成为在工业自动化领域应用的有力工具。 我这里刚好有嵌入式、单片机…

【每天40分钟,我们一起用50天刷完 (剑指Offer)】第三十天 30/50 连续子数组的最大和【dp】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

断点续传技术在工业边缘网关HiWoo Box中的价值

引言 工业边缘计算是近年来迅速发展的一项重要技术,它将数据处理和分析功能推向了设备和传感器的边缘,从而大大提高了工业自动化系统的效率和可靠性。然而,工业现场环境复杂多变,网络稳定性不足常常导致数据传输中断,…

TPS61021A 具有 0.5V 超低输入电压的3A升压转换器

1 特性 1 • 输入电压范围:0.5V至4.4V • 启动时的最小输入电压为0.9V • 可设置的输出电压范围:1.8V到4.0V • 效率高达91%(VIN2.4V、VOUT3.3V 且IOUT 1.5A 时) • 2.0MHz 开关频率 • IOUT > 1.5A,VOUT 3.…

Java 的异常体系

一个思维导图回顾一下 Java 的异常体系。 ​ 上面的图片没有罗列出所有的异常类型,但也基本概括了 Java 异常的继承体系。所有的异常类都继承自 Throwable ,Throwable 有两个直接子类 Error 和 Exception 。 Exception 一般指可以/应该捕获和处理的异常…

php代码逻辑题

<?php error_reporting(0); show_source(__FILE__); $guess $_POST[guess]; $data (array)json_decode($_GET[data]); if(substr(md5($guess),0,27)797ed5077436dc8abaec64750e2)if ($data[aaa] !666 && intval($data[aaa],0) 666 &‮⁦!!⁩⁦& "h…

DPDK:如何查看dpdk版本

背景 服务器上曾经装过很多版本的dpdk&#xff0c;此时如果编译某个程序出现奇怪错误的时候不由得会怀疑是不是dpdk版本的问题。。。 令人吃惊的是&#xff0c;网上搜了一圈居然没有一个简单直接的方法能够直接使用&#xff0c;于是自己实验了一下摸索出来一个方法。 较新版本的…

企业设备报修管理系统你nodejs+vue

S模式系统&#xff0c;采用vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得中小企业设备管理系统管理工作系统化、规范化。本系统的使用使管理人员从繁重的工作中解脱出来&am…

GFLv1 论文学习

1. 解决了什么问题&#xff1f; 单阶段目标检测器通过密集预测的方式进行分类、定位。分类一般使用 Focal Loss&#xff0c;而边框回归则通过 Dirac delta 分布来学习。近年来的改进方向是引入一个单独的分支&#xff0c;预测定位的质量&#xff0c;然后用该质量分数去辅助分类…

Mediabox:年度最佳音视频开发工具

“2023稀土开发者大会”落下帷幕&#xff0c;由稀土掘金社区评选的的掘金技术引力榜重磅出炉&#xff0c;共有22个优秀实践案例上榜&#xff0c;涵盖对技术行业发展有特别贡献的人物、开发工具、开源项目、技术团队和技术方案。其中&#xff0c;阿里云视频云「MediaBox」突出重…

新手杯— 天知地知

0x00 前言 CTF 加解密合集&#xff1a;CTF 加解密合集 0x01 题目 好不容易要到了妹子手机号&#xff0c;却是加密的&#xff0c;怎么办&#xff0c;兄弟们很急&#xff0c;在线等&#xff01;听说妹子是佛山的 加密后的手机号&#xff1a;(86)981935301754格式ctfshow{妹子手…

Redis 7.0.12发布,进行了安全和错误修复

导读Redis 7.0.12发布&#xff0c;进行了安全修复和错误修复。 升级紧迫性 安全性&#xff1a;请参阅下面的安全修复。 安全修复 (CVE-2022-24834)在Redis中执行特制的Lua脚本可能会在cjson和cmsgpack库中触发堆溢出。堆溢出&#xff0c;導致堆損毀及可能的遠端執行程式碼。導…

排序算法 - 快速排序(4种方法实现)

快速排序 快速排序是啥&#xff1f;三数取中&#xff1a;1.挖坑法&#xff08;推荐掌握&#xff09;2.前后指针法&#xff08;推荐掌握&#xff09;3.左右指针法&#xff08;霍尔版本&#xff09;&#xff08;容易出错&#xff09;4.非递归实现 本篇文章的源代码在这&#xff0…

解放研究者:GPT自动化科研

GPT Researcher 是一个自主代理程序&#xff0c;旨在进行多种任务的全面在线研究。 该代理能够生成详细、事实性和公正的研究报告&#xff0c;并提供个性化选项&#xff0c;以便关注相关资源、大纲和教训。受到AutoGPT和最近的Plan-and-Solve论文的启发&#xff0c;GPT Researc…

macd底背离画线指标公式

使用说明&#xff1a; MACD底背离是一种可能预示着价格反转的信号&#xff0c;尤其在价格走势出现下跌趋势时&#xff0c;它可以提供一定程度的参考。然而&#xff0c;作为任何技术指标一样&#xff0c;MACD底背离并不是绝对准确的&#xff0c;可能会产生误导性信号。因此&…

Inno Setup打包winform、wpf程序可判断VC++和.net环境

Inno Setup打包winform、wpf程序可判断VC和.net环境 1、下载Inno Setup2、新建打包文件、开始打包1、新建打包文件2、填写 应用名称、版本号、公司名称、公司官网3、选择安装路径 Custom是指定默认路径、Program Files folder是默认C盘根目录4、选择程序启动exe文件 以及Addfol…

stable diffusion webui mov2mov

手把手教你用stable diffusion绘画ai插件mov2mov生成动画_哔哩哔哩_bilibili手把手教你用stable diffusion绘画ai插件mov2mov生成动画, 视频播放量 14552、弹幕量 3、点赞数 275、投硬币枚数 114、收藏人数 980、转发人数 75, 视频作者 懂你的冷兮, 作者简介 科技改变世界&…