TCP通信三次握手、四次挥手
目录
前言
一、三次握手
TCP三次握手的详细过程
二、四次挥手
四次挥手的详细过程
前言
前面我说到了,UDP通信的实现,但我们经常说UDP通信不可靠,是因为他只会接收和发送,并不会去验证对方收到没有,那么我们说TCP通信可靠,就是因为他会进行验证接收端是否能够接收和发送,并且只有在验证通过的情况下才会发送数据,并且会通过一些操作来保证数据发送的完整性。本小节主要介绍TCP通信过程中如何通过三次握手和四次挥手来保证数据的传输。
一、三次握手
TCP(Transmission Control Protocol)通信中,三次握手是指在客户端和服务器之间建立可靠连接时的三步过程。这一过程的目的是确保双方都能够准备好进行数据传输,并且能确认彼此的接收和发送能力。视频链接:屏幕录制 2024-09-10 221512-CSDN直播

TCP三次握手的详细过程
第一次握手:客户端发送SYN包
- 客户端向服务器发送一个SYN(Synchronize)标志位为1的TCP报文段,表示客户端想要发起连接,并请求同步序列号(Sequence Number)。
- 在这个阶段,客户端会生成一个初始序列号(ISN,Initial Sequence Number),并将这个序列号放入报文中。
- 报文格式:
SYN = 1, SEQ = x(x是客户端的初始序列号)第二次握手:服务器回复SYN-ACK包
- 服务器收到客户端的SYN报文后,理解到客户端想建立连接。于是,服务器也生成一个自己的初始序列号,并发送一个SYN-ACK(Acknowledgment)报文段回给客户端,表示接收到客户端的连接请求。
- 在这个SYN-ACK报文中:
- SYN = 1:表示服务器同意建立连接。
- ACK = 1:表示确认客户端发出的SYN。
- ACK序列号:
x + 1,表示确认客户端的序列号x。- 服务器同时也会发送自己的序列号
y。- 报文格式:
SYN = 1, ACK = 1, SEQ = y, ACK = x + 1第三次握手:客户端发送ACK包
- 客户端收到服务器的SYN-ACK报文后,确认服务器收到了自己的连接请求,接着客户端发送一个确认报文段(ACK = 1)给服务器,确认服务器的SYN和ACK。
- 在这个ACK报文中:
- ACK = 1,表示确认服务器的序列号。
- ACK序列号:
y + 1,表示确认服务器的序列号y。- 报文格式:
ACK = 1, SEQ = x + 1, ACK = y + 1此时,双方都已经完成了三次握手,客户端和服务器之间的TCP连接已经建立,接下来可以开始数据传输。
我们可以这样理解:
客户端需要知道:客户端自己的接收和发送能力;服务器的接收和发送能力;
服务器需要知道:客户端的接收和发送能力;服务器自己的接收和发送能力;
第一次握手:客户端发送请求,服务器接收请求,这时,服务器知道自己有接收能力;其余能力没有。
第二次握手:服务器发送信号告诉客户端,自己知道了客户端的连接请求,等到信号传递到客户端之后,这时,客户端知道服务器有接收能力,发送能力;客户端也知道了自己有发送能力,和接收能力,但是服务器不知道客户端有没有接收能力。
第三次握手:客户端发送信号给服务器表示自己知道了服务器有发送和接收能力,等到服务器接收到信号以后,服务器知道了客户端收到了第二次握手发送的数据,这时,服务器知道客户端有接收能力;
到此:客户端知道自己和对方有的接收和发送能力;服务器也知道的自己和对方有接收和发送能力;
二、四次挥手
四次挥手是指在TCP(Transmission Control Protocol)通信中,客户端与服务器之间关闭连接的过程。与三次握手类似,四次挥手也是为了确保双方能够有序地终止连接。由于TCP是全双工通信协议,即通信双方都可以同时发送和接收数据,因此关闭连接时需要双方都同意停止发送和接收数据,整个过程需要四个步骤,称为“四次挥手”。

