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

news/2024/2/28 11:03:19

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.ppmy.cn/news/957887.html

相关文章

网络和文件流的代码原理,网络流解析,文件流解析

流的概念 基本类型数组,所有的流都是基本类型数组 C语言中只有六种基本数据类型 char【只有ascll编码,固定只占用1字节】 sort int long float double 比如 我用的utf-32编码的 ,一个编码占用32位,如果用char来存储的话 就需要占…

直接攻击,越狱攻击,道德攻击……这样做,ChatGPT 就会泄漏你的隐私

夕小瑶科技说 原创作者 | 小戏 大模型的出现让我们的隐私比以往任何时候都危险。 一个很直观的例子,在大模型向黑洞一样不断吞噬现有网络中的文本数据之时,伴随着模型训练的文本数量从 GPT-2 的 40GB 文本到 GPT-3 的 45TB 文本,我们可以非常…

利用催眠技巧绕开OpenAI的内容政策限制(仅供研究使用)

fork的仓库:https://github.com/JanYork/chatgpt-chinese-prompt-hack 声明:请仅作研究之用,不要违规使用! 在hack成功后,通过屏蔽moderetions的api请求,可以绕过OpenAI对于输出内容的审查. 地址为:https://chat.openai.com/back…

国内常用源镜像地址:

国内常用源镜像地址: 时候安装一些依赖包,网速慢,直接超时,可以指定国内源镜像。 pip install -i 国内镜像地址 包名 例如: pip install -i https://mirrors.aliyun.com/pypi/simple/ numpy 国内常用源镜像地址&…

修改Ubuntu国内镜像源地址

目录 方法一方法二方法三 方法一 Ubuntu可视化界面修改 在设置中的软件和更新中修改红框内容即可,修改后关闭会提示重启服务选择它即可 方法二 修改源文件 位置:/etc/apt/sources.list 首先备份以便出错后还原:sudo cp /etc/apt/sources.…

apt 国内的不同镜像源详解及链接地址

apt 是 debian 和 ubuntu 等 linux 操作系统常用的软件包管理器,它可以自动下载、安装、更新和卸载软件包。在使用 apt 时,我们可以通过指定镜像源来加速软件包的下载和更新。以下是一些国内常用的 apt 镜像源及其链接地址: 清华大学 tuna 镜…

基础语言模型LLaMA

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

《教育界》期刊简介及投稿邮箱

《教育界》期刊简介及投稿邮箱 一、《教育界》期刊简介 《教育界》是面向各级教育行政主管部门、教育科研院所、各类大中专院校、中小学校及其从事教育教学工作的教育工作者和专业教师的综合性教育教学类素质教育专业性教育学术理论期刊。 主管单位:广西师范大学…

Day 61-62 决策树(ID3)

代码: package dl;import java.io.FileReader; import java.util.Arrays; import weka.core.*;/*** The ID3 decision tree inductive algorithm.*/ public class ID3 {/*** The data.*/Instances dataset;/*** Is this dataset pure (only one label)?*/boolean …

C语言-初识数组

目录 【1】初识数组 【2】一维数组 【3】清零函数 【4】字符数组 【5】计算字符串实际长度 练习: 【1】初识数组 1. 概念:具有一定顺序的若干变量的集合 2. 定义格式: 数组名 :代表数组的首地址,地址常量&…

说说最近的潮流ChatGPT

最近这个ChatGPT可谓是火遍全网,基本占据各个平台的热搜,如 “ChatGPT让苹果急了”“美国89%的大学生都是用ChatGPT做作业”,网友笑称终于有个懂我的AI了,再也不是“人工智障了” 这个ChatGPT到底神奇在哪里??? 官方给出的答…

Cyber Triage 3.7 (Windows) - 数字取证和事件响应

Cyber Triage 3.7 (Windows) - 数字取证和事件响应 请访问原文链接:https://sysin.org/blog/cybertriage-3,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 唯一专门用于事件响应的数字取证工具 快速、准确和简单地…

options 预检测请求

文章目录 产生原因简单请求复杂请求携带了 cookie 情况 优化预检测请求 产生原因 在跨域的情况下,如果浏览器发送的是复杂请求,会先发送一个 OPTIONS 预检测请求,从而获知服务端是否允许该跨域请求。服务器确认允许之后,才发起实…

【精华】maven 生命周期 + 依赖传递+ scope【依赖范围】 + 排除依赖 可选依赖

目录 一 . lifecycle 生命周期 二. 依赖 与 依赖传递 三. scope 依赖范围 scope指定依赖范围 依赖传递依赖与原依赖冲突 四 maven的可选依赖与排除依赖 可选依赖 全部 排除依赖 显式的指定 maven官网技术文档: 一 . lifecycle 生命周期 * clean&…

causal-learn ModuleNotFoundError: No module named ‘pygam‘

调用 causallearn 库包,测试CAM-UV算法时报错: No module named pygam 解决方法: pip install pygam 参考链接: 【Python Causal Learning Toolbox】causallearn 库包的使用、报错修改_板砖板砖我是兔子的博客-CSDN博客

C# webform alert弹出内容换行

用 ” \n “(双斜杠哈,发布出去以后csdn只显示一个斜杠)换行,亲测有效果,其中saveNum,lose,sbnr 都是参数,sbnr是输入的换行内容,代码如下: ClientScript.RegisterStartupScript(this.GetType(), "ale…

对话冯·诺依曼理论奖得主叶荫宇:ChatGPT于行业智能,更像是全科医生对专科医生|数字思考者50人...

斯坦福大学讲席教授、冯诺依曼理论奖获得者:叶荫宇 ▎ChatGPT包罗万象,更像是一个全科医生,而运筹学以及求解器,则像是专科医生。 作者丨 韩敬娴 本文首发钛媒体APP 国际市场震荡不定,供应链波动剧烈、芯片短缺、碳排限…

开篇词:大模型国内应用落地思考与实践

自从GPT-3发布以来,随着以ChatGPT为首的应用工具一夜爆火,人工智能似乎找到了应用层面的合适出口,让大众、用户和产业,看到了大模型人工智能所具备的应用潜力。 国内外关于大模型的研究层出不群,各大厂都在进行大模型…

关于ChatGPT的一切;CUDA入门之矩阵乘;PyTorch 2.0发布|AI系统前沿动态

1.截止目前,关于ChatGPT的一切 ChatGPT是GPT3的一大飞跃,就像GPT3本身是GPT2的质的飞跃一样。目前,关于ChatGPT的解读内容数量和种类繁多,让人跟上非常困难,容易患错失恐惧症。因此,作者整理了一个笔记&…

ChatGPT也太神奇了

前段时间找了很多chatGPT国内基本上发现都是要收费的,价格贵的太离谱了。好在我再三搜索下找到了一款国内封装过的免费chatGPT,功能还是不错的,就是这回复速度有点慢,其实也不是不能用就是慢
最新文章