TCP三次握手四次挥手详解

TCP三次握手建立连接的过程:

  • 一次握手:客户端发送带有 SYN(seq=x)标志的数据包到服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认。
  • 二次握手:服务端收到 SYN 包后,发送带有 SYN+ACK(seq=y,ack=x+1)标志的数据包到客户端,然后服务器进入 SYN_RECV 状态。
  • 三次握手:客户端收到 SYN+ACK 包后,发送带有 ACK(ack=y+1)标志的数据包到服务端,然后客户端和服务端都进入ESTABLISHED状态,连接完成。

SYN 指同步序列号,只有在第一次和第二次发起连接请求和连接接受的情况下置为1,seq为随机取值。

seq 指初始化序列号,用于标识客户端将要发送的数据包顺序。确保建立的连接是可靠的传输,不会造成数据丢失和失序。

第一次握手和第二次握手不发送数据,只有第三次握手时才发送数据。


TCP四次挥手释放连接的过程:

  • 第一次挥手:客户端发送一个 FIN(seq=x)标志的数据包到服务端,用来关闭客户端到服务端的数据传送,然后客户端进入 FIN-WAIT-1状态。
  • 第二次挥手:服务端收到这个 FIN(seq=x)标志的数据包,它发送一个 ACK(ack=x+1)标志的数据包到客户端,然后服务端进入 CLOST-WAIT状态,客户端进入 FIN-WAIT-2状态。
  • 第三次挥手:服务端发送一个 FIN(seq=y)标志的数据包到客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态。
  • 第四次挥手:客户端发送 ACK(ack=y+1)标志的数据包到服务端,然后客户端进入 TIME-WAIT状态,服务端在收到ACK(ack=y+1)标志的数据包后进入CLOSED状态,此时如果客户端等待2MSL后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。

1.1. 为什么要三次握手?

        三次握手的目的是建立可靠的通信信道,确保客户端和服务端发送及接收数据都是正常的。

  1. 第一次握手:服务端确认客户端发送正常,服务端接收正常。
  2. 第二次握手:客户端确认接收发送正常,服务端接收发送正常。
  3. 第三次握手:服务端确认服务端发送正常,客户端接收正常。

        其次是为了防止“已失效的连接请求报文段”被服务器误接收。当网络情况比较复杂的情况下,发送方第一次发送请求后,由于网络原因发生了阻塞,此时客户端会超时重传再次发送请求。如果握手只有两次,那么当连接释放后,之前阻塞的请求到达服务端,服务端此时以为与客户端建立了连接,会分配资源保持这个连接,一直监听等待客户端发送数据,但客户端不会发送请求,造成了服务端资源的浪费。

        因此需要服务端发送请求后,客户端响应了服务端的请求进行三次握手后,才算建立了连接,可以发送请求。

1.2. 为什么要四次挥手?

        因为TCP通过三次握手建立的是全双工通信,任何一方都可以在数据传送结束后发出连接释放的通知, 当一方想要关闭连接时,不能直接断开,因为另一方可能还有数据需要发送。 某一方发出释放连接请求时,待对方确认后进入半关闭状态。当另一方也没有数据再发送的时候,则发出连接释放的通知,对方确认后完全关闭TCP连接。因此四次挥手保证了双方都确认断开连接,有效防止了未传输完的数据丢失

  1. 第一次挥手:客户端发送 FIN,表示它不再发送数据。
  2. 第二次挥手:服务端收到 FIN,回复 ACK,确认不再接收客户端数据。
  3. 第三次挥手:服务端发送 FIN,表示它的数据也发送完毕,不再发送数据,请求释放连接。
  4. 第四次挥手:客户端收到服务端的 FIN,发送 ACK,确认连接关闭。

1.3. 为什么不能把服务端发送的ACK和FIN合并起来,变成三次挥手?

        因为服务端收到客户端断开连接的请求时,可能还有一些数据没有发完,这时先回复 ACK,表示服务端收到了客户端发送的断开连接的请求,不再接收客户端发送的数据,但服务端此时仍可以向客户端发送数据,等到数据发完之后再发送 FIN 给客户端,断开服务端到客户端的数据传送。