四次挥手的详细过程
第一次挥手:客户端发送FIN包
- 当客户端想要结束数据传输时,它会发送一个**FIN(Finish)**标志位为1的报文,告诉服务器它已经不再发送数据了,但仍然可以接收来自服务器的数据。
- 这时,客户端进入FIN_WAIT_1状态,等待服务器的响应。
- 报文格式:
FIN = 1, SEQ = x(x为当前的序列号)第二次挥手:服务器回复ACK包
- 服务器收到客户端的FIN报文后,回复一个ACK(Acknowledgment)报文,表示它收到了客户端的请求,但此时服务器可能仍然有数据要发送,因此不会立即关闭连接。
- 服务器发送的ACK报文中的确认号为
x + 1,表示确认客户端的序列号x。- 此时,客户端进入FIN_WAIT_2状态,继续等待服务器的FIN报文,而服务器进入CLOSE_WAIT状态,准备关闭连接。
- 报文格式:
ACK = 1, SEQ = y, ACK = x + 1第三次挥手:服务器发送FIN包
- 当服务器处理完剩余的数据并准备好关闭连接时,它会发送一个FIN报文,通知客户端它也准备结束通信,不再发送数据了。
- 服务器此时进入LAST_ACK状态,等待客户端的最后确认。
- 报文格式:
FIN = 1, SEQ = y(y为服务器当前的序列号)第四次挥手:客户端回复ACK包
- 客户端收到服务器的FIN报文后,回复一个ACK报文,确认服务器已经关闭连接。
- 发送完ACK报文后,客户端进入TIME_WAIT状态,等待一定的时间(通常为2个最大段寿命时间,2MSL,Maximum Segment Lifetime),以确保服务器收到这个ACK报文后不会重发FIN报文。如果在此期间没有收到任何新数据包,客户端才正式关闭连接,进入CLOSED状态。
- 服务器收到客户端的ACK报文后,也进入CLOSED状态,连接彻底关闭。
- 报文格式:
ACK = 1, SEQ = x + 1, ACK = y + 1
相关文章:
TCP通信三次握手、四次挥手
目录 前言 一、三次握手 TCP三次握手的详细过程 二、四次挥手 四次挥手的详细过程 前言 前面我说到了,UDP通信的实现,但我们经常说UDP通信不可靠,是因为他只会接收和发送,并不会去验证对方收到没有,那么我们说TCP通…...
【实施文档】软件项目实施方案(Doc原件2024实际项目)
软件实施方案 二、 项目介绍 三、 项目实施 四、 项目实施计划 五、 人员培训 六、 项目验收 七、 售后服务 八、 项目保障措施软件开发管理全套资料包清单: 工作安排任务书,可行性分析报告,立项申请审批表,产品需求规格说明书&am…...
BeanFactory vs. ApplicationContext
在Spring框架中,BeanFactory和ApplicationContext都是用于管理Spring容器中的bean的接口,但它们在功能和应用场景上有所不同。下面是它们的主要区别: 1. 基础功能 vs. 扩展功能 BeanFactory: 是Spring框架的最基础的IoC容器,提供…...
JDBC客户端连接Starrocks 2.5
<?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://ma…...
004——双向链表和循环链表
目录 双向链表 双向链表的初始化(与单链表类似) 增: Ⅰ)头插法 Ⅱ)尾插法 Ⅲ)中间插入 删 改 查 整体代码示例: 循环链表 循环单链表 编辑 循环双链表 双向链表 不同于单链表&…...
framebuffer帧缓存
framebuffer:帧缓冲,帧缓存 Linux内核为显示提供的一套应用程序接口。(驱动内核支持) framebuffer本质上是一块显示缓存,往显示缓存中写入特定格式的数据就意味着向屏幕输出内容。framebuffer驱动程序控制LCD显示设备࿰…...
24_竞赛中的高效并查集
菜鸟:老鸟,我最近在做一个与社交网络相关的项目,需要频繁地检查两个用户是否属于同一个群组。但我发现每次检查都很耗时,性能很差。你有什么建议吗? 老鸟:你可以试试使用并查集(Union-Find&…...
新手c语言讲解及题目分享(十七)--运算符与表达式专项练习
本文主要讲解c语言的基础部分,运算符与表达式的学习,在这一部分中,往往有许多细节的东西需要去记住。当各种运算符一起用时,就会存在优先级的关系,本文末尾有各种运算符的优先级顺序表。 参考书目和推荐学习书目&#…...
香帅的金融学讲义:深入剖析与解读
香帅的金融学讲义:深入剖析与解读 金融学,这个看似高深复杂的学科,实则与我们的生活息息相关。从个人理财到国家宏观经济政策,金融学无处不在。那么,如何更好地理解金融学呢?今天,我们就来借助…...
java基础-IO(6)转换流InputStreamReader、OutputStreamWriter
引入: 从第一节可知,流分为两类:字节流和字符流,转换流就是在两者之间进行转换。 字节流转换为字符流; 字符流转换为字节流。 字符集 字符集:定义了可用字符及其对应的数字编码的集合。常见的字符集有UT…...
使用Azure Devops Pipeline将Docker应用部署到你的Raspberry Pi上
文章目录 1. 添加树莓派到 Agent Pool1.1 添加pool1.2 添加agent 2. 将树莓派添加到 Deployment Pool2.1 添加pool2.2 添加target 3. 添加编译流水线3.1 添加编译命令3.2 配置触发器 4. 添加发布流水线4.1 添加命令行4.2 配置artifact和触发器 5. 完成 1. 添加树莓派到 Agent P…...
91、K8s之ingress上集
一、Ingress service模式: loadbalance NodePort:每个节点都会有一个指定的端口 30000-32767 内网 clusterip:默认模式,只能pod内部访问 externalName:需要dns提供域名 1.1、对外提供服务的ingress service&…...
NISP 一级 | 2.1 密码学
关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 通过上一章的学习,我们知道了,网络安全的 CIA 模型,而本期学习的“密码学”,则能为 CIA 模型提供很好的技术支持: 面临的攻击威胁所破坏…...
深度学习速通系列:混淆矩阵是什么
混淆矩阵(Confusion Matrix)是一种评估分类模型性能的工具,尤其在监督学习中用于分析分类结果。它通过一个矩阵的形式,将模型的预测结果与实际标签进行比较,从而可以清晰地看到模型在各个类别上的表现。以下是混淆矩阵…...
综合评价 | 基于熵权-变异系数-博弈组合法的综合评价模型(Matlab)
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 根据信息熵的定义,对于某项指标,可以用熵值来判断某个指标的离散程度,其信息熵值越小,指标的离散程度越大, 该指标对综合评价的影响(即权重&…...
模板与泛型编程笔记(一)
1. 推荐书籍 《C新经典 模板与泛型编程》难得的很容易看得懂的好书,作者讲技术不跳跃,娓娓道来,只要花点时间就能看懂。 2. 笔记 模板为什么要用尖括号?因为便于编译器解析,可以将模板和普通函数声明分开。其实尖括…...
ubuntu 和windows用samba服务器实现数据传输
1,linux安装samba服务器 sudo apt-get install samba samba-common 2,linux 配置权限,修改目录权限,linux下共享的文件权限设置。 sudo chmod 777 /home/lark -R 3. 添加samba用户 sudo smbpasswd -a lark 4,配置共享…...
NISP 一级 | 3.2 网络安全威胁
关注这个证书的其他相关笔记:NISP 一级 —— 考证笔记合集-CSDN博客 网络安全威胁主要来自攻击者对网络及信息系统的攻击,攻击者可以通过网络嗅探、网络钓鱼、拒绝服务、远程控制、社会工程学等网络攻击手段,获得目标计算机的控制权ÿ…...
【技术实践】MySQL分表分库全解析:从理论到实战
文章目录 【技术实践】MySQL分表分库全解析:从理论到实战1. 引言1.1 MySQL数据库面临的挑战1.2 分表分库的概念与优势 2. MySQL分表分库的基本原理2.1 水平分表2.2 垂直分表2.3 水平分库2.4 分表分库的选择标准 3. 实现分表分库的技术方案3.1 中间件解决方案3.2 自定…...
动手学深度学习(一)简介+预备知识+基础知识(上)
一、简介 1、机器学习 机器学习研究如何使用经验改善计算机系统的性能。 2、表征学习 表征学习是机器学习的一类,研究的是,如何自动学习出数据合适的表示方式,更好地由输入得到正确的输出。 3、深度学习 深度学习是具有多级表示的表征学…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
tauri项目,如何在rust端读取电脑环境变量
如果想在前端通过调用来获取环境变量的值,可以通过标准的依赖: std::env::var(name).ok() 想在前端通过调用来获取,可以写一个command函数: #[tauri::command] pub fn get_env_var(name: String) -> Result<String, Stri…...

