计算机网络 —— 运输层(TCP三次握手)

计算机网络 —— 运输层(TCP三次握手)

  • 三次握手
  • 第一次握手
  • 第二次握手
  • 第三次握手
  • 两次握手行不行?

我们今天来学习TCP的三次握手:

三次握手

TCP三次握手是TCP协议中建立连接的过程,旨在确保双方准备好进行可靠的通信。这个过程包括三个步骤,每个步骤涉及一个数据包(也称作报文段)的交换。下面是三次握手的详细步骤:

  1. 第一次握手(SYN)
  • 客户端发送一个TCP报文段到服务器,标志位中的SYN(同步)置为1,表示希望建立连接。同时还包含一个初始序号(Initial Sequence Number, ISN)Client_ISN。这个报文不携带数据,但是会消耗一个序号。
  1. 第二次握手(SYN-ACK)
  • 服务器收到客户端的SYN报文后,如果同意建立连接,则发送一个报文段作为应答。这个报文段中SYN置为1,表示服务器也在进行连接请求;ACK(确认)置为1,表示确认收到了客户端的SYN报文。同时,服务器也会为自己选择一个初始序号Server_ISN,并将确认号(Acknowledgment Number, ACK)设置为Client_ISN + 1,以表明期望从客户端收到的下一个数据包的序号。这个报文同样不携带数据。
  1. 第三次握手(ACK)
  • 客户端收到服务器的SYN-ACK报文后,会再发送一个确认报文给服务器。这个报文的ACK置为1,确认号设置为Server_ISN + 1,表示确认收到了服务器的SYN报文。此时,客户端已经知道服务器准备好了,自己的序号则变为Client_ISN + 1。这个报文可以携带数据,也可以不携带。

完成这三次握手之后,客户端和服务器都进入了ESTABLISHED状态,表示连接已经建立,双方可以开始互相发送数据。

三次握手的目的是为了同步序列号、确认双方的接收能力、防止旧的重复连接请求干扰新的连接建立,并且能够初始化滑动窗口等连接参数,为后续的数据传输做准备。

有点懵是不是,我们一步一步来:

第一次握手

第一次握手(SYN)客户端发送一个TCP报文段到服务器,标志位中的SYN(同步)置为1,表示希望建立连接:

一开始,服务器端先建立传输控制块
在这里插入图片描述然后进入监听状态:

在这里插入图片描述
然后,客户端做同样的事:
在这里插入图片描述之后,TCP就会发送TCP连接请求报文段(第一次握手)
在这里插入图片描述同步位SNY设置为1,表明这是一个TCP请求报文段,seq是一开始初始化序号。

注意SYN设置为1时不能携带数据,但会消耗一个序号

第二次握手

这个时候,如果服务器同意连接,服务器会发送一个TCP连接请求确认,然后进入等待状态
在这里插入图片描述
同步位中的ACK和SYN都被设置为了1,序号字段seq被设置成立一个初始值y,确认端字号ack被设置为x+1,这是对TCP客户端所选的seq的确认。
在这里插入图片描述注意SYN设置为1时不能携带数据

第三次握手

收到服务器的确认之后,客户端会再发一个对服务器端的确认的确认
在这里插入图片描述
这次确认,确认位ACK设置为1,seq设置为x+1:
在这里插入图片描述这里注意TCP普通的确认报文段可以携带数据,如果不携带数据,则不会消耗序号。确认字段被设置为y+1,这是对服务器的确认中的seq的确认。
在这里插入图片描述
这个时候如果服务器接收到了TCP的连接确认的确认,便会建立连接状态开始链接。
在这里插入图片描述这就是三次握手,我们打个简单的比方:

想象一下两个人隔着一条河想要用一根绳子拉起一座桥来进行稳定的沟通和物资交换,这就是TCP建立连接的“三次握手”过程的形象比喻:

  1. 第一次握手: 假设甲方站在河的一边,手里拿着绳子的一端。他先向河对岸的乙方喊了一声:“我要搭桥了!”并轻轻抛出绳子的另一端到河面上,但没有完全扔过去。这里的“喊一声”就像是发送SYN包,告诉对方有建立连接的意图
  2. 第二次握手: 乙方听到后,回应道:“好的,我准备好了,接住绳子!”同时,他伸出自己的手准备抓住绳子,并紧握着自己这边的绳子一端。这一行为就像服务器回复的SYN-ACK包,不仅确认收到了甲方的意图,还表达了自己也有建立连接的意愿,并且做好了准备。
  3. 第三次握手: 甲方听到乙方的回应,并看到乙方已经准备好,于是用力把绳子完全甩到了乙方手中,并紧紧握住自己的那一端。这时,他说:“绳子已经交给你了,我们可以开始过桥了!”这个动作如同客户端发送的ACK包,确认连接已经成功建立,双方可以开始稳定地传递信息和物资了。

通过这样的三次互动,双方不仅确认了对方的存在和沟通的意愿,还确保了连接的稳定性和安全性,从而开始了可靠的“桥梁”交流。

两次握手行不行?

