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系统架构通常包括硬件和软件层面的组件。 一、总体流程 应…...
Playwright CLI 使用指南 —— 现代浏览器自动化利器
Playwright CLI 使用指南 —— 现代浏览器自动化利器 Playwright CLI 是微软推出的命令行浏览器自动化工具,专为现代编码代理(Coding Agents)优化。它通过简洁的 CLI 命令暴露浏览器工作流,相比 MCP 协议更加 Token 高效ÿ…...
CLIP-GmP-ViT-L-14保姆级教学:7860端口访问失败的5种解决方案
CLIP-GmP-ViT-L-14保姆级教学:7860端口访问失败的5种解决方案 你是不是刚部署好CLIP-GmP-ViT-L-14模型,满心欢喜地打开浏览器,输入http://localhost:7860,结果却只看到一个无法访问的页面?别着急,这个问题…...
STM32F030K6T6 定时器触发ADC采样的DMA传输实战
1. 为什么需要定时器触发ADC采样? 在嵌入式开发中,ADC(模数转换器)采样是获取模拟信号的关键环节。传统的手动触发或查询式ADC采样存在两个明显痛点:一是需要CPU频繁介入,二是采样间隔难以精确控制。比如用…...
从零开始掌握ky:基于fetch的轻量级HTTP客户端实战指南
1. 为什么你需要ky这个HTTP客户端? 如果你经常用JavaScript写前端项目,肯定对原生fetch不陌生。这个浏览器自带的API确实解决了XMLHttpRequest的很多痛点,但用久了就会发现它有不少"反人类"设计。比如: 必须手动检查res…...
DamoFD开源模型企业级运维:Prometheus监控指标+Grafana看板配置
DamoFD开源模型企业级运维:Prometheus监控指标Grafana看板配置 在实际生产环境中,部署一个轻量级但高精度的人脸检测模型只是第一步。真正决定它能否长期稳定服务的,是背后一整套可观测性体系——尤其是对GPU资源消耗、推理延迟、请求吞吐、…...
手把手教你用C语言开发扫雷小游戏
C语言:扫雷游戏一.游戏逻辑分析与结构框架1.棋盘的创建2.布置炸弹3.排除炸弹二.游戏实现1.头文件game.h2.源文件game.c3.源文件test.c在此之前我们已经对分支与循环语句、数组和函数有了一定得了解,接下来我们将写一个简单的扫雷游戏代码,在写…...
Buzz终极指南:3个技巧实现高效本地音频转录
Buzz终极指南:3个技巧实现高效本地音频转录 【免费下载链接】buzz Buzz transcribes and translates audio offline on your personal computer. Powered by OpenAIs Whisper. 项目地址: https://gitcode.com/GitHub_Trending/buz/buzz Buzz是一款基于OpenAI…...
PyBroker:构建机器学习驱动的量化交易系统
PyBroker:构建机器学习驱动的量化交易系统 【免费下载链接】pybroker Algorithmic Trading in Python with Machine Learning 项目地址: https://gitcode.com/gh_mirrors/py/pybroker 在算法交易的世界中,数据驱动的决策正逐渐取代传统的主观判断…...
分布式推荐系统架构解析:Gorse的设计原理与实现机制
分布式推荐系统架构解析:Gorse的设计原理与实现机制 【免费下载链接】gorse AI powered open source recommender system engine supports classical/LLM rankers and multimodal content via embedding 项目地址: https://gitcode.com/gh_mirrors/go/gorse …...
3步配置指南:在VSCode中构建高效的Fortran开发环境
3步配置指南:在VSCode中构建高效的Fortran开发环境 【免费下载链接】vscode-fortran-support Fortran language support for Visual Studio Code 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-fortran-support Modern Fortran扩展为Visual Studio Co…...
