TCP 三次握手和四次挥手(图解)

TCP 三次握手和四次挥手

建立连接-三次握手

什么是三次握手?

简单来说:

  1. 客户端向服务器发送 SYN 报文,请求建立连接。
  2. 服务器收到 SYN 报文后,回复一个 SYN+ACK 的报文,表示同意建立连接。
  3. 客户端收到 SYN+ACK 报文后,再回复一个 ACK 报文,表示确认连接已经建立。

SYN – Synchronize 连接信号;ACK – Acknowledgment 确认信号

建立一个 TCP 连接需要“三次握手”,缺一不可:

  1. 一次握手:
    • 客户端发送带有 SYN(SEQ=x)标志的数据包 -> 服务端,
    • 然后客户端进入 SYN_SEND 状态,等待服务器的确认;
  2. 二次握手:
    • 服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,
    • 然后服务端进入 SYN_RECV 状态
  3. 三次握手:
    • 客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,
    • 然后客户端和服务器端都进入 ESTABLISHED(established) 状态,完成 TCP 三次握手。

当建立了 3 次握手之后,客户端和服务端就可以传输数据了。

具体如下图所示:

TCP三次握手

为什么要三次握手?

三次握手的主要目的是:确保客户端和服务器之间建立了可靠的连接,同时避免因重复的连接请求造成网络资源的浪费。

  1. 第一次握手
    • Client 什么都不能确认;
    • Server 确认了对方发送正常,自己接收正常
  2. 第二次握手
    • Client 确认了:自己发送、接收正常,对方发送、接收正常
    • Server 确认了:对方发送正常,自己接收正常
  3. 第三次握手
    • Client 确认了:自己发送、接收正常,对方发送、接收正常;
    • Server 确认了:自己发送、接收正常,对方发送、接收正常

TCP 为什么是三次握手,而不是两次或四次?

因为,三次握手是为了确保连接的可靠性和避免网络资源的浪费。而两次握手会存在上述的问题四次握手则会增加不必要的开销,所以三次握手是一种较为合理的选择。

第 2 次握手传回了 ACK,为什么还要传回 SYN?

服务端传回发送端所发送的 ACK 是为了告诉客户端:“我接收到的信息确实就是你所发送的信号了”,这表明从客户端到服务端的通信是正常的。

回传 SYN 则是为了建立并确认从服务端到客户端的通信

什么是 SYN ?

SYN 同步序列编号(Synchronize Sequence Numbers) 是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立正常的 TCP 网络连接时,客户机首先发出一个 SYN 消息,服务器使用 SYN-ACK 应答表示接收到了这个消息,最后客户机再以 ACK(Acknowledgement)消息响应。这样在客户机和服务器之间才能建立起可靠的 TCP 连接,数据才可以在客户机和服务器之间传递。

断开连接-四次挥手

什么是四次挥手?

简单来说:

  1. 客户端向服务器发送 FIN 报文,请求关闭连接。
  2. 服务器收到 FIN 报文后,回复一个 ACK 报文,确认已经收到客户端的请求。
  3. 服务器再向客户端发送一个 FIN 报文,表示服务器也准备关闭连接。
  4. 客户端收到服务器的 FIN 报文后,回复一个 ACK 报文,确认已经收到服务器的请求,并关闭连接。

具体如下图所示:
TCP四次挥手

断开一个 TCP 连接则需要“四次挥手”,缺一不可:

  1. 第一次挥手

    • 客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务器的数据传送

    • 然后,客户端进入 FIN-WAIT-1 状态。

  2. 第二次挥手

    • 服务器收到这个 FIN(SEQ=X)标志的数据包,它发送一个 ACK(ACK=x+1)标志的数据包 -> 客户端
    • 然后,此时服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。
  3. 第三次挥手

    • 服务端关闭与客户端的连接并发送一个 FIN(SEQ=y) 标志的数据包 -> 客户端,请求关闭连接,
    • 然后,服务端进入 LAST-ACK 状态。
  4. 第四次挥手

    • 客户端发送 ACK (ACK=y+1) 标志的数据包 -> 服务端并且进入 TIME-WAIT 状态,
    • 服务端在收到 ACK (ACK=y+1) 标志的数据包后进入 CLOSE 状态。
    • 此时,如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后,客户端也可以关闭连接了。