如果TCP连接建立的过程简化为两次握手,理论上似乎可以更快地建立起连接,但实际上会引入一些问题,影响网络通信的可靠性和安全性:

  1. 无法确认客户端的接收能力:在标准的三次握手过程中,第二次握手包含了服务器的SYN和ACK,这既是对客户端SYN的确认,也是服务器发出的连接请求。如果省略掉客户端对这个SYN的确认(即第三次握手),服务器无法确定客户端是否成功接收到了其发送的SYN+ACK报文。这样,服务器可能会误以为连接已建立,但实际上客户端可能并未准备好,或者根本没有收到服务器的响应。
  1. 老的连接请求问题:网络中可能存在延迟的分组(即“幽灵”分组),如果仅进行两次握手,当客户端发送了一个连接请求后因某种原因未收到服务器的响应,然后又发送了第二个连接请求并成功建立了连接。这时,如果第一个请求的响应延迟到达,根据两次握手的规则,服务器可能会错误地认为这是客户端的一个新连接请求,从而导致资源的无效占用或混乱。
  1. 安全性降低:缺少了第三次握手的确认步骤,可能会让恶意用户更容易发起伪造的连接请求(例如SYN泛洪攻击),因为建立连接所需的交互减少,使得恶意攻击的成本降低,防护起来更加困难。

假设我们是两次握手,有这么一个场景我发送了SYN包,但是因为网络的原因,我一直没收到服务器的确认连接,然后我重新发了一次,第二次的SYN包成功到达
在这里插入图片描述连接完毕之后,之前哪个延误的SYN到了,服务器以为又要连接,所以发送确认给客户端,但是客户端早就关闭连接,不会接收,这会导致服务器资源浪费
在这里插入图片描述打个比方:

想象你是一位住在山脚下的农夫(客户端),想要和山顶的朋友(服务器)建立固定的货物交换通道。这个过程如果简化为两次握手,情况会是这样的:

  1. 第一次尝试:你站在山脚下大喊:“嘿,山顶的朋友,我想明天开始每天给你送新鲜蔬菜,你准备好接收了吗?”(发送SYN请求)
  2. 山顶的回应:山顶的朋友听到了你的喊声,高兴地回应:“太好了,我已经准备了一个仓库,明天开始接收你的蔬菜!”同时,他开始清理通往山脚的路径,确保你能顺利上山。(发送SYN-ACK,既确认了你的请求,也表明自己已做好准备)
    按照两次握手的逻辑,到此你们的“协议”似乎达成了。但这里的问题是:
  • 不确定性:你虽然听到了山顶朋友的答应,但你并没有再次确认说:“好的,我知道你准备好了,明天见!”如果这时你的喊话因风声干扰没被听见,山顶的朋友可能会疑惑你是否真的听到了他的回应,或者是否准备好按计划行事。
  • 潜在的误解:如果在第一次尝试后不久,山里起了大雾,你的声音再次传来:“我明天开始送蔬菜…”,但这次是个回音(类似于网络中的延迟数据包)。山顶的朋友可能会误以为这是你新的询问,于是又做了一遍准备,造成了不必要的劳动。
    因此,缺少了第三次握手的明确确认,就如同农夫和山顶朋友之间少了最终的“成交确认”,可能导致误解、资源浪费,甚至整个交换计划的失败。三次握手就像是在说:“我准备好了,你呢?”,“我也准备好了,我们现在可以开始了!”这样确保了双方都明确了意图,准备工作到位,可以放心开始合作。

因此,三次握手虽然牺牲了一定的连接建立速度,但它确保了连接的可靠性和安全性,是目前TCP协议中不可或缺的一部分。

我们来看一道题:
在这里插入图片描述

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

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

相关文章

【HarmonyOS】鸿蒙入门学习

一、开发前的准备 (一)HarmonyOS 开发套件介绍 (二)开发者主要使用的核心套件 主要为代码开发阶段会使用到的 DevEco Studio、ArkTS、ArkUI三个工具。 (三)熟悉鸿蒙官网 1、网址 https://developer.hua…

第P10周:Pytorch实现车牌识别

第P10周:Pytorch实现车牌识别 🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 在之前的案例中,我们多是使用datasets.ImageFolder函数直接导入已经分类好的数据集形成Dataset&#xff…

创建节约机关怎样向媒体投稿报道宣传?

创建节约机关并向媒体投稿报道宣传是一项重要的工作,它不仅能够提升机关的形象,还能促进社会各界对节约型社会的认识和支持。 作为一名新晋信息宣传员,初入职场的我满腔热血,怀揣着用文字传递价值的理想,却在投稿的道路上屡遭波折。面对每月的宣传任务,我…

自动控制原理【期末复习】(二)

无人机上桨之后可以在调试架上先调试: 1.根轨迹的绘制 /// 前面针对的是时域分析,下面针对频域分析: 2.波特图 3.奈维斯特图绘制 1.奈氏稳定判据 2.对数稳定判据 3.相位裕度和幅值裕度

飞腾派初体验(2)

水个字数,混个推广分,另外几个点还是想吐槽一下 - 1,上篇文章居然没有给开发板一个硬照,补上 - 飞腾派 自拍 2. 现在做镜像用Win32DiskImager的多吗?我记得当年都是dd命令搞定,玩树莓派的应该记得这个命令…

