TCP为什么要三次握手?
TCP三次握手协议是为了在不可靠的互联网环境中可靠地建立起一个连接,三次握手可以确保两端的发送和接收能力都是正常的。
那么,为什么是三次而不是二次或四次握手呢?
为什么不是二次握手?
如果是二次握手,即客户端发送一个SYN到服务器,服务器回复一个SYN-ACK给客户端,此时就建立连接。
这种情况下,如果第一个SYN请求在网络中延迟了,并且客户端重新发送了SYN后建立了连接,那么当延迟的SYN请求到达服务器后,服务器会认为是新的连接请求,而此时客户端不会理会服务器的回应,导致服务器一直等待,浪费资源。
为什么不是四次握手?
四次握手会增加额外的延迟和复杂性,并且第四个握手并没有提供三次握手已经解决的问题的任何额外保证。
三次握手已经能够确认双方的发送和接收能力都是正常的,进一步的确认只会增加一次往返时间,降低建立连接的效率。
三次握手建立连接的过程:
-
客户端发送SYN:客户端选择一个随机的序列号x发送一个SYN报文,并进入SYN_SENT状态。
-
服务器发送SYN-ACK):服务器收到SYN报文,选择自己的序列号y,并发送一个SYN-ACK报文,服务器进入SYN_RCVD状态。
-
客户端发送ACK:客户端收到SYN-ACK报文后,会发送一个ACK报文,然后进入ESTABLISHED状态。

数据传输结束之后的四次挥手:
TCP的连接终止则需要四次挥手,这是因为TCP连接是全双工的,即通信双方都可以同时发送和接收信息。终止连接时,每个方向都需要单独关闭,所以就需要四次挥手。
-
客户端发送FIN:客户端决定数据发送完毕后,发送一个FIN报文。
-
服务器ACK:服务器收到这个FIN报文,发送一个ACK报文确认,并进入CLOSE_WAIT状态。
-
服务器发送FIN:服务器准备好关闭连接时,发送一个FIN报文。
-
客户端ACK:客户端收到FIN后,发送一个ACK报文,然后进入TIME_WAIT状态。经过一段时间后确保服务器收到ACK报文之后,客户端关闭连接。

