TCP—三次握手和四次挥手
目录
一、三次握手和四次挥手的目的
二、TCP可靠的方面
三、什么是三次握手
四、第三次握手的目的
五、什么是四次挥手
六、超时时间的目的
七、SYN包、ACK包、FIN包
八、解决丢包和乱序
九、参考资料
一、三次握手和四次挥手的目的
TCP三次握手的目的主要是为了确保两个网络端点(即客户端和服务器)在数据传输开始前能够建立一个可靠的连接。
TCP四次挥手的目的是为了正确、可靠地终止两个网络端点(客户端和服务器)之间的已建立连接。这个过程确保了双方都有机会完成数据的发送和接收,同时正确地关闭连接。
这两个目的也就造就了TCP连接、可靠的特点。
二、TCP可靠的方面
1.序列号和确认应答:
TCP为每个发送的数据包分配一个序列号,并要求接收端对收到的数据包发送确认应答(ACK)。如果发送端在合理的超时时间内没有收到确认应答,它会重新发送该数据包。这确保了数据的有序传输和不丢失。
2.数据重传:
如果因为网络拥堵、路径变化或其他原因导致数据包丢失或错误,TCP会自动重传这些数据包,直到收到确认应答为止。这保证了数据的可靠传输。
3.流量控制:
TCP使用窗口大小控制机制来防止发送方过快发送数据,使得接收方来不及处理。窗口大小可以动态调整,以适应接收方的处理能力,避免数据溢出。
4.拥塞控制:
TCP实现了拥塞控制算法(如慢启动、拥塞避免、快速重传和快速恢复),以减少网络拥堵情况下的数据包丢失。这些算法通过动态调整数据的发送速率来适应网络状况。
5.有序数据传输:
即使数据包在网络中的传输过程中到达顺序发生了变化,TCP也能确保数据以正确的顺序交付给应用程序。
6.错误检测:
TCP头包含了校验和字段,用于检测数据在传输过程中是否出现错误。如果检测到错误,受影响的数据包将会被丢弃并重新请求传输。
三、什么是三次握手
客户端先向服务端发送 SYN 包请求建立连接,然后服务端向客户端发送 SYN+ACK 包同意连接,客户端收到 SYN+ACK 包后发送 ACK 包,服务端收到这个 ACK包 后,连接建立。因为这个过程中互相发送了三包数据,所以称之为三次握手。
四、第三次握手的目的
客户端先向服务端发送 SYN 包请求建立连接,然后服务端向客户端发送 SYN+ACK 包同意连接后大可以直接连接,为什么客户端要再发送一个 ACK 包,服务端接收到这个 ACK 包后再进行连接?
这是为了防止失效的连接请求突然被接受,如果一个旧的连接请求在网络中延迟,并在连接已经建立后到达,三次握手可以帮助识别和拒绝这些失效的请求,避免可能的连接混乱。
例如:client端先向server端发送一个 SYN1 包请求建立连接,但是这个 SYN1 包在网络中延迟没有到达server端,client端又向server端发送一个 SYN2 包请求建立连接,SYN2 包到达了server端,如果紧接着 SYN1 包也到达了server端,那么对于server端来说认为client端建立了两次连接,而client端任务连接了一次连接。
五、什么是四次挥手
下面假设主动关闭方为客户端,被动关闭方为服务端。
客户端发起连接终止请求:发送一个 FIN 包,表示它已经完成了数据发送,并希望关闭连接。
服务端关闭确认收到 FIN 包:发送一个 ACK 包来确认收到的 FIN 包。
服务端关闭发送自己的 FIN 包:发送一个 FIN 包,表示它也准备好关闭连接。
客户端确认收到对方的 FIN 包:发送一个 ACK 包来确认收到的 FIN 包。
服务端收到 ACK 包 后立即关闭连接,客户端必须要经过超时时间(Timeout)后关闭连接。
六、超时时间的目的
超时时间(Timeout)主要用于确保连接能够在特定时间内正确地终止,即使在面对网络延迟、数据包丢失或对方无响应等不稳定因素时也能保证连接的可靠关闭。
例如:FIN-WAIT-2 发送的 ACK 包在网络中丢失了或者因为延迟被关闭方迟迟没有收到 ACK 包,此时如果关闭方关闭连接,被关闭方收不到 ACK 包就会一直处于等待关闭的状态,为了避免这种情况,关闭方必须进行一段超时时间等待,以便被关闭方重新发送一个 FIN 包,关闭方则会重发一个 ACK 包。
七、SYN包、ACK包、FIN包
TCP协议中,SYN包和ACK包是用于建立、确认和管理连接的重要控制包。它们在三次握手和四次挥手过程中起着关键作用:
(一)、SYN包(同步包)
全称:Synchronize packet
作用:用于发起和建立一个新的TCP连接。SYN包是TCP连接建立过程中发送的第一个包。
特性:SYN包包含一个同步标志位(SYN=1)和初始序列号。它不包含实际的数据,只是用于连接初始化。
使用场景:在三次握手的第一步和第二步中使用。
第一步:客户端向服务器发送一个SYN包,以请求建立连接。
第二步:服务器收到SYN包后,回送一个包含SYN和ACK标志的包(SYN=1, ACK=1),以确认收到客户端的请求。
(二)、ACK包(确认包)
全称:Acknowledgment packet
作用:用于确认已经接收到的数据包。ACK包是TCP协议中几乎每个数据包都会带有的一个标志,用于确保数据的可靠传输。
特性:ACK包包含一个确认标志位(ACK=1)和确认号。确认号是对已成功接收到的数据包的下一序列号。
使用场景:三次握手:第二步:服务器向客户端发送SYN+ACK包,确认收到客户端的SYN请求,同时向客户端发送自己的SYN请求。
第三步:客户端收到服务器的SYN+ACK包后,回送一个ACK包(ACK=1),确认收到服务器的SYN请求。
四次挥手:每一步:在连接的终止过程中,双方发送FIN包(结束标志),并对收到的FIN包发送ACK包以确认。
数据传输:在数据传输过程中,每发送一个数据包后,接收方都会发送一个ACK包来确认接收到的数据,确保数据的可靠传输。
三次握手过程中的SYN和ACK包示意图:
①客户端 -> 服务器:
SYN=1, Seq=x
②服务器 -> 客户端:
SYN=1, ACK=1, Seq=y, Ack=x+1
③客户端 -> 服务器:
ACK=1, Seq=x+1, Ack=y+1
通过这些控制包,TCP能够建立可靠的连接,确保数据的有序和完整传输。
(三)、FIN包(结束包)
全称:Finish packet
作用:用于终止一个TCP连接。FIN包表示发送方已经完成数据发送,并希望关闭连接。
特性:FIN包包含一个结束标志位(FIN=1),通常还包括一个序列号。它不包含实际的数据。
使用场景:在四次挥手过程中使用。
四次挥手过程的详细示意图:
客户端 -> 服务器:
FIN=1, Seq=u
服务器 -> 客户端:
ACK=1, Seq=v, Ack=u+1
服务器 -> 客户端:
FIN=1, Seq=w
客户端 -> 服务器:
ACK=1, Seq=u+1, Ack=w+1
通过这种方式,TCP确保在关闭连接时,双方都能完成数据发送和接收,并且资源能够被正确释放,避免了潜在的资源泄露和连接混乱问题。这种优雅的关闭过程确保了网络通信的可靠性和稳定性。
八、解决丢包和乱序
推荐大家观看视频一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili
一包数据有可能会被拆成多包发送,如何处理丢包问题;这些数据包到达的先后顺序不同,如何处理乱序问题。
针对这些要求,TCP协议为每一个连接建立了一个发送缓冲区,从建立链接后的第一个字节的序列号为0,后面每个字节的序列号就会增加1。
发送数据时从发送缓冲区取一部分数据组成发送报文,在发送报文 tcp 协议头中会附带序列号和长度,接受端在收到数据后需要回复确认报文,确认报文中的 ACK等于接收序列号加长度,也就是下一包数据需要发送的起始序列号,这样一问一答的发送方式能够使发送端确认发送的数据已经被对方收到,发送端也可以一次发送连续的多包数据,接收端只需要回复一次ACK就可以了。
这样发送端可以把待发送的数据分割成一系列的碎片发送到对端,对端根据序列号的长度在接收后重构出完整的数据,假设其中丢失了某些数据包,则接收端可以要求发送端重传。
比如丢失了100-199这100个字节,接收端向发送端发送ACK=100的报文,发送端收到后重传这一包数据,接收端进行补齐。以上过程不区分客户端和服务端,tcp 连接是全双工的,对于两端来说均采用上述机制。
九、参考资料
谢希仁. 计算机网络(第8版). 电子工业出版社. 2021
https://www.youtube.com/watch?v=Iuvjwrm_O5g
TCP三次握手和四次挥手_哔哩哔哩_bilibili
一条视频讲清楚TCP协议与UDP协议-什么是三次握手与四次挥手_哔哩哔哩_bilibili
相关文章:

