[三次握手]TCP三次握手由入门到精通(知识精讲)

news2024/11/24 13:37:56

 ⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜

✏️write in front✏️
📝个人主页:陈丹宇jmu
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
🙉联系作者🙈by QQ:813942269🐧
🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意🏳️‍🌈
✉️少年不惧岁月长,彼方尚有荣光在 🏆

📋笔记目录

建议在文章界面右边的导航栏中选择隐藏侧边栏并显示文章目录


《TCP建立连接 ---- 三次握手知识精讲》

⭐三次握手的基本概念

💡三次握手概念简述 

三次握手是TCP/IP协议中建立可靠连接的过程,其基本原理如下:

        三次握手(Three-way Handshake)是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。

        进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常;并且指定自己的ISN初始化序列号(Sequence Number)为后面数据的可靠性传输做准备。

        三次握手实质上其实就是客户端请求连接服务器指定(传输层)端口,建立TCP连接,并同步连接双方的序列号确认号,交换TCP窗口大小信息(windows size)以及最大段长MSS(单个TCP数据段中能够承载的最大有效载荷Payload大小等信息。

💡三次握手具体过程

三次握手的交互过程

客户端与服务器端为建立连接之前: 

刚开始客户端处于 Closed 的状态,服务端处于 Listen 状态。

进行三次握手:

第一次握手:

        客户端给服务端发一个 SYN 报文,并指明客户端的初始化序列号 ISN(随机生成的)。此时客户端处于 SYN_SENT 状态。

        客户端首部的同步位SYN=1,初始序号seq=x,SYN=1的报文段不能携带数据,但要消耗掉一个序号。

第二次握手:

        服务器收到客户端的 SYN 报文之后,会以自己的 SYN 报文作为应答,并且也是指定了自己的初始化序列号 ISN(随机生成的)。同时会把客户端的 ISN + 1 作为ACK 的值,表示自己已经收到了客户端的 SYN,此时服务器处于 SYN_RCVD 的状态。

        服务器在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y。

第三次握手:

        客户端收到 SYN 报文之后,会发送一个 ACK 报文,当然,也是一样把服务器的 ISN + 1 作为 ACK 的值,表示已经收到了服务端的 SYN 报文,此时客户端处于 ESTABLISHED 状态。服务器收到 ACK 报文之后,也处于 ESTABLISHED 状态,此时,双方已建立起了连接。

        确认报文段ACK=1,确认号ack=y+1,序号seq=x+1(初始为seq=x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。

        发送第一个SYN的一端将执行主动打开(active open),接收这个SYN并发回下一个SYN的另一端执行被动打开(passive open)

💡三次握手的过程解读 

CLOSED
        表示初始状态,TCP连接处在关闭状态。
LISTEN
        这个也是非常容易理解的一个状态,表示服务器端的某个SOCKET处于监听(Listen)状态,可以接受连接了。
​SYN_RCVD
        这个状态表示接受到了SYN报文,在正常情况下,这个状态是服务器端的SOCKET在建立TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用netstat你是很难看到这种状态的,除非你特意写了一个客户端测试程序,故意将三次TCP握手过程中最后一个ACK报文不予发送。因此这种状态时,当收到客户端的ACK报文后,它会进入到ESTABLISHED状态。
SYN_SENT
        这个状态与SYN_RCVD遥相呼应,当客户端SOCKET执行CONNECT连接时,它首先发送SYN报文,因此也随即它会进入到了SYN_SENT状态,并等待服务端的发送三次握手中的第2个报文。SYN_SENT状态表示客户端已发送SYN报文。
ESTABLISHED
        这个容易理解了,表示连接已经建立了。

⭐套接字与三次握手的关联

        套接字(Socket)和TCP三次握手是网络通信中的两个重要概念,它们之间存在密切的关联。

在socket编程中,客户端执行connect()时,将触发三次握手。

        TCP三次握手是建立TCP连接时使用的一种协议,用于确保通信双方都能够正常收发数据。在进行TCP三次握手时,客户端和服务器之间会使用各自的套接字来进行通信。

套接字和TCP三次握手的关联

        先看一下网络通信最初的过程,服务器端通过 socket(创建套接字),bind (绑定)和 listen(监听) 完成了被动套接字的准备工作,被动的意思就是等着别人来连接,然后调用 accept(等待请求),服务器端就会阻塞在这里,等待客户端的连接来临;客户端通过调用 socket (创建套接字)和 connect 函数之后,也会阻塞。接下来的事情是由操作系统内核完成的,更具体一点的说,是操作系统内核网络协议栈在工作。 

  1. 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当前发送序列号 j,客户端进入 SYNC_SENT 状态;
  2. 服务器端的协议栈收到这个包之后,和客户端进行 ACK 应答,应答的值为 j+1,表示对 SYN 包 j 的确认,同时服务器也发送一个 SYN 包,告诉客户端当前我的发送序列号为 k,服务器端进入 SYNC_RCVD 状态;
  3. 客户端协议栈收到 ACK 之后,使得应用程序从 connect 调用返回,表示客户端到服务器端的单向连接建立成功,客户端的状态为 ESTABLISHED,同时客户端协议栈也会对服务器端的 SYN 包进行应答,应答数据为 k+1;
  4. 应答包到达服务器端后,服务器端协议栈使得 accept 阻塞调用返回,这个时候服务器端到客户端的单向连接也建立成功,服务器端也进入 ESTABLISHED 状态。

        套接字(Socket)是计算机网络通信中一种抽象概念,它用于实现不同计算机之间或同一计算机内进程间的通信。套接字提供了一种接口,使得应用程序能够通过网络发送和接收数据。

        在网络通信中,套接字可描述为一个网络连接的端点。套接字Socket由IP地址端口号组成,其中IP地址用于标识网络中的主机,而端口号则用于标识主机上的具体进程。套接字就像是通信中的“插座”,连接到网络中的特定位置,以便数据的传输。

⭐深入认识套接字Socket

💡套接字的基本概念

      套接字(Socket)是在应用层传输层之间建立起的一个抽象概念,用于实现网络上的进程间通信。套接字提供了一种机制,使得应用程序能够通过网络发送和接收数据。在TCP/IP协议栈中,套接字通常与传输层协议TCP关联。

💡套接字 / 数据报套接字

        套接字可以根据其类型分为两种常见的类型:流套接字(Stream Socket)和数据报套接字(Datagram Socket)。

  • 流套接字(Stream Socket):基于传输控制协议(TCP),提供面向连接、可靠的、全双工的通信方式。它提供有序、无差错的数据传输,确保数据的可靠性和完整性。流套接字适用于需要稳定、可靠传输的场景,如文件传输、网页浏览等。

  • 数据报套接字(Datagram Socket):基于用户数据报协议(UDP),提供无连接、不可靠的、不可靠的通信方式。它不提供可靠性保证,数据传输可能出现丢失、重复、乱序等情况。数据报套接字适用于对实时性要求较高、对数据准确性要求相对较低的场景,如音频/视频流传输、实时游戏等。

        套接字在应用程序中通过编程接口(如套接字API)来创建、绑定、监听、连接和发送/接收数据等操作。不同编程语言提供了相应的套接字API,如C语言的Socket API、Python的socket模块等,开发者可根据需要选择合适的API进行套接字编程。

总之,套接字是计算机网络通信中实现进程间通信的一种抽象概念,它允许应用程序通过网络进行数据传输。通过套接字,不同端点的计算机可以建立连接并交换数据,实现网络通信的功能。

⭐深入理解TCP传输层协议

💡TCP传输层协议的认识

        TCP(Transmission Control Protocol,传输控制协议)是一种常用的网络传输协议,它位于网络模型的传输层,提供可靠的、面向连接的数据传输。

TCP具有以下特点:

  1. 可靠性:TCP通过采用序列号(seq)、确认(ack)和重传机制来确保数据的可靠传输。接收方收到数据后会发送确认消息,发送方在一定时间内未收到确认消息时会重新发送数据,以确保数据的正确交付。

  2. 面向连接:在数据传输之前,TCP要先建立连接,即进行三次握手。这样可以确保通信双方的状态同步,维护一条可靠的通信线路,并在数据传输完成后进行连接的关闭。

  3. 流量控制:TCP通过使用滑动窗口机制来控制数据流量,确保发送方和接收方的数据处理能力匹配,避免因发送速度过快而导致接收方无法处理或丢失数据。

  4. 拥塞控制:TCP使用拥塞控制算法来监测网络的拥塞程度,并根据情况调整发送速率,以避免网络拥塞并保证整体性能。

  5. 面向字节流:TCP将数据视为一连串的字节流,不关心数据的具体内容和边界,通过序列号来标识和重组数据。

        TCP在许多应用中被广泛使用,例如在Web浏览器中进行HTTP通信、电子邮件传输、文件传输等。它提供了可靠性和顺序性保证,适用于要求数据完整性和可靠性的应用场景。

💡Window Size、MSS 和 MTU  

        Window Size、MSS MTU TCP 数据传输中协同作用,以确保高效的数据传输和避免分片(Fragmentation)的发生。

  1. Window Size(窗口大小):用于流量控制拥塞控制。它表示接收方允许发送方在没有收到确认ACK之前发送的字节数量。发送方根据窗口大小来限制自己发送的数据量,以防止过多的数据堆积在网络中,造成拥塞。如果窗口大小更大,发送方就可以发送更多的数据段。窗口大小可以动态调整,以适应网络情况的变化。

  2. MSS(最大段长):是 TCP 协议中的一个参数,指定在单个 TCP 数据段中能够承载的最大有效载荷(Payload)大小。MSS 的值取决于通信双方的能力和网络设备的限制。通常情况下,MSS 的值会根据网络路径的 MTU 进行调整。

  3. MTU(最大传输单元):是指在某个网络中能够一次性传输的最大数据包长度。每个网络链路或设备都有自己的 MTU 值,对数据包的大小有限制。当一个数据包的大小超过了某个网络链路或设备的 MTU 值,就需要进行分片,将数据包拆分成多个小片段进行传输。

这三者的协同作用如下:

  • 发送方根据 MSS 的值将数据划分为适当大小的 TCP 数据段,以确保不超过接收方能够处理的最大有效载荷大小。
  • 发送方根据窗口大小限制自己发送的数据量,避免拥塞和网络堵塞的发生。
  • 发送方根据网络路径的 MTU 大小调整 MSS 的值,以确保在不发生分片的情况下进行数据传输。

        综合来说,MSS 和 窗口大小都是为了控制发送方发送数据的速率和数量,而 MTU 则是为了确保数据包能够在网络中顺利传输而进行分片。它们相互配合,以提供高效、可靠的 TCP 数据传输。

💡TCP头部报文

        要想能深入理解三次握手的深刻内涵,熟悉TCP头部的报文格式必不可少,只有深刻认识和了解到了TCP头部报文每一个字段的内容和含义,结合抓包分析工具,更加深刻地认识到三次握手的过程。

TCP的头部结构

TCP头部报文字段是TCP协议在数据传输过程中用来控制和管理数据包的信息。以下是TCP头部报文的一些常见字段:

  1. 源端口(Source Port):16位字段,表示发送方的端口号。

  2. 目标端口(Destination Port):16位字段,表示接收方的端口号。

  3. 序列号(Sequence Number):32位字段,表示发送方发送的数据字节流的序列号。

  4. 确认号(Acknowledgment Number):32位字段,表示接收方期望接收的下一个数据字节流的序列号。

  5. 数据偏移(Data Offset):4位字段,表示TCP头部的长度,以4字节为单位。

  6. 控制位(Flags):6位字段,包括以下标志位:

    • URG(Urgent):表示紧急指针字段是否有效。
    • ACK(Acknowledgment):表示确认号字段是否有效。
    • PSH(Push):表示接收方应该尽快将数据交给应用程序。
    • RST(Reset):表示中断连接。
    • SYN(Synchronize):表示发起连接请求。
    • FIN(Finish):表示结束连接。
  7. 窗口大小(Window Size):16位字段,表示接收方可接收的数据量大小,用于流量控制。

  8. 校验和(Checksum):16位字段,用于检测TCP头部和数据是否有错误。

  9. 紧急指针(Urgent Pointer):16位字段,在URG标志位有效时指示紧急数据的位置。

  10. 选项(Options):可变长度的字段,用于传递一些额外的控制信息,如最大段长度、时间戳等。

这些字段共同组成了TCP头部报文,通过对这些字段的设置和解析,TCP协议能够实现可靠的数据传输和连接管理。

三次握手过程中比较需要注意的TCP头部报文字段有:

  • 序列号(Sequence Number)
  • 确认号(Acknowledgment Number)
  • 控制位(Flags)中的ACK(Acknowledgment)标志位------表示确认号字段是否有效。
  • 控制位(Flags)中的SYN(Synchronize)标志位------表示发起连接请求。 

🏳️‍🌈附录 

流式套接字的建立

流式套接字的建立过程

数据报套接字建立

数据报套接字的建立

套接字在TCP连接和关闭中的状态过程

套接字在TCP连接和关闭中的状态过程

🚩结尾

考虑到阅读篇幅,更多实验内容参考本专栏中的其他文章


🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​
🌈写给读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事顺意🏳️‍🌈

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

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

相关文章

【Rust日报】2023-08-16 Neon 基于 rust 的 AWS Aurora Postgres 的无服务器开源替代品

Neon -- AWS Aurora Postgres 的无服务器开源替代品 简介 Neon 是 AWS Aurora Postgres 的无服务器开源替代品。它将存储和计算分开,并通过跨节点集群重新分布数据来替代 PostgreSQL 存储层。 尝试使用 Neon 免费套餐创建无服务器 Postgres 实例。然后使用您首选的 …

第二篇论文写作启发点V1

第二篇论文写作启发点V1 2.LLFLow模型的缺陷,这是先验,如果先验出现错误,那么后面这个模型都会错误。而我们使用了学习的方式去解决 3. 参考文献和实验时的对照模型最好使用最新的,就是没有被引用过的,这样可以降低论文…

12. Docker可视化工具

目录 1、前言 2、Docker UI 2.1、部署Docker UI 2.2、管理容器 3、Portainer 3.1、部署Portainer 3.2、管理容器 3.3、添加远程Docker 4、Shipyard 1、前言 Docker 提供了命令行工具来管理 Docker 的镜像和运行 Docker 的容器。我们也可以使用图形工具来管理 Docker。…

机器人远程控制软件设计

机器人远程控制软件设计 That’s all.

ECA模块的提出过程

接上文 作者首先肯定了通道注意力机制(在 S E N e t SENet SENet当中提出来的)的作用,对于没有参数的 S E − V A R 1 SE-VAR1 SE−VAR1模型,其效果仍然超过没有通道注意力机制的网络,可见注意力机制是有用的。 但是作…

CMC、mAP解析:图像检索领域评价指标

1. CMC: Cumulative Matching Characteristics 累计匹配特征 CMC是一种计算 top-n 的评价指标,主要用来评估闭集中rank-n的正确率。 下面举例说明: 在双模态特征匹配中。底库 Gallery 中有10条数据(label分别为1,2&am…

回归预测 | MATLAB实现TSO-SVM金枪鱼群算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现TSO-SVM金枪鱼群算法优化支持向量机多输入单输出回归预测(多指标,多图) 目录 回归预测 | MATLAB实现TSO-SVM金枪鱼群算法优化支持向量机多输入单输出回归预测(多指标,多图)效果一览基…

深度优先遍历与连通分量(Java 实例代码源码包下载)

目录 深度优先遍历与连通分量 Java 实例代码 src/runoob/graph/Components.java 文件代码: 深度优先遍历与连通分量 深度优先遍历(Depth First Search)的主要思想是首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点。当没有…

AI在日常生活中的应用:从语音助手到自动驾驶

文章目录 AI的定义和发展AI在日常生活中的应用1. **智能语音助手**2. **智能家居**3. **智能医疗**4. **自动驾驶** 代码示例:使用Python实现基于机器学习的图片分类AI的未来前景结论 🎉欢迎来到AIGC人工智能专栏~探索AI在日常生活中的应用 ☆* o(≧▽≦…

centos9 mysql8修改数据库的存储路径

一、环境 系统:CentOS Stream release 9 mysql版本:mysql Ver 8.0.34 for Linux on x86_64 (MySQL Community Server - GPL) 二、修改mysql的数据库,存储路径 查看目录数据存储的位置 cat /etc/my.cnf操作 1、新建存放的目录,…

【leetcode 力扣刷题】数组交集(数组、set、map都可实现哈希表)

数组交集 349. 两个数组的交集排序+双指针数组实现哈希表unordered_setunordered_map 350. 两个数组的交集Ⅱ排序 双指针数组实现哈希表unordered_map 349. 两个数组的交集 题目链接:349. 两个数组的交集 题目内容如下,理解题意&#xff1a…

react 10之状态管理工具2 redux + react-redux +redux-saga

目录 react 10之状态管理工具2 redux store / index.js 入口文件actionType.js actions常量的文件rootReducer.js 总的reducer 用于聚合所有模块的 reducerrootSaga.js 总的saga 用于聚合所有模块的 sagastore / form / formActions.js 同步修改 isShowstore / form / formRedu…

[机缘参悟-100] :今早的感悟:儒释道代表了不同的人生观、思维模式决定了人的行为模式、创业到处是陷阱、梦想与欺骗其实很容易辨认

目录 一、关于儒释道 二、关于成长性思维与固定性思维 三、关于创业 四、关于梦想与忽悠 一、关于儒释道 儒:逆势而为,修身齐家治国平天下,大公无私 佛:万法皆空,众生皆苦,普度众生,无公无…

如何构建 NodeJS 影院微服务并使用 docker 进行部署

图片来自谷歌 — 封面由我制作 一、说明 构建一个微服务的电影网站,需要Docker、NodeJS、MongoDB,这样的案例您见过吗?如果对此有兴趣,您就继续往下看吧。 在本系列中,我们将构建一个 NodeJS 微服务,并使用…

相邻节点迭代器(Java 实例代码源码包下载)

目录 相邻节点迭代器 Java 实例代码 src/runoob/graph/DenseGraphIterater.java 文件代码: src/runoob/graph/SparseGraphIterater.java 文件代码: 相邻节点迭代器 图论中最常见的操作就是遍历邻边,通过一个顶点遍历相关的邻边。邻接矩阵…

Python编程基础-函数

函数定义与调用 将完成某一特定功能并经常使用的代码编写成函数,在需要使用时直接调用 def 函数名(函数参数): 函数体 return 表达式或者值 def printHello(): #打印hello字符串print (hello)def printNum(): #输出0--9数字for i in range(0,10):print (i)return…

Unity 变量修饰符 之protected ,internal,const , readonly, static

文章目录 protectedinternalconstreadonlystatic protected 当在Unity中使用C#编程时,protected是一种访问修饰符,用于控制类成员(字段、方法、属性等)的可见性和访问权限。protected修饰的成员可以在当前类内部、派生类&#xf…

大数据背景和概念

一、背景 1.岗位现状 大数据在一线互联网已经爆发了好多年,2015年-2020年(国内互联网爆发期)那时候的大数据开发,刚毕业能写Hive SQL配置个离线任务、整个帆软报表都20K起步。如果做到架构师,50K跑不掉。现在市场回归…

字符串旋转(2)

题目要求: 写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如: 给定s1 AABCD和s2 BCDAA,返回1。给定s1abcd和s2ACBD,返回0。AABCD左旋一个字符得到ABCDAAABCD左旋两个字符得到BCDAAAABCD右旋一个…