当前位置: 首页 > news >正文

46、TCP的“三次握手”

在上一节中,TCP首部常用的几个选项,有些选项的参数就是在通信双方在建立TCP连接的时候进行确定和协商的。所以在学习过TCP报文首部之后,下面我们开始学习TCP的连接建立。

TCP的一个特点是提供可靠的传输机制,还有一个特点就是TCP是面向连接的面向连接意思就是说,在进行数据的传输之前,先要建立连接,再传输数据,传输完毕之后再释放连接。在这个过程中,要保证可靠传输的话,建立连接需要通信双方进行“三次握手”,数据传输中由一些TCP的可靠机制来保证,释放连接需要通信双方进行“四次挥手”。我们按顺序学习,这一节先学习建立连接的“三次握手”过程。

“三次握手”这是一个比较传统的名称,也是业内用的最广泛的说法。但这个说法并不太准确,谢希仁教授的最新一版的教材中指出更准确的说法应该是“三报文握手”,因为通信双方建立TCP连接时相互交换了三个报文,而不是三次。不过,为了贴合业内已被广泛使用的说法,所以本文还是使用“三次握手”这个称呼。


“三次握手”的过程

为了更清楚的说明这个过程,所以我们在这里学习的时候,最好带入一个情景,最典型的就是“C/S情景”也就是“客户—服务器”情景。客户是请求服务的,服务器是提供服务的,带入这个情景可以更好的理解整个交互过程,而且TCP建立连接使用的就是“客户—服务器”的方式。

不过,要注意的是:“客户—服务器”这里指的是一种比较抽象的概念,我们前面讲两台主机之间的通信实际上就是两个应用进程之间的通信。所以我们就这样想:请求服务的一方,它的进程需要主动发起连接,而提供服务的一方,它的进程要等待连接建立。主动发起连接的就是客户进程,等待连接建立的就是服务器进程。

带入这个情景之后,“三次握手”的过程理解起来也就比较容易了:

使用教材上比较经典的例子来说明:

在上面这个图中,客户方是主机A的一个进程,服务器方是主机B的一个进程。(为了方便叙述,以下简述为客户A、服务器B)

图中的“CLOSED”、“LISTEN”、“SYN-SENT”等等,这些代表的是TCP的连接状态,表明当前这个TCP连接处在哪个步骤。

第一次握手

一开始,客户A和服务器B都是处于“CLOSED”状态,也就是关闭状态。客户A主动发起TCP建立连接请求,也就是向服务器B发送一个报文段,在这个报文段中“SYN”控制位设置为1,表明“同步位有效”,并选择一个随机数 x 作为序号,发送完毕之后客户A进入“SYN-SENT”(同步已发送)状态。同时,服务器B由于是等待连接建立,所以是进入“LISTEN”(监听)状态,等待来自客户端的连接建立请求。

第二次握手

接收到客户端的连接建立请求后,服务器B进入“SYN-RCVD”(同步已收到)状态,并向客户A发回一个确认报文。在这个确认报文中,同样要把“SYN”位设置为有效,同时选择一个新的随机数 y 作为确认报文的序号。另外,由于这是确认报文,所以必须把“ACK”位也设置为有效,并选择“x+1”作为确认号

在这里,我们就可以注意到一个问题了。为什么确认号是“x+1”呢?

我们前面讲过,确认号的意思是:期望收到对方的下一个报文的序号。客户A发送建立请求的时候,序号设置为了 x ,服务器B发回确认的时候,把确认号设置为了x+1,这就说明服务器B期望收到客户A下一次发来序号为“x+1”的报文段。

这就透露给我们一个细节:第一次握手的时候,客户A发出去的报文段是不携带数据的,也就是这个报文段的数据部分是0字节

第三次握手

客户A收到对方的确认报文之后,还要向对方发送一个“确认的确认”。在这个“确认的确认”报文中,SYN位不需要有效了,因为双方已经完成同步了,ACK位必须有效,因为还要使用确认号。值得注意的是:seq值,也就是序号需要设置为“x+1”,因为对方期望我发送的下一个报文段的序号是“x+1”,你期望这个,我就发给你这个;同理,这个ack值,也就是确认号要设置为“y+1”,因为刚才对方发来的序号是y,所以我期望你下一次发来序号为“y+1”的报文段。

由此可见,第二次握手和第一次握手一样,都是不携带数据的

第三次握手的报文发出去之后,客户A进入“ESTABLISHED”(连接已建立)状态,服务器B收到后,同样进入(连接已建立)状态,TCP连接建立成功。

