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

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

✏️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连接和关闭中的状态过程

🚩结尾

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


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

删除有序链表中重复的元素-II(链表)

乌!蒙!山!连!着!山!外!山! 题目: 思路: 双指针,slow和fast,并且增加标记flag初始为1。 如果slow指向节点值等于fast指向节点值&…

pytorch3d成功安装

一、pytorch3d是什么? PyTorch3D的目标是帮助加速深度学习和3D交叉点的研究。3D数据比2D图像更复杂,在从事Mesh R-CNN和C3DPO等项目时,我们遇到了一些挑战,包括3D数据表示、批处理和速度。我们开发了许多有用的算子和抽象&#xf…

React快速入门

最近需要学到react&#xff0c;这里进行一个快速的入门&#xff0c;参考react官网 1.创建和嵌套组件 react的组件封装是个思想&#xff0c;我这里快速演示代码&#xff0c;自己本身也不太熟悉。 代码的路径是src底下的App.js function MyButton() {return (<button>I…

JVM前世今生之JVM内存模型

JVM内存模型所指的是JVM运行时区域&#xff0c;该区域分为两大块 线程共享区域 堆内存、方法区&#xff0c;即所有线程都能访问该区域&#xff0c;随着虚拟机和GC创建和销毁 线程独占区域 虚拟机栈、本地方法栈、程序计数器&#xff0c;即每个线程都有自己独立的区域&#…

USB隔离器电路分析,SA8338矽塔sytatek电机驱动,源特科技VPS8701,开关电源,电源 大师

一、 USB隔离器电路分析 进行usb隔离可以使用USB隔离模块 ADUM3160 ADUM4160 注意&#xff1a;B0505S 最大带载0.16A&#xff0c;副边需要带载能力需要改变方案 比如移动硬盘至少需要0.5A 用充电宝、18650、设计5V1A输出电源 二、 1A隔离电压方案

掌握指针进阶:探索字符指针、数组指针和指针数组的妙用

&#x1f341;博客主页&#xff1a;江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言进阶之路 &#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa;我的社区&#xff1a;GeekHub &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文章目录 一…

Python应用工具-Jupyter Notebook

工具简介 Jupyter Notebook是 基于 网页的用于交互计算的 应用程序&#xff0c;以网页的形式打开&#xff0c;可以在网页页面中直接编写代码和运行代码&#xff0c;代码的运行结果也会直接在代码块下 显示&#xff0c;文档是保存为后缀名为 . ipynb 的 JSON 格式文件。 操作指令…

Shell脚本基础( 四: sed编辑器)

目录 1 简介 1.1 sed编辑器的工作流程 2 sed 2.1 基本用法 2.2 sed基本格式 2.2.1 sed支持正则表达式 2.2.2 匹配正则表达式 2.2.3 奇数偶数表示 2.2.4 -d选项删除 2.2.5 -i修改文件内容 2.2.6 -a 追加 2.3 搜索替代 2.4 变量 1 简介 sed是一种流编辑器&#xff0c;…

【开发】视频云存储EasyCVR视频汇聚平台AI智能算法定制

安防视频集中存储EasyCVR视频汇聚平台&#xff0c;可支持海量视频的轻量化接入与汇聚管理。平台能提供视频存储磁盘阵列、视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联、H.265自动转码等功能。为了便…

【0815作业】搭建select的TCP客户端、poll客户端、tftp文件上传

IO多路复用&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09; 进程中如果同时需要处理多路输入输出流&#xff0c;在使用单进程单线程的情况下&#xff0c;同时处理多个输入输出请求。在无法用多进程多线程&#xff0c;可以选择用IO多路复用&#xff1b;由于不…

Redis之List类型解读

目录 List简介 数据结构 常见命令 概述 ​LPUSH key value1 [value2] ​ LPUSHX key value LINDEX key index LLEN key LPOP key LRANGE key start stop List简介 列表list是一个单键多值的 Redis 列表是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加…

回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现SSA-SVM麻雀搜索算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基…

IDEA下方工具栏SideBar没有Services解决方法 IDEA配合微服务学习多端口管理打开Services栏方法

问题 微服务学习时&#xff0c;一次要打开多个端口&#xff0c;比如8080给order模块、8081给user模块……这就需要用idea管理多端口。 这时候就可以用到Services栏进行管理。 解决 首先看下方Sidebar没有Services。 打开Services 打开方式一&#xff1a;手动打开 在IDEA中…

STM32使用IIC通信的引脚配置问题

STM32使用IIC通信的引脚配置问题 在使用IIC通信时&#xff0c;遇到引脚配置问题&#xff0c;记录一下&#xff1a; IIC的两个引脚SDA和SCL都要求既能输入又能输出。 问题&#xff1a; SDA线是由不同的器件分时控制的&#xff0c;这样就会有一个问题&#xff1a;当一个器件主动…

RabbitMQ的5种消息队列

RabbitMQ的5种消息队列 1、七种模式介绍与应用场景 1.1 简单模式(Hello World) 一个生产者对应一个消费者&#xff0c;RabbitMQ 相当于一个消息代理&#xff0c;负责将 A 的消息转发给 B。 应用场景&#xff1a;将发送的电子邮件放到消息队列&#xff0c;然后邮件服务在队列…

Java虚拟机(JVM):虚拟机栈溢出

一、概念 Java虚拟机栈溢出&#xff08;Java Virtual Machine Stack Overflow&#xff09;是指在Java程序中&#xff0c;当线程调用的方法层级过深&#xff0c;导致栈空间溢出的情况。 Java虚拟机栈是每个线程私有的&#xff0c;用于存储方法的调用和局部变量的内存空间。每当…

csapp archlab PartC满分解答

任务 修改ncopy.ys和pipe-full.hcl以尽可能的提高ncopy.ys的运行速度 思路 pipe-full.hcl&#xff1a; 实现iaddq指令&#xff08;家庭作业4.54&#xff09;实现加载转发&#xff08;家庭作业4.57&#xff09; ncopy.ys&#xff1a; 使用循环展开&#xff08;第5.8节&…

2023国赛数学建模思路 - 案例:FPTree-频繁模式树算法

文章目录 算法介绍FP树表示法构建FP树实现代码 建模资料 ## 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法&#xff0c;就是频繁模式树算法&#xff0c…

item_review-获得TB商品评论

一、接口参数说明&#xff1a; item_review-获得TB商品评论&#xff0c;点击更多API调试&#xff0c;请移步注册API账号点击获取测试key和secret 公共参数 请求地址: https://api-gw.onebound.cn/taobao/item_review 名称类型必须描述keyString是调用key&#xff08;点击获取…

小程序商品如何指定打印机

有些商家&#xff0c;可能有多个仓库。不同的仓库&#xff0c;存放不同的商品。当客户下单时&#xff0c;小程序如何自动按照仓库拆分订单&#xff0c;如何让打印机自动打印对应仓库的订单呢&#xff1f;下面就来介绍一下吧。 1. 设置订单分发模式。进入管理员后台&#xff0c…