1.4. 如果第二次挥手时服务端的 ACK 没有送达客户端,会怎样?

        客户端在发送 FIN 给服务端后,没有收到服务端发送到 ACK,会重新发送 FIN 请求。

1.5. 为什么要有第四次挥手?

        第四次挥手客户端发送 ACK 给服务端的目的是确保服务端知道客户端已经收到关闭请求,服务端可以安全的释放资源并结束连接。否则如果不进行第四次挥手的话,服务端发送 FIN给客户端后,无法知道客户端是否接收到了自己释放连接的请求,导致客户端一直进行等待。如果客户端不发送 ACK,服务端会一直保持 LAST-ACK状态,直至超时或重发 FIN。

1.6. 为什么第四次挥手客户端需要等待 2*MSL(报文最长寿命)时间后才进入CLOSED状态?

        因为第四次挥手时,客户端发送给服务端的 ACK 有可能丢失,如果服务端因为某些原因没有接收到 ACK 的话,服务端就会重发 FIN ,如果客户端在 2*MSL的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止服务端没有收到 ACK 而不断重发 FIN。

        MSL(Maximum Segment Lifetime) : 一个片段在网络中最大的存活时间,2MSL 就是一个发送和一个回复所需的最大时间。如果直到 2MSL,Client 都没有再次收到 FIN,那么 Client 推断 ACK 已经被成功接收,则结束 TCP 连接。

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

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

相关文章

深度解读 2024 Gartner DevOps 魔力象限

上周 Gartner 刚发布了 2024 年度的 DevOps 魔力象限。我们也第一时间来深度解读一下这份行业里最权威的报告。 和2023年对比 23 年入围 14 家厂商,24 年入围 11 家。4 家厂商从报告中消失,分别是 Bitrise, Codefresh, Google Cloud Platform (GCP), VM…

数据库软题3-专门的集合运算

一、投影(筛选列) 题1 题2 二、选择(筛选行) 三、连接 3.自然连接 题1-自然连接的属性列数(几元关系)和元组数 解析: 题2-自然连接的属性列数(几元关系)和元组数 自然连接后的属性个数 A列…

Angular与Vue的全方位对比分析