不过从图中,我们可以看到,第三次握手的报文在发送过程中,可以进行数据传送。这个是可以的,第三次握手的报文是可以携带数据的

现在,又有一个问题,为什么必须是三次握手呢?看下面的情况:

假设,A发送连接建立请求,但是很不巧,当时这个报文“走”的网络路径比较拥堵,导致这个报文在路上某一个路由器上长时间滞留。所以A在超时定时器到期之时,重传了这个请求,这次与服务器B成功建立了TCP连接,传输数据完毕后释放了连接。这时,第一次发出去的建立请求报文又恰好到达了B,这时B就会认为这是一个新的连接,所以B发送出确认,A收到确认后发现这是一个对已经失效的请求报文的确认,所以A不会理睬这个确认,更不会给B发出“确认的确认”,这个连接也就建立不起来,不会白白浪费资源。

最后,需要说明的是:我们在这里只学习了TCP建立连接“三次握手”的最基本也是最必须的设置。当前具体情况中也会有一些其它的设置,比如双方在建立连接时选择是否“窗口缩放”选项、将MSS值设置为多少等选项。


本节我们学习了TCP建立连接的“握手”过程,从下面一节开始将学习数据传输过程中TCP是怎么保证可靠的,包括:TCP的流量控制、拥塞控制、基于滑动窗口的可靠传输等知识。

参考教材:谢希仁《计算机网络》第八版

相关文章:

46、TCP的“三次握手”

在上一节中,TCP首部常用的几个选项,有些选项的参数就是在通信双方在建立TCP连接的时候进行确定和协商的。所以在学习过TCP报文首部之后,下面我们开始学习TCP的连接建立。 TCP的一个特点是提供可靠的传输机制,还有一个特点就是TCP…...

libudev 和 libusb 常见API分析

libudev详解: libudev是Linux系统下的一个库,它提供针对内核提供的udev设备管理服务的函数库。udev是一种内核机制,用于在系统中传递解决方案的有关设备信息,以及在出现设备事件(如删除、插入设备)时触发相应的操作。 …...

[dasctf]misc04

与他不说一模一样吧也差不多 第三届红明谷杯CTF-【MISC】-阿尼亚_keepb1ue的博客-CSDN客flag.zip需要解压密码,在图片中发现一串密文。一串乱码,尝试进行字符编码爆破。获取到密码:简单的编码。https://blog.csdn.net/qq_36618918/article/d…...

Scala的函数式编程与高阶函数,匿名函数,偏函数,函数的闭包、柯里化,抽象控制,懒加载等

Scala的函数式编程 函数式编程 解决问题时,将问题分解成一个一个的步骤,将每个步骤进行封装(函数),通过调用这些封装好的步骤,解决问题。 例如:请求->用户名、密码->连接 JDBC->读取…...

Axure RP 8.1.0.3400(原型设计工具)

Axure RP 8是一款原型设计工具,它提供了丰富的功能和工具,帮助用户创建高质量的网页、移动应用和桌面软件原型。以下是Axure RP 8的一些特色介绍: 强大的交互设计:Axure RP 8支持创建复杂的动画和过渡效果,让你的原型更…...

企业微信、飞书、钉钉机器人消息发送工具类

