三次握手理解

1. 背景介绍

在TCP(传输控制协议)通信中,为了建立可靠的连接,使用了三次握手的机制。这是一种在客户端和服务器之间进行连接初始化的方法,其目的是确保双方都有发送和接收数据的能力,并且协商好连接的相关参数。

2. 三次握手的过程

第一次握手:客户端发起连接请求

客户端发送一个带有SYN(同步序列号)标志的TCP报文段。这个报文段中还包含了客户端初始的序列号(Sequence Number),记为seq = x。这个序列号用于后续数据传输中的字节计数和排序等操作。例如,假设客户端想要访问服务器的一个网页,它会发送这个SYN报文段,告诉服务器:“我想要和你建立连接。”

第二次握手:服务器响应客户端请求并同步自己的序列号

服务器收到客户端的SYN报文段后,会返回一个TCP报文段。这个报文段包含两个标志位,SYN和ACK(确认)。其中,SYN标志表示服务器也同步自己的序列号,服务器的初始序列号记为seq = y。ACK标志用于确认收到客户端的SYN报文段,确认号(Acknowledgment Number)设为ack = x + 1。这意味着服务器告诉客户端:“我收到你的连接请求了,我也准备好建立连接,同时这是我这边的初始序列号。”

第三次握手:客户端确认服务器的响应

客户端收到服务器的带有SYN/ACK标志的报文段后,会发送一个ACK报文段作为回应。这个报文段的确认号ack = y+ 1,序列号仍然是之前的x + 1(因为在这个过程中客户端自己的序列号只在第一次握手时初始化,之后是通过确认号来同步双方的状态)。客户端通过这个报文段告诉服务器:“我已经收到你的响应,我们可以开始传输数据了。”

3. 三次握手的意义

  • 可靠性保证
    • 通过三次握手,双方都能确保对方已经收到自己的连接请求并且做好了传输数据的准备。如果只有两次握手,当客户端发送的第一个SYN报文段在网络中延迟,导致延迟的报文段在连接释放后才到达服务器。服务器收到这个延迟的SYN报文段后,会认为是一个新的连接请求,然后发送SYN/ACK报文段进行响应。但此时客户端并没有发起新的连接请求,不会回复ACK报文段,服务器就会一直等待,造成资源浪费。而三次握手可以避免这种情况,因为客户端会忽略这个延迟到达的SYN/ACK报文段,因为它没有发起对应的连接请求。
  • 同步序列号
    • 序列号在TCP的数据传输中非常重要。它可以保证数据的按序接收和流量控制等功能。在三次握手过程中,双方交换并同步了初始序列号,为后续可靠的数据传输打下了基础。例如,服务器可以根据客户端的序列号来判断数据是否完整地按顺序接收,客户端也可以根据服务器的序列号来进行相应的操作。

4.三次握手确保数据发送与接受的原因

三次握手可以确保双方都有发送和接收数据的能力,主要体现在以下几个方面:

  1. 双方通信意愿的确认
    • 第一次握手:客户端向服务器发送带有 SYN 标志的数据包,这明确表示客户端有建立连接并发送数据的意愿。服务器收到这个数据包,就知道客户端想要进行通信。
    • 第二次握手:服务器收到客户端的 SYN 包后,返回一个带有 SYN 和 ACK 标志的数据包。这不仅表示服务器接收到了客户端的请求,而且也表明服务器有建立连接和接收数据的能力,同时向客户端确认了自己已经准备好。
    • 第三次握手:客户端收到服务器的 SYN/ACK 包后,发送 ACK 包作为回应。这一步骤是客户端对服务器的确认,告诉服务器自己已经接收到了服务器的响应,并且也准备好了进行数据传输。通过这三次交互,双方都明确了对方想要建立连接并进行通信的意愿。
  2. 序列号的同步与确认
    • 在 TCP 通信中,序列号是保证数据按序传输和正确接收的关键。在三次握手过程中,双方会交换并确认初始序列号。
    • 第一次握手时:客户端选择一个随机的初始序列号并告知服务器,服务器收到后就知道了客户端后续发送数据的起始序号。
    • 第二次握手时:服务器也选择一个自己的初始序列号,并通过 SYN/ACK 包告知客户端,同时确认了客户端的序列号。
    • 第三次握手时:客户端再次确认服务器的序列号。这样,双方都知道了对方的初始序列号,为后续的数据传输提供了序列号的基础,确保数据能够正确地被接收和处理,也就证明了双方具备接收数据的能力。
  3. 避免无效连接的建立
    • 如果只进行两次握手,当客户端发送的连接请求因网络延迟等原因延迟到达服务器时,服务器可能会误认为这是一个新的连接请求并进行响应,建立一个无效的连接。而在三次握手的过程中,客户端在第三次握手时会根据自己的记录判断该请求是否是过期的,如果是过期的请求则不会进行第三次握手的回应,从而避免了无效连接的建立。这也从侧面保证了双方在真正有通信需求时才建立连接,即具备发送和接收数据的真实能力和需求。
  4. 状态的同步与稳定连接的建立
    • 三次握手的过程是一个状态转换的过程:客户端从初始状态到发送 SYN 包后的 SYN_SENT 状态,再到收到服务器的 SYN/ACK 包后的状态,最后到发送 ACK 包后的 ESTABLISHED 状态;服务器从初始的监听状态到收到 SYN 包后的 SYN_RCVD 状态,再到收到客户端的 ACK 包后的 ESTABLISHED 状态。这种状态的转换是双方通信状态的同步过程,只有当双方都完成了三次握手,进入到 ESTABLISHED 状态,才意味着连接已经稳定建立,双方可以开始可靠的数据传输,也就确保了双方具备稳定的发送和接收数据的能力。

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

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

