TCP的三次握手过程

TCP面向连接的、可靠的、基于字节流的传输层通信协议。

TCP是面向连接的协议,所以使用 TCP前必须先建立连接,而建立连接是通过三次握手来进行的。

TCP包头结构

在讲解三次握手的过程之前,我们先来看一下 TCP包的结构:
TCP包结构
TCP包头大小在大多数情况下是固定的,它通常是 20字节(不包括任何选项),但如果启用了选项,则最多可以达到 60字节。下面是 TCP包头的一般结构:

  • 源端口号(16位):表示发送方的端口号。
  • 目标端口号(16位):表示接收方的端口号。
  • 序列号(32位):用于对数据流中的字节进行编号,以便对方能够按顺序重新组装数据。
  • 确认号(32位):表示期望接收到的下一个序列号。
  • 数据偏移(4位):指示 TCP包头的长度,以 4字节为单位。因此,数据偏移的值乘以 4就是 TCP包头的总长度。这个字段也被称为 头部长度
  • 保留位(6位):保留供将来使用,目前全部为 0。
  • 标志位(6位):用于控制 TCP连接的状态,包括 SYNACKFINRSTPSHURG等。
  • 窗口大小(16位):表示发送方的接收窗口大小,用于流量控制。
  • 校验和(16位):用于验证 TCP报文的完整性。
  • 紧急指针(16位):当 URG标志被设置时,紧急指针表示紧急数据的末尾位置。
  • 选项(可选):可以包含各种选项,如最大报文段大小(MSS)、窗口缩放因子等,每个选项的大小不定。

在三次握手过程中,我们主要关注序列号确认号以及标志位中的SYNACK

三次握手过程

通常来说,服务器会开放监听端口,而客户端则主动连接这个端口,创建连接的时候,会进行三次握手,过程如下图所示:
TCP三次握手

  1. 客户端发送 SYN包到服务器,附上一个随机生成的序列号(ISN)。此时客户端处于 SYN_SEND状态。
  2. 服务器返回 SYN+ACK包到客户端,附上一个随机生成的序列号,确认号则是客户端上传的序列号+1。此时服务端处于SYN_RECV状态。
  3. 客户端返回 ACK到服务器,确认号是服务器下发的序列号+1。此时客户端处于ESTABLISHED状态,连接已建立,这个包可以顺带发一些数据。
  4. 服务端收到ACK后,也进入ESTABLISHED状态,可以收发数据。

三次握手的一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。同时也确保了服务端和客户端的收发都能正常进行。

使用 wireshark抓包工具,我们可以看到三次握手的数据:

wireshark

为什么是三次握手?不是两次、四次?

1. TCP 连接使用三次握手的首要原因,是为了防止旧的重复连接初始化造成混乱。

想像一个场景,客户端发了SYN之后宕机了,重启后又发了新的SYN。如果只有两次握手的话,当服务器收到旧的SYN之后,发送ACK给客户端,就直接进入ESTABLISHED状态,这时候就可以发数据了。

但是客户端期待的是新的SYN的序列号,发现服务端发的确认号不对应,会关闭这个连接,而服务器此时已经发了数据过来,这就造成了混乱。

而三次握手,客户端可以收到ACK之后,判断确认号,正确则返回ACK,错误则返回RST告诉服务器关闭这个连接。

使用三次握手和RST控制消息,将是否建立连接的最终控制权交给了客户端,因为只有客户端有足够的上下文来判断当前连接是否是错误的或者过期的,这也是TCP使用三次握手建立连接的最主要原因。

2. 三次握手的第二个原因,是为了交互双方的序列号。

TCP协议的通信双方,都必须维护一个序列号,用来保证数据包的有序,以及丢包时能够重发,所以这个初始化的序列号是很重要的。当客户端发SYN给服务器时,服务器需要返回ACK确认,而服务器发SYN给客户端时,客户端也需要发ACK确认,才能确保两边都有正确的序列号。服务器在发SYNACK时,可以合并成一条消息发送,所以是不需要四次握手的。

参考资料

  • 4.1 TCP 三次握手与四次挥手面试题 - 小林coding

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

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

相关文章

MybatisPlus也能轻松生成三层架构代码?

👩🏽‍💻个人主页:阿木木AEcru 🔥 系列专栏:《Docker容器化部署系列》 《Java每日面筋》 💹每一次技术突破,都是对自我能力的挑战和超越。 目录 一、前言三层架构的流程图为什么使用…

Linux:进程信号(一)信号的产生

目录 一、信号是什么? 二、Linux信号 三、信号处理方式 四、信号的产生 1、 通过终端按键产生信号 2、调用系统函数向进程发信号 3、 硬件异常产生信号 一、信号是什么? 在生活中,有许多信号,比如红绿灯,下课铃声…

Unity MeshRenderer 入门

概述 在项目制作过程中,肯定缺少不了模型的使用,那就一定接触过MeshRenderer,也许还有你不理解的地方,接下来让我们来学习一下这部分的内容吧。 Mesh Filter(网格过滤器) Mesh:提供一个网格的参考&#xf…

uniapp 禁止截屏(应用内,保护隐私)插件 Ba-ScreenShot

禁止截屏(应用内,保护隐私) Ba-ScreenShot 简介(下载地址) Ba-ScreenShot 是一款uniapp禁止应用内截屏的插件,保护隐私,支持禁止截屏、放开截屏 截图展示 也可关注博客,实时更新最…

Kalign 3:大型数据集的多序列比对

