为什么TCP需要三次握手?一次不行吗?

文章目录

    • 1. 三次握手的过程
    • 2. 为什么需要三次握手?
    • 3. 握手过程中每一步的具体作用
    • 4. 简单比喻
    • 5. 为什么是三次握手,而不是两次或四次?
    • 6. 三次握手中的序列号有什么作用?
    • 7. 总结


1. 三次握手的过程

三次握手是建立 TCP 连接的过程,目的是确保通信双方能够可靠地建立连接。它的基本过程如下:

  • 第一次握手:客户端发送一个 SYN 报文给服务器,表示请求建立连接。
  • 第二次握手:服务器收到 SYN 后,发送 SYN+ACK 报文给客户端,表示确认收到请求,并同意建立连接。
  • 第三次握手:客户端收到 SYN+ACK 后,发送 ACK 报文给服务器,确认连接建立。

当这三步完成后,TCP 连接正式建立,双方可以开始通信。

在这里插入图片描述

2. 为什么需要三次握手?

三次握手的主要目的是防止已失效的连接请求报文被误接收,从而引发错误。

例如:如果没有三次握手,假设客户端第一次发送的 SYN 报文因网络延迟滞留很久,服务器收到后误以为是新的连接请求,发送 SYN+ACK,而客户端实际上已经关闭或不需要连接了。这样,服务器就会白白等待,浪费资源。

三次握手通过让客户端确认服务器的响应,确保双方都明确知道对方的通信能力,从而建立可靠的连接。

3. 握手过程中每一步的具体作用

第一次握手(SYN):

  • 客户端主动发送一个 SYN 报文,标志着它想要建立连接,同时携带一个序列号(Sequence Number,简写为 Seq)。
  • 作用:客户端告诉服务器,“我想和你建立连接,同时我的序列号是 X。”

第二次握手(SYN+ACK):

  • 服务器收到 SYN 报文后,会回复一个 SYN+ACK 报文,表示同意连接,并告知客户端它的初始序列号。
  • 作用:服务器告诉客户端,“我同意你的请求,我的序列号是 Y,同时我收到你的序列号 X。”

第三次握手(ACK):

  • 客户端收到 SYN+ACK后,再发送一个 ACK 报文,确认连接已建立。
  • 作用:客户端告诉服务器,“我确认收到你的序列号 Y,同时你也收到了我的序列号 X,我们可以正式通信了。”

4. 简单比喻

假设一个日常场景:你和朋友约好电话联系。

第一次握手: 你拨通朋友的号码,电话响了(客户端发送SYN)。

  • 作用:表示你希望和朋友建立通话。

第二次握手: 朋友接起电话并回应:“喂,你好”(服务器发送 SYN+ACK)。

  • 作用:朋友同意与你通话,并向你确认他可以正常接收你的声音。

第三次握手: 你说:“你好,我能听到你,我们可以聊天了。”(客户端发送ACK)。

  • 作用:确认双方的通信能力正常,通话开始。

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

两次握手的问题:

  • 如果仅用两次握手,服务器在收到客户端的第一次 SYN 后就认为连接已经建立,这可能导致服务器被无效连接请求拖累。三次握手让客户端确认了服务器的响应,避免了这种情况。

为什么不需要四次握手?

  • 四次握手会浪费一次额外的交互,在双方都已确认的情况下没有必要。三次握手已经足够确保双方的通信能力和连接的可靠性。

6. 三次握手中的序列号有什么作用?

序列号用于保证数据传输的有序性和可靠性。在握手中,双方交换初始序列号,后续传输中,数据会按照序列号排列并校验,以避免丢包、乱序等问题。

比如,客户端的初始序列号是 100,服务器的初始序列号是 200,那么双方的后续数据传输会以这两个值为起点,确保数据能被正确接收。

7. 总结

三次握手的精妙之处在于:既确保了双方的通信能力,又避免了不必要的资源浪费,同时为后续可靠通信奠定了基础。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据在人力资源管理中的洞察与决策

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字化转型浪潮中,人力资源管理(HRM)正经历着前所未有的变革。…

让vscode远程开发也可以图形显示

目录 0. 摘要1. 保存查看2. jupyter内置inline渲染3. jupyter浏览器4. matplot修改后端5. SSH X11转发[※]6. 参考 0. 摘要 vscode登录远程服务器进行开发遇到图形显示需求时,该怎么处理?一般有几种方式: 保存下来查看jupyter内置的inline图…

Blender制作次表面材质

效果: 主要用沃罗诺伊纹理做出云絮感 然后EV开启次表面设置

服务器数据恢复—服务器raid故障导致上层分区不可用的数据恢复案例

服务器数据恢复环境&故障: 一台服务器中有一组由三块SAS硬盘组建的raid阵列。服务器上部署的数据库存储在D分区,数据库备份存储在E分区。 服务器上一块硬盘指示灯显示红色。D分区不可识别。E分区虽然可以识别,但是E分区拷贝文件报错。 管…

PyTorch PINN实战:用深度学习求解微分方程

神经网络技术已在计算机视觉与自然语言处理等多个领域实现了突破性进展。然而在微分方程求解领域,传统神经网络因其依赖大规模标记数据集的特性而表现出明显局限性。物理信息神经网络(Physics-Informed Neural Networks, PINN)通过将物理定律直接整合到学习过程中&a…

关于“碰一碰发视频”系统的技术开发文档框架