一、框架概述 Angular Angular是由Google开发和维护的一款开源JavaScript框架。它采用TypeScript编写,具有一套完整的开发工具和规范。Angular遵循MVC(Model - View - Controller)或更确切地说是MVVM(Model - View - ViewModel&a…

WEB服务器——Tomcat

服务器是可以使用java完成编写,是可以接受页面发送的请求和响应数据给前端浏览器的,而在开发中真正用到的Web服务器,我们不会自己写的,都是使用目前比较流行的web服务器。 如:Tomcat 1. 简介 Tomcat 是一个开源的轻量…

无人机飞手入伍当兵技术优势分析

随着现代战争形态的不断演变,无人机技术在军事领域的应用日益广泛,成为提升军队作战能力的重要手段。对于无人机飞手而言,其专业技能和实战经验在入伍当兵后能够转化为显著的技术优势,为国防事业贡献重要力量。以下是从专业技能优…

cpu路、核、线程、主频、缓存

路:主板插口实际插入的 CPU 个数,也可以理解为主板上支持的CPU的数量。每个CPU插槽可以插入一个物理处理器芯片。例如,一台服务器可能有2路或4路插槽,这意味着它最多可以安装2个或4个物理处理器。 核:单块 CPU 上面能…

Llama微调以及Ollama部署

1 Llama微调 在基础模型的基础上,通过一些特定的数据集,将具有特定功能加在原有的模型上。 1.1 效果对比 特定数据集 未使用微调的基础模型的回答 使用微调后的回答 1.2 基础模型 基础大模型我选择Mistral-7B-v0.3-Chinese-Chat-uncensored&#x…

sql-labs靶场

第一关(get传参,单引号闭合,有回显,无过滤) ?id-1 union select 1,2,(select group_concat(table_name) from information_schema.tables where table_schemasecurity) -- 第二关(get传参,无闭…

SpringBoot(Java)实现MQTT连接(本地Mosquitto)通讯调试

1.工作及使用背景 工作中需要跟收集各种硬件或传感器数据用于Web展示及统计计算分析,如电表、流量计、泵、控制器等物联网设备。 目前的思路及解决策略是使用力控或者杰控等组态软件实现数据的转储(也会涉及收费问题),通过组态软件…

C++ -- 异常

C中的异常是用于处理程序执行过程中出现的错误情况。通过异常处理,程序可以在遇到错误时优雅地处理这些问题,而不是直接崩溃。 C语言处理错误的方式 C语言传统的处理错误的方式主要有两种: 终止程序:使用如assert这样的宏来检查…

RTX 5090、5080规格完整曝光,来看来看

近日,科技圈内再掀波澜,有知名博主独家揭秘了英伟达即将推出的RTX 5090与RTX 5080两款高端显卡的详尽规格,预示着显卡市场即将迎来新一轮的性能飞跃与定位分化。 据最新披露的信息,这两款显卡均采用了先进的PG144/145-SKU30 PCB设…

如何借助Java批量操作Excel文件?

最新技术资源(建议收藏) https://www.grapecity.com.cn/resources/ 前言 | 问题背景 在操作Excel的场景中,通常会有一些针对Excel的批量操作,批量的意思一般有两种: 对批量的Excel文件进行操作。如导入多个Excel文件…

若依--Request.js

编写一个request.js的基本类,封装一些信息,比如请求地址、响应时间、携带的token参数等等。 //创建一个axios实列这里的 import.meta.env.VITE_APP_BASE_API 表示这个基础 URL 的值来自于环境变量。通常,这种做法用于将不同环境(…

vue3结合 vue-router和keepalive实现路由跳转保持滚动位置不改变(超级简易清晰)

1.首先我们在路由跳转页面设置keepalive(Seeall是我想实现结果的页面) 2. 想实现结果的页面中如果不是全屏实现滚动而是有单独的标签实现滚动效果

docker - 迁移和备份

文章目录 1、docker commit1.1、查询 容器 docker ps1.2、docker commit zookeeper zookeeper:3.4.13 2、docker save -o2.1、宿主机 切换到 /opt 目录下2.2、将镜像保存到 宿主机/opt目录下 3、docker load -i 对某一个容器修改完毕以后,我们可以把最新的容器部署到…

HTML5实现好看的唐朝服饰网站模板源码2

文章目录 1.设计来源1.1 网站首页1.2 唐装演变1.3 唐装配色1.4 唐装花纹1.5 唐装文化 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.ne…

Spring Boot实战:构建在线商城系统

1 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化,规范化管理。这样的大环境让那些止步不前&#…

iLogtail 进化论:重塑可观测采集的技术边界

作者:余韬(迅飞) 采集代理发展回顾 iLogtail 作为一款开创性的轻量级日志采集器,历经 13 载风雨,始终致力于高效地从多元化的数据源中萃取、处理可观测信息,并无缝传输至阿里云日志服务或各类日志分析平台。今年,适逢…

矩阵奇异值

一、ATA 任给一个矩阵A,都有: ATA 为一个对称矩阵 例子:A为一个mn的矩阵,A的转置为一个nm的矩阵 对称矩阵的重要性质如下: ① 对称矩阵的特征值全为实数(实数特征根) ② 任意一个n阶对称矩阵…

《黑神话:悟空》天命人速通法宝 | 北通鲲鹏20智控游戏手柄评测

《黑神话:悟空》天命人速通法宝 | 北通鲲鹏20智控游戏手柄评测 哈喽小伙伴们好,我是Stark-C~ 截止目前,《黑神话:悟空》已经面世一个多月,不知道还有多少天命人没有通关呢? 作为国内首款真正意义上的3A大作,《黑神话…