只要四次挥手没有结束,客户端和服务端就可以继续传输数据!

为什么要四次挥手?

TCP四次挥手的主要目的是:确保客户端和服务器之间的连接能够正常关闭,并且避免因为未处理完的数据包而造成数据的丢失和不完整。

即:为了确保连接的正常关闭和数据的完整性

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

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

ACK 的作用是: 确认收到对方发送的数据包,

而 FIN 的作用是: 请求关闭连接。

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

客户端没有收到 ACK 确认,会重新发送 FIN 请求

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

因为第四次挥手时,客户端发送给服务器的 ACK 有可能会丢失

如果服务端因为某些原因而没有收到 ACK 的话,服务端就会重发 FIN,

如果客户端在 2*MSL 的时间内收到了 FIN,就会重新发送 ACK 并再次等待 2MSL,防止 Server 没有收到 ACK 而不断重发 FIN

假设客户端在发送 ACK 之后立即进入 CLOSED 状态(即关闭连接),同时 服务端没有接收到客户端的 ACK 确认,就会一直重发 FIN – 请求关闭连接。

什么是 MSL?

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

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

学习参考

  • TCP 三次握手和四次挥手(传输层) | JavaGuide(Java面试 + 学习指南)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

unity3d 旋转cube时变形

将cube移到父路径同级,重置再,更改角度,或者将父路径先重置,再将cube移动到父节点下面

股票技术从初级到高级,从实盘进阶到摩尔缠论

一、教程描述 摩尔缠论是什么?一个伟大的缠论分支体系,由顶尖高手创立的缠论分支,这个顶尖高手,江湖上的代号为摩尔,可能是一个人,或者是一群人。摩尔缠论,基于缠论的核心思想与基础理论&#…

Windows下Linkis1.5DSS1.1.2本地调试

1 Linkis: 参考: 单机部署 | Apache Linkis技术分享 | 在本地开发调试Linkis的源码 (qq.com)DataSphere Studio1.0本地调试开发指南 - 掘金 (juejin.cn) 1.1 后端编译 参考【后端编译 | Apache Linkis】】 修改linkis模块下pom.xml,将mysql.connetor.scope修改…

数据结构 | 查找

基本概念 关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。例如,在由一个学生元素构成的数据集合中,学生元素中“学号”这一数据项的值唯一地标识一名学生。 查找表&a…

从零开始的c语言日记day37——数组指针练习

一、 取地址数组储存在了*p里,里面储存的是整个数组的地址但本质也是第一个元素的地址解引用后1为4个字节所以就可以打印数组了。但一般不用这种方法 这样更方便一些 打印多维数组 如果不用这样传参,用指针传参怎么做呢? Main里函数的arr表示…

22款奔驰GLE450升级原厂360全景影像 超广角的视野

360全景影像影像系统提升行车时的便利,不管是新手或是老司机都将是一个不错的配置,无论是在倒车,挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况,避免盲区事故发生,提升行车出入安全性。 360全景影像包含&…

网工内推 | 外企网工,五险一金,弹性工作,最高30k*14薪

01 金蝶软件(中国)有限公司 招聘岗位:网络工程师 职责描述: 1、合理规划公司网络,保障网络架构的合理性、可靠性及前瞻性; 2、负责公司网络运维,处理日常运维事件,保障网络的稳定可…

基于mvc的大学生家教信息网站系统php+vue

运行环境:phpstudy/wamp/xammp等 开发语言:php 后端框架:Thinkphp5 前端框架:vue.js 服务器:apache 数据库:mysql 数据库工具:Navicat/phpmyadmin 开发软件:hbuilderx/vscode/Dreamweaver/PhpSt…

不同路径 II(力扣LeetCode)动态规划

不同路径 II 题目描述 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。 现在考虑网格中有障碍物。…

freerots启动过程分析(qemu仿真RISC-V架构为例)