TCP—三次握手和四次挥手
目录 一、三次握手和四次挥手的目的 二、TCP可靠的方面 三、什么是三次握手 四、第三次握手的目的 五、什么是四次挥手 六、超时时间的目的 七、SYN包、ACK包、FIN包 八、解决丢包和乱序 九、参考资料 一、三次握手和四次挥手的目的 TCP三次握手的目的主要是为了确保两…...

基于UDP的网络聊天室
一.项目需求: 如果有用户登录,其他用户可以收到这个人的登录信息如果有人发送信息,其他用户可以收到这个人的群聊信息如果有人下线,其他用户可以收到这个人的下线信息服务器可以发送系统信息 二.服务器端 #include <myhead.h&…...
数组-两个升序数组中位数
一、题目描述 二、解题思路 (一).基本思想: 如果列表总长度allsize( arr1.size()arr2.size() ) 为奇数时,中位数位置应该在两个列表排序后的第 allsize/2 位置处,如果allsize为偶数,中位数应该取 (allsize/2)-1 和 allsize/2 的…...

每日一题《leetcode--116.填充每个结点的下一个右侧结点》
https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/ 题目要求给每个结点的next指针进行填充,使每个结点的next指针指向其下一个右侧结点。如果右侧没有结点,则将next指针设置为空。 struct Node* connect(struct Node* root) {…...
【MySQL精通之路】InnoDB(6)-磁盘结构(5)-Redolog
主博客: 【MySQL精通之路】InnoDB(6)-磁盘上的InnoDB结构-CSDN博客 上一篇: 【MySQL精通之路】InnoDB-双写缓冲区-CSDN博客 下一篇: 目录 1.配置Redo Log容量(MySQL 8.0.30或更高版本) 2.配置重做日志容量(MySQL…...
【探索自然语言处理:构建一个简单的文本分类器】
文章目录 前言文本预处理特征提取模型训练文本分类结论 前言 在信息时代,文本数据无处不在,从社交媒体帖子到客户反馈,文本是沟通和信息交流的主要媒介。自然语言处理(NLP)是人工智能的一个分支,它使计算机…...

概率论统计——大数定律
大数定律 弱大数定律(辛钦大数定律) 利用切比雪夫不等式,证明弱大数定律 应用 伯努利大数定理,(辛钦大数定理的推论) 证明伯努利大数定理 注意:这里将二项分布转化成0,1分布来表示,…...
vscode终端命令行前面出现两个conda环境名的问题决解方法
已经安装了conda,打开vscode的terminal时,命令行前面有两个虚拟环境名。 进入vscode的setting 找到Python->Python:Default Interpreter Path,把这个值复位,就可以解决。 如果不想前面带(base),可以运行 conda co…...

“AI黏土人”一夜爆火,图像生成类应用应该如何长期留住用户?
文章目录 最近大火的“AI黏土人”,一股浓浓的《小羊肖恩》风。 凭借这这种搞怪的风格,“AI黏土人”等图像生成类应用凭借其创新技术和市场需求迅速崛起并获得巨大关注。然而,要保持用户黏性并确保长期发展,这些应用需要采取一系列…...
【MySQL精通之路】SQL优化(1)-查询优化(12)-块嵌套循环和批处理Key访问联接
在MySQL中,可以使用批处理Key访问(BKA)联接算法,该算法使用对联接表的索引访问和联接缓冲区。 BKA算法支持内联接、外联接和半联接操作,包括嵌套的外部联接。 BKA的优点包括由于更高效的表扫描而提高了联接性能。 此…...

SQL使用函数给多个分表添加同一字段
数据库中分表时,往往需要向多个分表中添加同一个字段,可以定义一个函数,每次调用这个函数向多个份表中添加同意字段。 1、创建函数示例: 在PostgreSQL中创建一个简单的函数 以下是一个在PostgreSQL中创建函数的简单示例&#x…...

OpenAI 再次刷新认知边界:GPT-4 颠覆语音助手市场,流畅度直逼真人互动?
前言 近日,美国人工智能研究公司 OpenAI 发布了其最新旗舰模型 GPT-4o,这一革命性的进展不仅标志着人工智能领域的新突破,更预示着即将步入一个全新的交互时代?GPT-4o 的发布,对于我们来说,意味着人工智能…...

UE5 使用外置摄像头进行拍照并保存到本地
连接外置摄像头功能:https://docs.unrealengine.com/4.27/zh-CN/WorkingWithMedia/IntegratingMedia/MediaFramework/HowTo/UsingWebCams/ 核心功能:UE4 相机拍照功能(图片保存)_ue 移动端保存图片-CSDN博客 思路是: …...

【C++】从零开始map与set的封装
送给大家一句话: 今日的事情,尽心、尽意、尽力去做了,无论成绩如何,都应该高高兴兴地上床恬睡。 – 三毛 《亲爱的三毛》 🌃🌃🌃🌃🌃🌃🌃&#x…...
Python可以声明并赋值一个hash类型变量吗?
在Python中,不能直接声明一个变量为hash类型,因为Python是一种动态类型语言,不需要(也不能)在声明变量时指定其类型。变量的类型是根据赋给它的值自动推断的。 将一个哈希值(即一个整数)赋值给…...

苗情灾情监控系统—提高农业生产效率
TH-MQ2苗情灾情监控系统是一种用于监测农作物生长状况和灾情的设备,通过实时监测和数据分析,帮助农民及时了解作物生长情况,采取相应的管理措施,提高农业生产效率和降低生产成本。 该系统通常由多种传感器、摄像头、数据传输模块等…...
wpf自定义按钮样式
在WPF中,自定义按钮样式可以通过创建一个ControlTemplate来实现。以下是一个简单的自定义按钮样式的例子: 首先,在你的WPF项目资源字典中定义按钮的ControlTemplate。 <Window.Resources><ControlTemplate x:Key"CustomButto…...

Meme币总市值突破630亿美元 以太坊ETF获批意味着代币化资产“完全安全”
近日,数字货币市场再次掀起轩然大波。一方面,Meme币总市值突破了630亿美元,令人瞠目结舌;另一方面,以太坊ETF的获批也引发了市场的广泛关注,被视为代币化资产的“完全安全”标志。 Meme币总市值飙升 Meme币…...

MySQL数据库语法(二)
一、数据库的创建 创建数据库CRATE DATABASE语法:CREATE DATABASE [IF NOT EXISTS]数据库名;功能:用给定的名字创建一个数据库如果数据库已经存在,发生一个错误。查看创建数据库:SHOW CREATE DATABASE <数据库名>ÿ…...

Linux makefile
Linux makefile 用makefile去自动编译和删除静态库和动态库 在实际开发中,项目的源代码文件比较多,按类型、功能、模块分别存放在不同的目录和文件中,哪些文件需要先编译,那些文件后编译,那些文件需要重新编译…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

大模型——基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程
基于Docker+DeepSeek+Dify :搭建企业级本地私有化知识库超详细教程 下载安装Docker Docker官网:https://www.docker.com/ 自定义Docker安装路径 Docker默认安装在C盘,大小大概2.9G,做这行最忌讳的就是安装软件全装C盘,所以我调整了下安装路径。 新建安装目录:E:\MyS…...
Python第七周作业
Python第七周作业 文章目录 Python第七周作业 1.使用open以只读模式打开文件data.txt,并逐行打印内容 2.使用pathlib模块获取当前脚本的绝对路径,并创建logs目录(若不存在) 3.递归遍历目录data,输出所有.csv文件的路径…...
Linux中INADDR_ANY详解
在Linux网络编程中,INADDR_ANY 是一个特殊的IPv4地址常量(定义在 <netinet/in.h> 头文件中),用于表示绑定到所有可用网络接口的地址。它是服务器程序中的常见用法,允许套接字监听所有本地IP地址上的连接请求。 关…...