以下是关于“碰一碰发视频”系统的技术开发文档框架,涵盖核心功能、技术选型、开发流程和关键模块设计,帮助您快速搭建一站式解决方案 --- 随着短视频平台的兴起,用户的创作与分享需求日益增长。而如何让视频分享更加便捷、有趣&#xff0c…

【VUE】day05-ref引用

这里写目录标题 1. ref引用1.1 使用ref引用组件 2. this.$nextTick(cb)方法3. 购物车案例3.1 数组中的方法 - some循环3.2 数组中的方法 - every循环3.3 数组中的方法 - reduce 4. 购物车案例 1. ref引用 ref用来辅助开发者在不依赖于jQuery的情况下,获取DOM元素或…

docker安装milvus向量数据库Attu可视化界面

Docker 部署 Milvus 及 Attu 可视化工具完整指南 一、环境准备 安装 Docker 及 Docker Compose Docker 版本需 ≥20.10.12Docker Compose 版本需 ≥2.20.0(推荐 V2) 验证 Docker 环境 docker --version && docker-compose --version若出现&…

nacos安装,服务注册,服务发现,远程调用3个方法

安装 点版本下载页面 服务注册 每个微服务都配置nacos的地址,都要知道 服务发现 2个是知道了解 远程调用基本实现 远程调用方法2,负载均衡API测试 远程调用方法3,注解 负载均衡的远程调用, 总结 面试题

MySQL:数据库基础

数据库基础 1.什么是数据库?2.为什么要学习数据库?3.主流的数据库(了解)4.服务器,数据库,表之间的关系5.数据的逻辑存储6.MYSQL架构7.存储引擎 1.什么是数据库? 数据库(Database,简称DB)&#x…

Kotlin 基础语法

1. 🌟 Kotlin:Java 的“超级进化体”? Kotlin 是一门由 JetBrains 开发的 现代静态类型编程语言,支持 JVM、Android、JavaScript、Native 等多平台: Kotlin 与 Java 深度兼容,Kotlin 会编译为 JVM 字节码&#xff0c…

基于RAGFlow本地部署DeepSeek-R1大模型与知识库:从配置到应用的全流程解析

作者:后端小肥肠 🍊 有疑问可私信或评论区联系我。 🥑 创作不易未经允许严禁转载。 姊妹篇: DeepSpeek服务器繁忙?这几种替代方案帮你流畅使用!(附本地部署教程)-CSDN博客 10分钟上手…

uniapp APP权限弹框

效果图 第一步 新建一个页面,设置透明 {"path": "pages/permissionDisc/permissionDisc","style": {"navigationBarTitleText": "","navigationStyle": "custom","app-plus": {&…

【深度学习与大模型基础】第7章-特征分解与奇异值分解

一、特征分解 特征分解(Eigen Decomposition)是线性代数中的一种重要方法,广泛应用于计算机行业的多个领域,如机器学习、图像处理和数据分析等。特征分解将一个方阵分解为特征值和特征向量的形式,帮助我们理解矩阵的结…

麒麟V10 arm cpu aarch64 下编译 RocketMQ-Client-CPP 2.2.0

国产自主可控服务器需要访问RocketMQ消息队列,最新的CSDK是2020年发布的 rocketmq-client-cpp-2.2.0 这个版本支持TLS模式。 用默认的版本安装遇到一些问题,记录一下。 下载Releases apache/rocketmq-client-cpp GitHubhttps://github.com/apache/roc…

Moonlight-16B-A3B: 变革性的高效大语言模型,凭借Muon优化器打破训练效率极限

近日,由Moonshot AI团队推出的Moonlight-16B-A3B模型,再次在AI领域引发了广泛关注。这款全新的Mixture-of-Experts (MoE)架构的大型语言模型,凭借其创新的训练优化技术,特别是Muon优化器的使用,成功突破了训练效率的极…

在windows下安装windows+Ubuntu16.04双系统(下)

这篇文章的内容主要来源于这篇文章,为正式安装windowsUbuntu16.04双系统部分。在正式安装前,若还没有进行前期准备工作(1.分区2.制作启动u盘),见《在windows下安装windowsUbuntu16.04双系统(上)》 二、正式安装Ubuntu …

一次Linux下 .net 调试经历

背景: Xt160Api, 之前在windows下用.net调用,没有任何问题。 但是移植到Linux去后,.net程序 调用 init(config_path) 总是报错 /root/test 找不到 traderApi.ini (/root/test 是程序目录) 然后退出程序 解决过程: 于是考虑是不是参数传错了&…

AI爬虫 :Firecrawl的安装和详细使用案例(将整个网站转化为LLM适用的markdown或结构化数据)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. Firecrawl概述1.1 Firecrawl介绍1.2 Firecrawl 的特征1.3 Firecrawl 的功能1.4 Firecrawl的 API 密钥获取2. 安装和基本使用3. 使用 LLM 提取4. 无模式提取(curl语句)5. 使用操作与页面交互6. Firecrawl Cloud7. 移…

【Java集合夜话】第1篇:拨开迷雾,探寻集合框架的精妙设计

欢迎来到Java集合框架系列的第一篇文章!🌹 本系列文章将以通俗易懂的语言,结合实际开发经验,带您深入理解Java集合框架的设计智慧。🌹 若文章中有任何不准确或需要改进的地方,欢迎大家指出,让我…