1、前言 本文是基于qemu上virt板子适配的freertos系统源码进行讲解qemu安装可参考博客:《qemu源码下载和安装》;freertos移植到qemu上运行可参考博客:《移植freertos到qemu上运行》; 2、汇编代码部分 汇编文件:FreeR…

qt实现一个安卓测试小工具

qt实现一个安卓测试小工具 最终效果:目录结构源码gui.py 主要是按钮,文本控制代码main.py 主要是逻辑代码gui.spec 是打包使用的adb.ui 最终效果: 目录结构 上面2个是打包的生成的不用管 源码 gui.py 主要是按钮,文本控制代码…

vue3怎么提升效率的?为什么vue3比vue2快?效率提升主要在哪些方面?

官方文档中说vue3在 客户端渲染效率比vue2提升了1.3~2倍, SSR渲染效率比vue2提升了2~3倍,那么究竟是怎么提升的呢? 一、静态提升 在 vue3项目中的package.json文件中,可以看到这个 vue/compiler-sfc,它是用来解析(.v…

数据在内存中的存储练习题

数据在内存中的存储练习题 文章目录 数据在内存中的存储练习题1. 练习一2.练习二3. 练习三4. 练习四5. 练习五6. 练习六7. 总结 1. 练习一 #include <stdio.h>int main() {char a -1;signed b -1;unsigned char c -1;printf("a %d b %d c %d", a, b, c)…

PHP+vue+elementui高校学生社团信息管理系统o7q4a

社团是由高校用户依据兴趣爱好自愿组成&#xff0c;按照章程自主开展活动的用户组织。高校社团是实施素质教育的重要途径和有效方式&#xff0c;在加强校园文化建设、提高用户综合素质、引导用户适应社会、促进用户交流等方面发挥着重要作用&#xff0c;是新形势下有效凝聚用户…

Echarts legend图例配置项 设置位置 显示隐藏

Echarts 官网完整配置项 https://echarts.apache.org/zh/option.html#legend 配置项 legend: { }设置图例为圆形 icon: circle,//设置图例为圆形设置图例位置 top: 20%//距离顶部百分之20//y:bottom 在底部显示设置图例 宽度 高度 itemWidth: 10,//设置图例宽度 itemHeight: …

PCL 计算点云图中任意两点的欧式距离

目录 一、算法原理二、代码实现三、结果展示四、相关链接本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫与GPT。 一、算法原理 使用PCL实现在可视化界面上用鼠标点选两个点,输出两点的坐标和两点之间的欧式距离。 二、代码…

HttpRunner原来还能这么用,大开眼界!!!

hook机制 Httprunner 框架中的 hook 机制相当于unittest框架中的 setup , teardown 函数&#xff0c;用来进行测试用例执行之前的环境初始化以及测试用例执行完毕之后的环境清理操作。 httprunner 中的 hooks 机制可以用在测试用例层级也可以用在测试步骤层级&#xff0c;其关键…

OSG编程指南<十三>:OSG渲染状态

1、前言 在 OSG 中存在两棵树&#xff0c;即场景树和渲染树。渲染树是一棵以 StateSet 和 RenderLeaf 为节点的树&#xff0c;它可以做到 StateSet 相同的 RenderLeaf 同时渲染而不用切换 OpenGL状态&#xff0c;并且做到尽量少但在多个不同 State 间切换。渲染树在 CullVisito…

01 项目架构

关于我 曾经就职于蚂蚁金服&#xff0c;多年的后端开发经验&#xff0c;对微服务、架构这块研究颇深&#xff0c;同时也是一名热衷于技术分享、拥抱开源技术的博主。 个人技术公众号&#xff1a;码猿技术专栏个人博客&#xff1a;www.java-family.cn 前期一直在更新《Spring…

sqli-labs关卡21(基于cookie被base64编码的报错盲注)通关思路

文章目录 前言一、回顾上一关知识点二、靶场需要了解的前置知识1、什么是base64编码&#xff1f; 三、靶场第二十一关通关思路1、判断注入点2、爆数据库名3、爆数据库表4、爆数据库列5、爆数据库关键信息 总结 前言 此文章只用于学习和反思巩固sql注入知识&#xff0c;禁止用于…