1、实例化WebClient对象 其实你也可以使用RestTemplate,我这里主要是用到了webflux框架,所以需要实例化客户端请求对象 Bean public WebClient webClient(){HttpClient httpClient getHttpClient();return WebClient.builder().clientConnector(new R…...

手撕 视觉slam14讲 ch7 / pose_estimation_3d2d.cpp (1)

首先理清我们需要实现什么功能,怎么实现,提供一份整体逻辑:包括主函数和功能函数 主函数逻辑: 1. 读图,两张rgb(cv::imread) 2. 找到两张rgb图中的特征点匹配对 2.1定义所需要的参数:keypoints…...

Mac安装Dart时,Homebrew报错 Error: Failure while executing

前言: 最近准备开发Flutter项目时,在安装环境时,安装Homebew时遇到了以下报错信息,在这里分享一下。 报错信息: ~ % brew tap dart-lang/dart > Tapping dart-lang/dart Cloning into /opt/homebrew/Library/Tap…...

SSM整合~

构建并配置项目: 第一步:创建maven项目 第二步:配置pom.xml文件 设置打包方式: 为了方便部署,我们通常情况下,将项目打包为WAR,因为WAR文件是一种可执行的压缩文件,它可以将项目…...

Self-supervised 3D Human Pose Estimation from a Single Image

基于单幅图像的自监督三维人体姿态估计 主页: https://josesosajs.github.io/ imagepose/ 源码:未开源 摘要 我们提出了一种新的自我监督的方法预测三维人体姿势从一个单一的图像。预测网络是从描绘处于典型姿势的人的未标记图像的数据集和一组未配对…...

ubuntu下cups部分场景

第一章:部分操作指令 在计算机领域中,cups 是“通用UNIX打印系统”(Common UNIX Printing System)的缩写,它是一种用于在UNIX-like操作系统上管理打印任务的开源打印系统。cups 提供了一个框架,允许用户和…...

通过geoserver imageMosic发布多张tif数据

通过geoserver imageMosic发布多张tif数据 reference: https://zhuanlan.zhihu.com/p/132388558 https://zhuanlan.zhihu.com/p/103674876 https://docs.geoserver.org/latest/en/user/tutorials/imagemosaic_timeseries/imagemosaic_timeseries.html 步骤 下载数据 http…...

输出图元(四)8-2 OpenGL画点函数、OpenGL画线函数

4.3 OpenGL画点函数 要描述一个点的几何要素,我们只需在世界坐标系中指定一个位置。然后该坐标位置和场景中已有的其他几何描述一起被传递给观察子程序。除非指定其他属性值,OpenGL 图元按默认的大小和颜色来显示。默认的图元颜色是白色&#x…...

java八股文

6. 如何保证消息的可靠性? 在RabbitMq的整个消息投递过程中,有三种情况下,会存在消息丢失的问题: 6. RabbitMq如何保证消息的可靠性? 所以从这三个维度保证消息的可靠性去可靠性传递就可以了,从生产者发送…...

算法通关村——解析堆的应用

在数组中找第K大的元素 LeetCode21 Medium 我们要找第 K 大的元素,如果我们找使用大堆的话那么就会造成这个堆到底需要多大的,而且哪一个是第 K 的的元素我们不知道是哪一个索引,我们更想要的结果就是根节点就是我们要找的值,所以…...

爬虫源码---爬取小猫猫交易网站

前言: 本片文章主要对爬虫爬取网页数据来进行一个简单的解答,对与其中的数据来进行一个爬取。 一:环境配置 Python版本:3.7.3 IDE:PyCharm 所需库:requests ,parsel 二:网站页面 我们需要…...

Python的由来和基础语法(一)

目录 一、Python 背景知识 1.1Python 是咋来的? 1.2Python 都能干啥? 1.3Python 的优缺点 二、基础语法 2.1常量和表达式 2.2变量和类型 变量的语法 (1) 定义变量 (2) 使用变量 变量的类型 (1) 整数 (2) 浮点数(小数) (3) 字符串 (4) 布尔 (5) 其他 动态类型…...

使用maven创建springboot项目

创建maven快速启动项目 命令行或者idea、eclipse快捷创建也可以 pom.xml下project项目下导入springboot 父工程 <!--导入springboot 父工程--> <parent><artifactId>spring-boot-starter-parent</artifactId><groupId>org.springframework.bo…...

MySQL 基本操作1

目录 Create insert 插入跟新 1 插入跟新 2 Retrive select where 子句查询 1.查找数学成绩小于 80 的同学。 2.查询数学成绩等于90分的同学。 3.查询总分大于240 的学生 4.查询空值或者非空值 5.查询语文成绩在70~80之间的同学 6.查询英语成绩是99 和 93 和 19 和…...

linux内网yum源服务器搭建

1.nginx: location / {root /usr/local/Kylin-Server-V10-SP3-General-Release-2303-X86_64;autoindex on;autoindex_localtime on;autoindex_exact_size off; } 注:指定到镜像的包名 2.修改yum源地址 cd /etc/yum.repos.d/vim kylin_x86_64.repo 注: --enabled设置为1 3.重…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

WPF八大法则:告别模态窗口卡顿

⚙️ 核心问题&#xff1a;阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程&#xff0c;导致后续逻辑无法执行&#xff1a; var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题&#xff1a…...

Linux中《基础IO》详细介绍

目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改&#xff0c;实现简单cat命令 输出信息到显示器&#xff0c;你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...

6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础

第三周 Day 3 &#x1f3af; 今日目标 理解类&#xff08;class&#xff09;和对象&#xff08;object&#xff09;的关系学会定义类的属性、方法和构造函数&#xff08;init&#xff09;掌握对象的创建与使用初识封装、继承和多态的基本概念&#xff08;预告&#xff09; &a…...