相关文章

力扣515:在每个树行中找最大值

给定一棵二叉树的根节点 root &#xff0c;请找出该二叉树中每一层的最大值。 示例1&#xff1a; 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9]示例2&#xff1a; 输入: root [1,2,3] 输出: [1,3]提示&#xff1a; 二叉树的节点个数的范围是 [0,104]-231 < Node.val &l…

<项目代码>YOLOv8 番茄识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…

__VUE_PROD_HYDRATION_MISMATCH_DETAILS__ is not explicitly defined

VUE_PROD_HYDRATION_MISMATCH_DETAILS 未明确定义。您正在运行 Vue 的 esm-bundler 构建&#xff0c;它期望这些编译时功能标志通过捆绑器配置全局注入&#xff0c;以便在生产捆绑包中获得更好的tree-shaking优化。 Vue.js应用程序正在使用ESM&#xff08;ECMAScript模块&#…

《FreeRTOS列表和列表项篇》

FreeRTOS列表和列表项 1. 什么是列表和列表项&#xff1f;1.1 列表list1.2 列表项list item 2. 列表和列表项的初始化2.1 列表的初始化2.2 列表项的初始化 3. 列表项的插入4. 列表项末尾插入5. 列表项的删除6. 列表的遍历 列表和列表项是FreeRTOS的一个数据结构&#xff0c;是F…

MySQL进阶-索引的组合索引

