TCP 三次握手意义及为什么是三次握手

  ✨✨✨励志成为超级技术宅  ✨✨✨

        TCP的三次握手在笔试和面试中经常考察,非常重要,那么大家有没有思考过为什么是三次握手,俩次握手行不行呢?四次握手行不行呢?如果大家有疑问或者不是很理解,那么这篇博客有图有讲解,一定能帮助大家思考,希望大家能看看了( つ•̀ω•́)つ。


一.知识铺垫

        首先tcp协议的格式如下:

        这里我们先了解32位序号和32位确认序号。假设我们是客户端,32位序号就像学生id唯一标识标识一段传输的TCP报文, 32位确认序号就是收到服务端TCP报文时,将服务端的32位序号+1作为我们客户端的32确认序号发送给服务器。也就是我们端的32位确认序号等于对端的32位序号+1。

        为什么会有确认序号产生呢?这是为了确保消息能被收到。举个例子,在生活中,辅导员为了确保重要的消息被同学知道, 会在班群通知,XXX重要消息,收到请回复只要有同学对这条消息回复,就代表消息收到了这时老师和同学就类似于服务器和客户端,服务器和客户端确保的通信被收到的机制其实也就是收到请回复。我们将收到消息的32位序号+1作为32位确认序号放入消息中,就是我们对这条32位序号消息的回复。

        通过32位序号和32位确认序号结合,我们就能在发送消息的同时进行回复。 32位序号表示发送的消息序号,32确认序号就表示对哪条消息的收到确认回复。当发送需求和回复确认需求同时都存在时,俩个序号就会添加上对应的值,这就是捎带应答(可以理解为因为要发送消息就顺便应答一下的意思TCP三次握手的第二次握手就是捎带应答,因为在同一时间内具有发送需求(建立连接)和确认需求(对第一次握手应答)。

二.回顾三次握手流程

        SYN和ACK是TCP六位标志位中的俩位,当标志位置1表示有效。我们先来讲解含义。

TCP的六位标志位
上图的六位标志位

        SYN是“Synchronize”(同步)的缩写,用来请求建立连接。ACK是“Acknowledgment”(确认)的缩写,ACK报文的主要作用是确认接收方已经成功接收了发送方发送的数据段 。

       在三次握手中,当客户端以及服务端发送含有SYN标志位请求时就表示要建立连接,发送ACK报文就表示对另一方连接请求的确认。另外,双方发送的含有SYN的消息的32位序号是随机的,对于每一次的ack请求都是不同的。

        那么我们来概括一下三次请求的简要流程:

1.第一次握手(SYN):

  • 客户端(Client):发送一个带有SYN(同步序列编号)标志位的TCP报文段给服务器,请求建立连接。此时,客户端进入SYN_SEND状态。
  • 报文内容:SYN=1,初始序列号seq=x(客户端随机的初始序列号)。

2.第二次握手 (SYN+ACK)

  • 服务器(Server):收到客户端的SYN报文段后,确认SYN报文段有效,并回复一个带有SYN和ACK(确认)标志位的TCP报文段给客户端,表示同意建立连接。此时,服务器进入SYN_RCVD状态。
  • 报文内容:SYN=1,ACK=1,确认号ack=x+1(表示收到了客户端的序列号x),初始序列号seq=y(服务器随机的初始序列号)。

3.第三次握手(ACK)

  • 客户端(Client):收到服务器的SYN+ACK报文段后,确认该报文段有效,并向服务器发送一个带有ACK标志位的TCP报文段,表示已经收到了服务器的SYN报文段。此时,客户端和服务器都进入ESTABLISHED(已建立连接)状态,可以开始传输数据。
  • 报文内容:ACK=1,确认号ack=y+1(表示收到了服务器的序列号y)。

         了解上面的知识我们也就能探索为什么是三次握手了。 

三.为什么不是俩次握手

1.确保双方的通信能力

        首先我们要怎么才能确定一端到对端的通信能力呢?答案是请求被回复。请求被回复就说明对方成功接收到了消息,没有回复可能是对方没有收到或者对方发送消息的通路有问题

        当客户端发送建立连接的请求SYN,之后如果客户端收到了服务器回复了SYN和ACK的消息。此时作为客户端我们就能确定客户端到服务器的连接是畅通的,因为我们收到了回复,而回复就代表我们的消息被对端成功接收,客户端到服务器通信是畅通的。

        而作为服务端,当我们对客户端的连接请求,回复SYN和ACK消息,如果要确保服务器到客户端通信畅通,也必须需要收到回复,这就是第三次握手的意义,客户端发送ACK消息对服务端的的连接请求回复确认消息ACK,当此时服务器收到消息了,就代表服务器到客户端通信是正常的,即三次握手确认后了双方的通信能力

        始终要记住只有我们的消息被回复才能保证我们的消息被收到。

        总体来说只要俩边的SYN请求都能接收到ACK回复,就表明俩边的SYN请求都已经被对端收到,双方通信就是正常的。

        

        那么为什么不能是俩次握手,俩次握手双方不是也已经进行互相通信了吗?此时为什么还不能确保双方的通信能力。

        答案是此时虽然进行了互相通信,但是只有客户端的连接请求被确认,而服务器的请求还没有进行回应,俩次握手后,客户端如果收到回应,是能确保自己到服务端的通路和服务端到自己的通路是正常的,但是此时作为服务器,我们并不能确认我们的SYN和ACK消息被收到,只有收到回应才能确保我们的消息被正确送到对方,才能确保服务器到客户端的通路是畅通的。

        因此完成俩次握手客户端能确认自己到服务器的通信正常,服务器无法确保自己到客户端通信正常。

        我们在从另外一个角度看,对于俩次握手,如果第二次握手失败,即服务器发送的SYN报文因为网络等原因没有送达,服务器就会认为连接建立,进行监听并发送数据,而客户端因为服务器报文丢失,根本不会建立连接发送消息,此时服务器就会监听和对不存在的连接发消息,浪费资源。

        而对于三次握手,第二次握手失败,服务器也不会建立连接,不会浪费资源,甚至因为网络变化第三次握手失败,此时客户端已经建立连接,但是服务器依旧不会建立连接,这时服务器的三次任何一次握手失败的代价都不用服务器承担,第三次失败也是客户端承担代价。能减少服务器负担。

2.防止历史报文的干扰

       历史报文的干扰的情况是指因为网络延迟等问题服务器第一次发送的SYN报文被阻塞在网络中,此时服务器会再次发送第二次SYN报文,第二次报文成功发送,如果此时第一次的SYN报文之后又发送到服务器又会怎样?

        我们就来讲讲三次握手是怎么防止历史报文的干扰,首先每次SYN报文的32序列号是随机的,我们假设第一次阻塞的SYN报文32位初始序列号是100(随便写几位),第二次成功送达的序列号是200,此时服务器回应ACK和SYN报文,此时32位确认序号是201,此时如果阻塞报文在第二次成功送达的报文之后到来,服务器不能区分新旧(因为初始序列号是随机的,且此时连接为建立),同样会进行回应,确认序列号101。这时客户端会收到俩份ACK和SYN的报文,一份确认序列化101,一份201,服务器是能记住自己最新的初始序列号200的,因此201符和预期,客户端会对201的报文进行一份回应,101不符合客户端直接丢弃。此时客户端和服务器各自只建立了一份连接,服务器虽然多建立一个syn_rcvd状态但是并不会太浪费资源。

        我们再来看看俩次连接为什么不能防止历史连接干扰

        首先假设只有俩次握手,在服务器对客户端的SYN报文进行回复后,那么服务器就会认为连接建立了(因为俩次握手的就要建立连接)。因此服务器收到俩次SYN请求会分别添加2个连接, 此时客户端由于上面同样的原因,会丢弃一份SYN和ACK报文,只会添加一个连接。

        因此俩次握手不能防止历史连接干扰而三次握手可以。此外还有一种情况如果三次握手成功后,历史连接再次到来的情况,我询问了老师,因为五元组相同(源ip,目的ip,源端口,目的端口,协议类型),此时服务器会检查建立与对于客户端建立的连接,发现连接正常,对于历史连接就会直接丢弃,不过此时并不能很好体现为什么要三次握手了而不是俩次握手了。

四.为什么不是四次握手

        通过上面的讲解我们能明白三次握手已经能很好完成建立连接的功能,对于为什么不是四次握手我们就能很好理解。

        主要是为了避免资源浪费和协议设计的简洁性

       在TCP连接建立的过程中,如果采用四次握手,将会增加通信的开销和延迟,降低连接建立的效率。 TCP协议的设计注重简洁性和高效性。三次握手的过程既能够确保连接的可靠性,又能够避免不必要的复杂性和开销。如果增加到四次握手,将会使协议变得更加复杂和冗余。

        综上所述,TCP采用三次握手而不是四次握手,是在保证连接可靠性和通信效率之间的一种平衡选择。这种机制不仅简单可靠,而且能够有效地避免连接建立过程中的问题。

五.三次握手的意义

        我们最后再来完全总结一次三次握手的意义(毕竟经常考):

1.确保双方的通信能力

2.防止历史报文的干扰

3.交换彼此的窗口大小(即接收缓冲区剩余空间)和初始化序列号(也可说是交换滑动窗口的头指针位置)

        对于第三点如果不了解或者想要更好理解TCP协议的全部内容的话,可以看本人关于TCP协议的另外一篇博客 TCP 协议详解_tcp协议-CSDN博客。里面详细讲解了TCP的各种知识点,相信可以帮助你更好理解TCP全貌。

        感觉有帮助的请点个赞,这真的很重要。٩(๑òωó๑)۶

                         

         

        

        

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

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

相关文章

【JS】异步编程

我是目录 Promisenew Promise(..) 构造器如何确定promise的类型如何信任Promise链式流Promise的局限性async与awaitasyncawaitawait 等到之后,做了一件什么事情?异步编程的四种方式: 1,回调函数:先执行程序的主要逻辑,将耗时的操作推迟执行。简单、易理解,但不利于代码维…

软件设计师-软件工程

软件生存周期 可行性分析,可行性分析报告和项目开发计划需求分析,软件需求说明书,确定软件的综合要求:系统界面,系统功能,系统性能,安全性,保密性和可靠性方面的要求,系…

算法——移除链表元素(leetcode203)

移除链表元素首先我们要理解链表这种数据结构,它跟数组不一样它可以分布在内存中的各个位置链表节点由值和指针组成,指针指向下一个链表节点。 移除链表元素简而言之就是将符合条件的链表节点给移除出去我们不能直接将其移除而是通过将被移除节点的上一…

数字字符串格式化

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完…

初识算法 · 位运算(2)

目录 前言: 判定字符是否唯一 丢失的数字 比特位计数 只出现一次的数字III 前言: ​本文的主题是位运算,通过四道题目讲解,一道是判断字符是否唯一,一道是只出现一次的数字III,一道是比特位计数&…

Unity Assembly Definition Assembly Definition Reference

文章目录 1.Unity 预定义程序集2.Assembly definition3. Assembly definitions相关实验 1.Unity 预定义程序集 Unity 有4个预定义程序集: 阶段程序集名脚本文件1Assembly-CSharp-firstpassStandard Assets, Pro Standard Assets和Plugins文件夹下面的运行时脚本2A…

C++设计模式精选面试题及参考答案

目录 什么是单例模式?它的应用场景是什么?如何保证单例模式线程安全? 什么是工厂方法模式?如何与简单工厂模式进行比较? 抽象工厂模式和工厂方法模式有什么区别?请给出实际应用场景。 什么是建造者模式?它和工厂模式有什么不同? 在什么情况下使用单例模式?如何在…

ios swift开发--ios远程推送通知配置

远程推送通知(Push Notifications)在 iOS 平台上是免费提供的,但需要一些准备工作。以下是开通和使用远程推送通知的基本步骤: 开通远程推送通知 注册 Apple Developer Program: 访问 Apple Developer 并注册一个开发…

关于QUERY_ALL_PACKAGES权限导致Google下架apk

谷歌商店被下架,原因是第三方使用了 QUERY_ALL_PACKAGES 权限; Google在高版本上限制了此权限的使用。当然,并不是 QUERY_ALL_PACKAGES 这个权限没有了,而是被列为敏感权限,必须有充分的理由说明,才允许上架 GP&#…

【征稿倒计时!华南理工大学主办 | IEEE出版 | EI检索稳定】2024智能机器人与自动控制国际学术会议 (IRAC 2024)

#华南理工大学主办!#IEEE出版!EI稳定检索!#组委阵容强大!IEEE Fellow、国家杰青等学术大咖领衔出席!#会议设置“优秀论文”“优秀青年学者报告”“优秀海报”等评优奖项 2024智能机器人与自动控制国际学术会议 &#…

[CKS] Create/Read/Mount a Secret in K8S

最近准备花一周的时间准备CKS考试,在准备考试中发现有一个题目关于读取、创建以及挂载secret的题目。 ​ 专栏其他文章: [CKS] Create/Read/Mount a Secret in K8S-CSDN博客[CKS] Audit Log Policy-CSDN博客 -[CKS] 利用falco进行容器日志捕捉和安全监控-CSDN博客[C…

5个非LLM软件趋势

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

社会工程骗局席卷金融机构

2024 年北美金融机构收到的社交工程诈骗报告数量比一年前增加了 10 倍。数据显示,诈骗现在占所有数字银行欺诈的 23%。 深度伪造和 GenAI 诈骗的危险日益增加 BioCatch 在其 2024 年北美数字银行欺诈趋势报告中公布了这些发现,该报告还详细说明了报告的…

读数据质量管理:数据可靠性与数据质量问题解决之道03数据目录

1. 同步数据 1.1. 不同的数据仓库和数据湖通过数据集成层来进行桥接 1.2. AWS Glue、Fivetran和Matillion等数据集成工具从不同来源收集数据,统一这些数据,并将其转换为上游来源 1.3. 数据集成的一个典型用例是收集数据湖的数据并以结构化格式将其加载…

-bash: /home/xxx/anaconda3/bin/conda: No such file or directory

Linux系统中移动用户的配置文件后,Anaconda出现-bash: /home/shaocaiyin2023/anaconda3/bin/conda: No such file or directory错误提示。 查看PATH变量信息 echo $PATH 检查环境变量是否包含移动之后的文件目录,主要到*/anaconda3/bin这一层。如果没有…

【数据库】数据库迁移的注意事项有哪些?

数据库迁移是一个复杂且关键的过程,需要谨慎处理以确保数据的完整性和应用程序的正常运行。以下是一些数据库迁移时需要注意的事项: 1. 充分的前期准备 1.1 评估迁移需求 明确目标:确定迁移的具体目标,例如添加新字段、修改现…

LabVIEW开发相机与显微镜自动对焦功能

自动对焦是显微成像系统中的关键功能,通常由显微镜的电动调焦模块或特定的镜头系统提供,而工业相机则主要用于高分辨率图像的采集,不具备独立的自动对焦功能。以下是自动对焦的工作原理、实现方式及实际应用案例。 1. 自动对焦的工作原理 &a…

ReactPress与WordPress:两大开源发布平台的对比与选择

ReactPress与WordPress:两大开源发布平台的对比与选择 在当今数字化时代,内容管理系统(CMS)已成为各类网站和应用的核心组成部分。两款备受欢迎的开源发布平台——ReactPress和WordPress,各自拥有独特的优势和特点&am…

京东商品详情,Python爬虫的“闪电战”

在这个数字化的时代,我们每天都在和数据打交道,尤其是电商数据。想象一下,你是一名侦探,需要快速获取京东上某个商品的详细信息,但是没有超能力,怎么办?别担心,Python爬虫来帮忙&…

np.zeros_like奇怪的bug

import numpy as np aa np.array([[1,2,3],[2,3,3]]) cc np.random.randn(2,3) print(aa) print(cc)bb np.zeros_like(aa) print(bb)for i in range(bb.shape[0]):for j in range(bb.shape[1]):bb[i,j] cc[i,j]print(bb)结果如下 这里发现这个bb的结果是没有赋值的 正确做…