三次握手理解

news2024/11/15 0:12:05

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.coloradmin.cn/o/2240488.html

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

相关文章

5G的发展演进

5G发展的驱动力 什么是5G [远程会议,2020年7月10日] 在来自世界各地的政府主管部门、电信制造及运营企业、研究机构约200多名会议代表和专家们的共同见证下,ITU-R WP 5D#35e远程会议宣布3GPP 5G技术(含NB-IoT)满足IMT-2020 5G技…

Vue全栈开发旅游网项目(11)-用户管理前端接口联调

联调基本步骤 1.阅读接口文档 2.配置接口地址 3.使用axios获取数据 4.将数据设置到模型层 1.发送验证码联调 1.1 配置接口地址 文件地址:src\utils\apis.js //系统相关的接口 const SystemApis {sliderListUrl:apiHost"/system/slider/list/",//发送…

接口返回的结构体里包含图片(做图片预览)

摘要&#xff1a;有这么一种情况&#xff0c;页面上有一块儿内容是接口返回的&#xff0c;前端做渲染&#xff0c;比如 <div><p><img srcxxx /></p><p>测试</p> </div> 这是接口返回的字符串结构数据&#xff0c;这时候需要前端做…

免费,WPS Office教育考试专用版

WPS Office教育考试专用版&#xff0c;不仅满足了考试需求&#xff0c;更为教育信息化注入新动力。 https://pan.quark.cn/s/609ef85ae6d4

aws中AcmClient.describeCertificate返回值中没有ResourceRecord

我有一个需求&#xff0c;就是让用户自己把自己的域名绑定我们的提供的AWS服务器。 AWS需要验证证书 上一篇文章中我用php的AcmClient中的requestCertificate方法申请到了证书。 $acmClient new AcmClient([region > us-east-1,version > 2015-12-08,credentials>[/…

ctfshow-web入门-反序列化(web271-web278)

目录 1、web271 2、web272 3、web273 4、web274 5、web275 6、web276 7、web277 8、web278 laravel 反序列化漏洞 1、web271 laravel 5.7&#xff08;CVE-2019-9081&#xff09; poc <?php namespace Illuminate\Foundation\Testing{use Illuminate\Auth\Generic…

程序员的数学之进制与零

最近一年多发生了很多平凡的大事&#xff0c;应接不暇&#xff0c;一度断更。从今儿起再接上来。 先从数学开始吧&#xff0c;因为太枯燥了。 生活中有许多种进制在共同起作用&#xff0c;例如&#xff0c;数学上的十进制、计算机中的二进制、八进制和十六进制、计时的60进制、…

GPT-5 要来了:抢先了解其创新突破

Microsoft 的工程师计划于 2024 年 11 月在 Azure 上部署 Orion (GPT-5)。虽然这一版本不会向公众开放&#xff0c;但其上线被视为人工智能领域的一个重要里程碑&#xff0c;并将产生深远的影响。 文章目录 GPT-5 真的要来了GPT-4 的局限性GPT-5 的创新突破与遗留挑战GPT-5 预期…

01-Ajax入门与axios使用、URL知识

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

堆中的时间复杂度+TOP K问题

堆中的时间复杂度分析 回顾: 堆在物理上:数组 逻辑上:完全二叉树 1.堆排序是什么? // 排升序void HeapSort(int* a, int n){// 建大堆 -for (int i (n - 1 - 1) / 2; i > 0; --i){AdjustDown(a, n, i);}int end n - 1;while (end > 0){Swap(&a[0], &a[end]…

学Linux的第八天

目录 管理进程 概念 程序、进程、线程 进程分类 进程前后台调用 查看进程 ps命令 unix 风格 bsd风格 GNU风格 top命令 格式 统计信息区 进程信息区&#xff1a;显示了每个进程的运行状态 kill命令 作用 格式 管理进程 概念 程序、进程、线程 程序&#x…

网络初识--Java

一、网络通信基础 1.IP地址 IP地址主要⽤于标识⽹络主机、其他⽹络设备&#xff08;如路由器&#xff09;的⽹络地址。简单说&#xff0c;IP地址⽤于定位主 机的⽹络地址。 就像我们发送快递⼀样&#xff0c;需要知道对⽅的收货地址&#xff0c;快递员才能将包裹送到⽬的地。…

Linux软件包管理与Vim编辑器使用指南

目录 一、Linux软件包管理器yum 1.什么是软件包&#xff1f; 2.什么是软件包管理器&#xff1f; 3.查看软件包 4.安装软件 ​编辑 5.卸载软件 Linux开发工具&#xff1a; 二、Linux编辑器---vim 1.vim的基本概念 (1) 正常/普通模式&#xff08;Normal mode&#xff0…

标准库 -- 为什么 EXTI中断需要使能复用时钟与为什么不需要使能?

在STM32中&#xff0c;使用外部中断&#xff08;EXTI&#xff09;时需要使能复用功能&#xff0c;这和其他中断&#xff08;如串口中断、定时器中断&#xff09;有所不同。以下是为什么在使用外部中断时需要使能复用&#xff0c;以及其他中断不需要复用的原因。 一、为什么 EX…

深入理解ECDSA:椭圆曲线数字签名算法的原理与应用

目录 引言一、什么是ECDSA二、ECDSA的基本原理三、椭圆曲线四、ECDSA签名生成过程1、 生成私钥和公钥2、签名3、签名对的保存 五、ECDSA签名验证过程六、ECDSA的安全性七、篡改的消息如何被检测到八、 为什么B能够知道篡改&#xff1f;九、python代码示例总结 引言 在数字通信…

rocketmq——docker-compose安装

rocketmq安装 创建文件夹&#xff0c;这里我们分别部署namesrv和broker 1、namesrv.conf listenPort98762、broker.conf # 所属集群名字 brokerClusterNameDefaultCluster # broker 名字&#xff0c;注意此处不同的配置文件填写的不一样&#xff0c;如果在 broker-a.propert…

微积分复习笔记 Calculus Volume 1 - 5.5 Substitution

5.5 Substitution - Calculus Volume 1 | OpenStax

初试js反混淆

一、目标 ​ 最近js玩的花样越来越多了&#xff0c;本来简洁方便的一门开发语言&#xff0c;现在混淆的一塌糊涂。今天我们就介绍几种常见的反混淆方案。 混淆的本质就是等价替换&#xff0c;把 a 12 ,替换成 a 100 - 8 5 - 15 - 70。 把 “push” 替换成 “\u0070\u0075…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

odoo17 前端 在头像下拉 dropdown 自定义菜单

odoo17 前端 在头像下拉 dropdown 自定义菜单 其实很简单, 我们先找到原来已经创建好的, 找到代码位置 使用 我的资料 为例 odoo-17.0\addons\hr\static\src\user_menu\my_profile.js /** odoo-module **/import { _t } from "web/core/l10n/translation"; import …