linuxcentos将本地库JAR/arr批量导入到Nexus3.x

背景 我们现在要搞一个私服maven来管理对应的依赖包,需要上传包。用nexus只能单个文件搞,批量导入不行,而且还要单独配置groupID什么的。不多BB,上教程 建脚本 vi mavenimport.sh内容是这个 #!/bin/bash # copy and run this script to t…

6.13--CSS

行内样式 <!DOCTYPE html> <html lang"en"> <head> <title>This is title</title> </head> <body> <p style"font-size: 16px; color: red;">大家好</p> </body> </html> 内部样式表…

piRNA-疾病研究最新综述 – 数据库、软件工具、webserver和计算模型

piRNA被世界顶尖科学期刊《Science》评为2006年年度十大科学突破之一。之后有关piRNA的研究也成为CNS文章的常客。 2022年6月7日发表在Briefings in Bioinformatics上的这篇综述为我们整理了39个piRNA特异性和非特异性数据库及生物信息学资源&#xff1b;并根据piRNA的功能&…

UniApp或微信小程序中scroll-view组件使用show-scrollbar在真机Android或IOS中隐藏不了滚动条的解决办法

show-scrollbar 属性 不论是使用 变量 还是直接使用 布尔值或者直接使用 css 都是在 ios、Android 上是都没有效果。。 真机中还是出现滚动条 解决办法 添加下面CSS ::-webkit-scrollbar {display: none;width: 0 !important;height: 0 !important;-webkit-appearance: no…

贪吃蛇双人模式设计(2)

敲上瘾-CSDN博客控制台程序设置_c语言控制程序窗口大小-CSDN博客贪吃蛇小游戏_贪吃蛇小游戏csdn-CSDN博客 一、功能实现&#xff1a; 玩家1使用↓ → ← ↑按键来操作蛇的方向&#xff0c;使用右Shift键加速&#xff0c;右Ctrl键减速玩家2使用W A S D按键来操作蛇的方向&am…

网络编程(三)UDP TFTP协议

文章目录 一、 UDP&#xff08;一&#xff09;概述&#xff08;二&#xff09;流程 二、收发函数&#xff08;一&#xff09;recvfrom&#xff08;二&#xff09;sendto 三、实现一个简单的udp服务端和客户端四、实现tftp客户端协议 一、 UDP &#xff08;一&#xff09;概述 …

shell条件测试和if语句

“C:\Users\Jessica\Desktop\6.12.assets\image-20240612094159578.png”# shell条件测试和if语句 一、条件测试 1、$? 返回码 判断命令或者脚本是否执行成功&#xff08;最近的一条&#xff09; 0 true 为真就是成功 成立 非0 false 失败或者异常 2、test命令 可以进行…

Docker 镜像源更换

实现 替换docker 镜像源 前提要求 安装 docker docker-compose 参考创建一键更换docker国内镜像源 Docker 镜像代理DaoCloud 镜像站百度云 https://mirror.baidubce.com南京大学镜像站

【Qt 学习笔记】Qt窗口 | 对话框 | 创建自定义对话框

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 对话框 | 创建自定义对话框 文章编号&#xff1a;Qt 学习笔记…

opencv 通过滑动条调整阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强参数 并实时预览效果

使用PySimpleGUI库创建了一个图形用户界面(GUI),用于实时处理来自OpenCV摄像头的图像。它允许用户应用不同的图像处理效果,如阈值处理、边缘检测、轮廓检测、模糊、色调调整和对比度增强。用户可以通过滑动条调整相关参数。 完整代码在文章最后,可以运行已经测试; 代码的…

怎么修改Visual Studio Code中现在github账号

git config --global user.name “你的用户名” git config --global user.email “你的邮箱” git config --global --list git push -u origin your_branch_name git remote add origin

又一个对标Sora的AI视频工具,Dream Machine,开始免费试用

新的AI视频工具又又来了-Dream Machine&#xff0c;开始免费试用。 地址&#xff1a;https://lumalabs.ai/dream-machine 该工具需要科学上网 先看一下官网的宣传视频 luma AI 发布 Dream Machine 我生成了几个视频&#xff0c;效果还可以 生成视频很简单 只需要输入描述就可…

KUKA机器人KRC5控制柜面板LED显示

对于KUKA机器人新系列控制柜KRC5控制柜来说&#xff0c;其控制柜面板LED布局如下图&#xff1a; 其中①②③④分别为&#xff1a; 1、机器人控制柜处于不同状态时&#xff0c;LED显示如下&#xff1a; 2、机器人控制柜正在运行时&#xff1a; 3、机器人控制柜运行时出现的故障…

编写函数isprime(int a),用来判断自变量a是否为素数,若是素数,函数返回整数1,否则返回0

int main() {int isprime(int x);int x;printf("请输入一个数\n");scanf("%d", &x);if (isprime(x)){printf("%d是素数\n",x);}else{printf("%d不是素数\n",x);} } int isprime(int a) {int i;for (i 2; i < a / 2; i){if (a%…