练习题目 题目链接难度SQL进阶-索引的组合索引★★★☆☆ SQL思路 SQL进阶-索引的组合索引 初始化数据 drop table if exists user_profile; CREATE TABLE user_profile ( id int NOT NULL, device_id int NOT NULL, gender varchar(14) NOT NULL, age int , university va…

【iStat Menus for MacBook状态栏菜单系统监控工具--安装教程【简单操作,随时了解电脑情况】

Mac分享吧 文章目录 iStat Menus for MacBook状态栏菜单系统监控软件 效果图展示一、iStat Menus 状态栏菜单系统监控软件 Mac电脑版——v6.73(1240)1️⃣&#xff1a;下载软件2️⃣&#xff1a;安装软件3️⃣&#xff1a;软件自定义配置 安装完成&#xff01;&#xff01;&am…

netmap.js:基于浏览器的网络发现工具

netmap.js是一款基于浏览器&#xff0c;用于提供主机发现和端口扫描功能的网络发现工具。 netmap.js的执行速度也非常的快&#xff0c;由于其使用了es6-promise-pool&#xff0c;因此它可以有效地运行浏览器允许的最大并发连接数。 动机 由于我正需要一个基于浏览器的端口扫…

计算机网络 (2)计算机网络的类别

计算机网络的类别繁多&#xff0c;根据不同的分类原则&#xff0c;可以得到各种不同类型的计算机网络。 一、按覆盖范围分类 局域网&#xff08;LAN&#xff09;&#xff1a; 定义&#xff1a;局域网是一种在小区域内使用的&#xff0c;由多台计算机组成的网络。覆盖范围&#…

modbus协议 Mthings模拟器使用

进制转换 HEX 16进制 (0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F表示0-15) dec 10进制 n(16进制) -> 10 abcd.efg(n) d*n^0 c*n^1 b*n^2 a*n^3 e*n^-1 f*n^-2 g*n^-3&#xff08;10&#xff09; 10 -> n(16进制) Modbus基础概念 高位为NUM_H&…

飞腾平台Arm NN软件栈安装使用指南

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力&#xff0c;聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域&#xff0c;包含了应用使能套件、软件仓库、软件支持、软件适…

基于JavaSpringboot个人博客

一、作品包含 源码数据库设计文档万字全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA 数据库&#xf…

鸿蒙next ui安全区域适配(刘海屏、摄像头挖空等)

目录 相关api 团结引擎对于鸿蒙的适配已经做了安全区域的适配,也考虑到了刘海屏和摄像机挖孔的情况,在团结引擎内可以直接使用Screen.safeArea 相关api

【GPTs】Gif-PT:DALL·E制作创意动图与精灵动画

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 &#x1f4af;GPTs指令&#x1f4af;前言&#x1f4af;Gif-PT主要功能适用场景优点缺点 &#x1f4af;小结 &#x1f4af;GPTs指令 中文翻译&#xff1a; 使用Dalle生成用户请求的精灵图动画&#…

JMeter初体验:从入门到入门的性能测试之旅

一、关于性能测试 1、性能测试概述 性能测试是一种非功能测试&#xff0c;旨在评估系统在不同负载条件下的性能表现。它包括负载测试、压力测试、稳定性测试和基准测试等。性能测试的目的是确保系统在预期的负载下能够正常运行&#xff0c;并满足用户对响应时间、吞吐量和其他…

MongoDB新版本安装配置教程(7.0.15版本-zip下载)

找了半天MongoDB新版本怎么解决没有mongo命令,都没有很好的解决方法 现在分享一下: 首先下载: 然后手动创建 data 和 log 两个文件夹 然后再系统变量配置环境变量 在data的目录下&#xff0c;创建一个db文件 然后:在bin目录下cmd执行: mongod --dbpath D:\MongoDB\data\db …

解决虚拟机未被自动分配ip

文章目录 1. 背景2. 解决步骤 1. 背景 从vulnhub下载的靶场文件&#xff0c;网络适配器模式设置为nat模式之后&#xff0c;启动虚拟机之后发现没有成功分配动态ip。推测是虚拟机分配的网卡名称和原先靶机作者设置网络配置文件 网络接口名称不一致导致。 2. 解决步骤 解决办法就…

路径规划——RRT-Connect算法

路径规划——RRT-Connect算法 算法原理 RRT-Connect算法是在RRT算法的基础上进行的扩展&#xff0c;引入了双树生长&#xff0c;分别以起点和目标点为树的根节点同时扩展随机树从而实现对状态空间的快速搜索。在此算法中以两棵随机树建立连接为路径规划成功的条件。并且&…

2024游戏陪玩app源码的功能介绍/线上陪玩交友上线即可运营软件平台源码搭建流程

一个完整的陪玩交友系统从概念到实现再到维护的全过程得以清晰展现。每一步都需要团队的紧密协作与细致规划&#xff0c;以确保系统既满足用户需求&#xff0c;又具备良好的稳定性和可扩展性。 基础框架 移动端开发框架&#xff1a;如uniapp&#xff0c;它支持多平台开发&…

缓冲式线程池C++简易实现

前言 : 代码也比较短&#xff0c;简单说一下代码结构&#xff0c;是这样的&#xff1a; SyncQueue.hpp封装了一个大小为MaxTaskCount的同步队列&#xff0c;这是一个模板类&#xff0c;它在线程池中承担了存放任务等待线程组中的线程来执行的角色。最底层是std::list<T>…

Unity资源打包Addressable AA包

从零到一 很多资料都是通过一步步设置讲解的&#xff0c;有时很想先快速实现&#xff0c;再了解细节。 下面就是远程加载Cube.prefab然后实例化简单的代码。 代码中可以不需要远程的网址&#xff0c;不需要资源下载的位置&#xff0c;不需要判断是否已经下载到本地。 那是如…