生活中的例子:
可以将三次握手比作电话通话。当你拨打一个电话号码时,对方接听(第一次握手),你们开始互相问候确认对方能听到(第二次握手),然后你们开始对话(第三次握手)。
如果只问候一次,你可能不确定对方是否真的听到你;如果问候多次,就显得冗余和不效率。
通话结束后,你说“再见”挂断电话(第一次挥手),对方说“再见”后也挂断(第二次挥手),这样确保了双方都明白通话结束。
在电话通话快结束的时候:
你先说“你还什么别的吗,没有我就要挂了”(第一次挥手),等待对方回应,相当于发送了FIN包。
对方回应“等我想想还有什么”(第二次挥手),相当于对方发送了ACK包,但对方可能还有点儿事要处理,所以通话还未立刻结束。
过了一会儿,对方确认说“好了,我也没话了,那挂了”(第三次挥手),这时候对方发送了FIN包。
你回应“知道了,挂了”(第四次挥手),对应发送ACK包,之后双方都可以挂断电话,结束通话。
求一键三连:点赞、分享、收藏
点赞对我真的非常重要!在线求赞,加个关注我会非常感激!@小郑说编程
相关文章:
TCP为什么要三次握手?
TCP三次握手协议是为了在不可靠的互联网环境中可靠地建立起一个连接,三次握手可以确保两端的发送和接收能力都是正常的。 那么,为什么是三次而不是二次或四次握手呢? 为什么不是二次握手? 如果是二次握手,即客户端发…...
网络防御第6次作业
防病毒网关 按照传播方式分类 病毒 病毒是一种基于硬件和操作系统的程序,具有感染和破坏能力,这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地,它是病毒传播的目的地,又是下一次感染的出发点。计算机病毒感染的一般过…...
Jmeter分布式部署
前期准备: 1. 控制机一台,代理机一台,Jmeter安装包 操作步骤: 1. Linux安装Jmeter(windows安装教程自己搜一下) 1.1创建一个单独的文件夹(jmeter),用来存放Jmeter的安装包 mkdir jmeter 1.2…...
Odoo迈入开源第一低代码开发平台的重要里程碑
Odoo17的正式发布已经过去好几个月了,通过一段时间的运用,最大的感触就是,Odoo会成为企业管理软件低代码开发平台的重要一员,而V17则会成为这个过程中具有里程碑意义的版本。 时隔四个月,让我们回头来看看Odoo17带来的…...
WinForm、Wpf自动升级 AutoUpdater.NET
Github AutoUpdater.NET 目录 一、IIS部署 更新站点 二、创建Winform 一、IIS部署 更新站点 IIS默认站点目录下创建 目录 Downloads、Updates Updates目录创建文件 UpdateLog.html、AutoUpdaterStarter.xml UpdateLog.html: <html><body><h1…...
GPU不够用:语言模型的分布式挑战
引言 随着深度学习技术的飞速发展,大规模语言模型(LLM)在各种NLP任务中取得了令人瞩目的成绩。然而,这些模型的大小和复杂度也不断增加,给部署和应用带来了诸多挑战。特别是在单个GPU或服务器的内存容量有限的情况下,如何高效地利用分布式计算资源成为了一个亟待解决的问…...
深入理解Redis中的渐进式Rehash技术
1. 引言 Redis是一款高性能的键值存储系统,被广泛应用于缓存、队列、计数器等场景,因其快速、稳定的特性备受开发者青睐。在Redis的背后,有着许多复杂的数据结构和算法支撑着其高效运行,而其中之一就是Rehash操作。 Rehash是Redis中的一个关键操作,负责在数据量增加时对…...
数据结构 栈和队列 力扣例题AC——代码以及思路记录
20. 有效的括号 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应…...
管理类联考--复试--英文面试--各校英文面试内容
文章目录 北京地区北京大学中国人民大学北京交通大学北京航空航天大学北方工业大学北京林业大学北京语言大学中央财经大学对外经济贸易大学首都经济贸易大学华北电力大学中国矿业大学中国石油大学北京国家会计学院中国财政科学院研究院北京理工大学北京工商大学中国农业大学 湖…...
Android修行手册-Chaquopy中opencv、numpy的初步应用
Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分…...
VBA将当前打开的表格生成PDF图片
前言 VBA将当前的表格存储成PDF文件进行存储 代码 Sub ExportToPDF()Dim FilePath As StringDim FileName As StringDim ExportRange As Range 设置导出文件路径及名称FilePath "D:\Users\"FileName "ExportedPDF" 设置导出区域范围Set ExportRange Ra…...
解锁AI大模型秘籍:未来科技的前沿探索
在当今这个技术高速发展的时代,人工智能(AI)已经成为了我们生活中不可或缺的一部分。从简单的个人助手到复杂的数据分析和决策制定,AI的应用范围日益扩大,其目的是为了让我们的生活变得更加智能化。本文旨在探讨AI如何…...
一文带你了解MySQL之B+树索引的原理
前言 学完前面我们讲解了InnoDB数据页的7个组成部分,知道了各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边儿的记录生成一个页目录,在通过主键查…...
【Vue】npm run build 打包报错:请在[.env.local]中填入key后方可使用...
报错如下 根目录添加 .env.local 文件 .env.local :本地运行下的配置文件 配置:VUE_GITHUB_USER_NAME 及 VUE_APP_SECRET_KEY 原因...
中国电子学会2020年06月真题C语言软件编程等级考试三级(含详细解析答案)
中国电子学会考评中心历届真题(含解析答案) C语言软件编程等级考试三级 2020年06月 编程题五道 总分:100分一、最接近的分数(20分) 分母不超过N且小于A/B的最大最简分数是多少? 时间限制: 1000ms 内存限制: 65536kb 输入…...
WPF的DataGrid自动生成中文列头
直接将一个对象集合绑定到DataGrid上面,设置自动生成列AutoGenerateColumns"True",DataGrid会自动根据对象类的属性生成对应的列 示例类对象: public class DataModel{public int Id { get; set; }public string Name { get; set;…...
CSS【详解】居中对齐 (水平居中 vs 垂直居中)
水平居中 内部块级元素的宽度要小于容器(父元素) 方案一:文本居中对齐(内联元素) 限制条件:仅用于内联元素 display:inline 和 display: inline-block; 给容器添加样式 text-align:center<!DOCTYPE html> <html lang&q…...
【排序算法】基数排序
一:基本概念 1.1 基数排序(桶排序)介绍 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是…...
解释存储过程和函数的区别,以及它们在MySQL中的用途。如何创建和使用存储过程和函数?
解释存储过程和函数的区别,以及它们在MySQL中的用途。 存储过程和函数在MySQL中的区别及用途 区别: 返回值: 函数:必须有一个返回值,这可以是一个标量值或一个表。如果没有明确的RETURN语句,函数将返回N…...
【GPU驱动开发】-GPU架构简介
前言 不必害怕未知,无需恐惧犯错,做一个Creator! GPU(Graphics Processing Unit,图形处理单元)是一种专门用于处理图形和并行计算的处理器。GPU系统架构通常包括硬件和软件层面的组件。 一、总体流程 应…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