之前一直用的是muscle,看到一个文章使用了Kalign,尝试一下吧 安装 wget -c https://github.com/TimoLassmann/kalign/archive/refs/tags/v3.4.0.tar.gz tar -zxvf v3.4.0.tar.gz cd kalign-3.4.0 mkdir build cd build cmake .. make make test su…

各城市-人口就业和工资数据(1978-2022年)

这份数据收集了1978年至2022年间300多个地级市的人口、就业和工资等数据。涵盖的指标包括从业人员数量、平均工资水平、人口密度等,通过这些数据可以深入了解中国各地城市的人口结构、就业状况以及工资水平的变化趋势。这些数据对于研究城市发展、劳动力市场以及区域…

幻兽帕鲁游戏主机多少钱?幻兽帕鲁游戏服务器一个月仅需32元

随着游戏产业的蓬勃发展,腾讯云紧跟潮流,推出了针对热门游戏《幻兽帕鲁Palworld》的专属游戏服务器。对于广大游戏爱好者来说,这无疑是一个激动人心的消息。那么,腾讯云幻兽帕鲁游戏主机到底多少钱呢?让我们一起来揭晓…

网络安全的重要性及人才需求

安全现在是大趋势,说是铁饭碗也不为过,就业前景好,方向多比传统计算机行业就业舒服点。但是大厂依然是985,211的天下,是双非能进大厂的,只是凤毛麟角。前提是你的能力可以让公司忽略你的学历。 以2023年为…

uniapp自定义返回事件(封装)

uniapp自定义返回事件 在我们使用uniapp时,我们导航栏一般都是自定义的,比如用uview框架的导航栏,那么返回事件通常会遇到以下几个问题 返回事件前需要做一些额外的处理 h5项目刷新页面后返回失效 返回按钮点击后到指定页面 如果只是监听返…

ubuntu20.04搭建Fabric教程

本章节环境配置 ubuntu: 20.04 go:1.16.3 docker: 20.10.6 docker-compose: 1.27.2 fabric:2.2.0 fabric-ca: 1.4.9 一 搭建通道 新建工作目录 mkdir fabric && cd fabric配置go代理 go env -w GO111MODULEon ​ #更新下载包的镜像 go env …

数据分析之Tebleau可视化:树状图、日历图、气泡图

树状图(适合子分类比较多的) 1.基本树状图的绘制 同时选择产品子分类和销售金额----选择智能推荐----选择树状图 2.双层树状图的绘制 将第二个维度地区拖到产品分类的下面---大的划分区域是上面的维度(产品分类),看着…

ES的脑裂现象

目录 0 集群结点的职责1 什么是脑裂现象2 造成脑裂现象的原因2.1 网络问题(最常见)2.2 主节点负载过大,资源耗尽,别的结点ping不到主节点2.3 主节点JVM内存回收时间过长导致 3 脑裂现象的解决方案3.1 局域网部署3.2 角色分离&…

Vue中Element的下载

打开vscode让项目在终端中打开 输入npm install element-ui2.15.3 然后进行下载 在node_modules中出现element-ui表示下载完成 然后在输入Vue.use(ElementUI); import Vue from vue import App from ./App.vue import router from ./router import ElementUI from element-ui…

9.3.k8s的控制器资源(deployment部署控制器)

目录 一、deployment部署控制器概念 二、deployment资源的清单编写 三、小结 功能 使用场景 原理 四、deployment实现升级和回滚 1.编辑deployment资源清单(v1版本) 2.创建service资源用于访问 ​编辑 3.修改deploy清单中pod镜像版本为V2 4…

64位Office API声明语句第118讲

跟我学VBA,我这里专注VBA, 授人以渔。我98年开始,从源码接触VBA已经20余年了,随着年龄的增长,越来越觉得有必要把这项技能传递给需要这项技术的职场人员。希望职场和数据打交道的朋友,都来学习VBA,利用VBA,起码可以提高…

力扣295. 数据流的中位数

Problem: 295. 数据流的中位数 文章目录 题目描述思路复杂度Code 题目描述 思路 1.定义一个大顶堆和小顶堆; 2.当添加的数据小于大顶堆的堆顶元素或者大顶堆为空时,将元素添加到大顶堆;当元素大于大顶堆堆顶元素时添加到小顶堆;同…

18 如何设计微服务才能防止宕机?

在上一讲里,介绍了构建一个稳健的微服务的具体法则:防备上游、做好自己、怀疑下游, 并介绍了为什么要防备上游,以及一些防备上游的具体手段。 在本讲里,咱们一起来学习,做好微服务自身的设计和代码编写的常…

Android4.4真机移植过程笔记(一)

1、RK源码编译 获取内核源码: git clone git172.28.1.172:rk3188_kernel -b xtc_ok1000 内核编译环境: 从172.28.1.132编译服务器的/data1/ZouZhiPing目录下拷贝toolchain.tar.gz(交叉编译工具链)并解压到与rk3188_kernel同级目…

【项目部署】手把手带你从零部署项目:宝塔 + uwsgi + Django + 腾讯云 + Websocket

1. 前言 哈喽,大家好,我是jiaoxingk。今天带来的是有关Django项目部署的教程。 当我们完成了一个项目作品之后,我们肯定会迫不及待的就准备上线部署啦, 这篇教程将带你从服务器的配置选购,再通过安装宝塔的形式进行项目…

QT程序通过GPIB-USB-HS转接线控制数字万用表

1、硬件准备 1.1、数字万用表 型号 :Agilent 34401A 前面图示: 后面图示:有GPIB接口 1.2、GPIB-USB-HS转接线 2、GPIB协议基础了解 2.1、引脚 8条数据线:DIO1 ~ DIO8 5条管理线:IFC、ATN、REN、EOI、SRQ 3条交握线…