TCP 通信全流程分析:从连接建立到数据传输的深度探索

news2024/9/22 7:36:18

目录

一、TCP报头

二、三次握手

三、数据传输

四、四次挥手


本文通过一次TCP通信过程的分析来学习TCP协议


一、TCP报头

如图是一份TCP报文的报头,标准报头是20个字节,还可带有选项报头,也就是TCP报头的最小长度是20字节。以下是对报头的各个字段的分析:

  • 端口号:向上层交付时交付给哪一个进程。
  • 序列号:为发送的报文的编号,实际上是发送缓冲区的字节序号,旨在让接收方收到多个报文时可以通过序列号排序后向上层交付,还可以在收到重复报文时根据序列号去重。
  • 确认序号:对发送端报文的应答,若确认序号为N,则表明N-1为止所有数据均已到达。
  • 4位首部长度:表明报文的报头长度,单位是4字节;因为只有4位->最大值为15,意味着选项部分报头最大为40字节。
  • 六个标记位:用于区分不同报文的类型,不同类型报文对应了不同的处理逻辑,所以需要用标记为进行区分。以下是具体解释:
  • URG:紧急数据标记位,当URG被置为1时,报头的另一个字段:16位紧急指针中会指向对应的紧急数据,十六位紧急指针是有效载荷的偏移量,紧急数据只有一个字节。
  • ACK:表明对以往收到的报文的确认,一般除了第一个请求报文没有设置ACK以外,其余报文基本都会设置ACK,因为发送出去的数据本身就对对方以往发送的报文具有一定的确认能力,因此双方在进行数据通信时,可以顺便对对方上一次发送的数据进行响应。
  • PSH:报文当中的PSH被设置为1,是在告诉对方尽快将接收缓冲区当中的数据交付给上层。因为内核中的接收缓冲区都会有一个水位线,正常情况下只有数据大小超过了水位线才会允许上层读取数据,以减少内核态和用户态来回切换的成本;但当收到的报文带有PSH标记,即使缓冲区的数据没有超过水位线,也会向上层交付数据。
  • RST:当通信时一端发现了异常,就会发送带有RST标记的报文要求重新建立连接
  • SYN:SYN标记为1,表明是一个连接请求的报文;只有请求建立连接时才会有标记为1,正常通信时SYN不会被设置。
  • FIN:FIN标记为1,表明是一个断开连接的报文,正常通信的报文不会设置FIN标记位。
  • 16位窗口大小:每次发送报文时,都会向对方更新当前本机的接收缓冲区的接收能力,以达到动态控制双方报文的发送量;窗口最大也就是64KB。但选项报头中可以设置窗口因子,以设置更大的窗口大小。
  • 校验和:检测在数据传输过程中是否出现了错误或被篡改,保证数据完整性和准确性。

二、三次握手

为了确保TCP通信时的可靠性,TCP协议要求TCP双方在通信前建立一条可靠的通信连接,通过这条连接,通信双方可以确认对方的存在和可用性,并且数据能够正确的传输和接收三次握手就是为了建立一条可靠连接!

  • 第一次握手:A主机向B主机发送标记了SYN的报文,表明请求建立连接
  • 第二次握手:B主机向A主机发送SYN和ACK标记的报文,表明接受建立连接的请求,并等待A确认连接;B开始时处于listen状态,A的连接请求会放在主机B的accept队列中,等到B的处理
  • 第三次握手:A发送ACK报文表示确认连接

需要注意的是,A主机在第三次发送ACK报文时就已经建立好了连接处于ESTABLISHED状态,而B是在收到了A的ACK报文时才会建立连接处于ESTABLISHED状态。

三次握手确保了双发都有收发数据的能力;当A收到第二次握手的报文时,A就确定了自己发送的报文对方能收到,但此时B并不清楚自己发出去的报文A是否能收到,只有当B收到第三次握手的报文时,B也确定了自己发送的报文对方能收到,此时就确保了双向信道的可靠性。

所以一次、两次握手是不可行的,三次握手是确保全双工可靠通信的最小成本;当然了,三次握手都可以,四次握手当然也能确保建立一条可靠连接了,其实三次握手中的第二次握手的报文是捎带应答了,不然确实就是四次握手了。

三次握手期间,顺便进行了序号协商和窗口更新的操作,在后续正常通信中,确保数据的按序交付和实现流量控制。 这是后续TCP协议高效、可靠传输数据的关键环节。

三、数据传输

TCP经过三次握手建立连接后,就可以正常的收发数据了

  • 发送数据:TCP在发送缓冲区的滑动窗口中,选择还未发送的数据,对数据分包并添加报头,交给下层的IP层去发送
  • 接收数据:TCP收到数据后,会根据报头中的序号给多个报文中的数据排序,去掉报头,放在接收缓冲区中,并根据收到的数据的字节序设置确认序号,向发送方发送应答报文。

  • 超时重传:当发送方以往发送的报文在一定时间后没有收到应答报文,会触发超时重传机制

在主机A发送一个报文后,会启动一个计时器,计时到期还没收到应答报文就会再次重发数据包

  • 滑动窗口机制:

滑动窗口内的数据,可以直接封装报头发送,暂时不需要对方应答,从而实现并发的发送大量报文。

双方都维护一个窗口大小,并在报文中更新;窗口中的数据可以直接发送,待收到应答后在移除窗口,已发送未确认的数据后来要么因为收到应答报文被移除,要么因为触发超时重传或快速重传被再次发送;双方通过报文中对方的窗口大小和网络负载情况动态的调整自己的窗口大小。

win_stat = 最新收到的确认序号

win_end = min(对方窗口,拥塞窗口)

以此实现流量控制,在网络环境良好的情况下,根据对方的接收能力来决定发送报文的多少;与此同时,拥塞窗口一直在探测网络环境,当出现网络拥塞时,以网络环境为主,少量的发送报文继续下一轮网络环境的探测。

  • 拥塞控制算法:Reno(慢启动、拥塞避免、快速重传、快速恢复)

TCP引入 慢启动 机制, 先发少量的数据, 探探路, 摸清当前的网络拥堵状态, 再决定按照多大的速度传输数据;像上面这样的拥塞窗口增长速度, 是指数级别的. "慢启动" 只是指初使时慢, 但是增长速度非常快。

TCP会预设一个慢启动阈值,当拥塞窗口窗口这一值时,会从指数增长变为线性增长,进入拥塞避免阶段;如图就是发送端每收到8个应答拥塞窗口就增加1,以此继续线性增长以探测网络环境,当网络环境拥塞时,会根据严重程度处理拥塞窗口的变化逻辑。一般而言,超时丢包是比较严重的,说明网络拥塞比较严重,TCP会更新为慢启动模式,将慢启动阈值设为当前拥塞窗口的一半

如果是收到三次同样的ACK报文,则说明是某一个数据包丢失,此时网络是轻微拥塞,没必要大幅调整拥塞窗口,会使用快速重传和快速恢复算法:

四、四次挥手

TCP是全双工的,两个方向可以同时传输数据,因此,两个方向都需要单独关闭。

A主机在数据发送结束后,发送一个FIN的报文来终止A--->B方向的传输,待B主机应答后进入半关闭状态(不能再主动发数据);B主机检查自己的数据是否发送完毕,若未完成则继续发送,直到完成后发送一个FIN来终止传输,在收到A的应答后关闭整个连接。

需要注意的是:主动关闭的一方,响应最后一个ACK报文后,会进入TIME_WAIT状态,而被动关闭的一方在收到应答报文后会直接关闭。

这是因为:

  1. 确保最后一个 ACK 能被对方收到
    假设主动关闭方发送的最后一个 ACK 丢失了,被动关闭方会因为没有收到 ACK 而重传 FIN 报文。如果主动关闭方没有处于 TIME_WAIT 状态而是直接关闭,就无法响应重传的 FIN 报文,导致被动关闭方不能正常关闭连接。

  2. 允许老的重复分节在网络中消逝
    TCP 连接可能会因为网络延迟等原因出现数据包延迟到达的情况。如果新的连接使用了与刚刚关闭的连接相同的端口和 IP 地址,而延迟的旧数据包到达,可能会造成数据混乱。通过在 TIME_WAIT 状态等待一段时间,可以确保这些延迟的数据包在新连接建立之前已经消失,避免对新连接产生影响。

以下是从连接建立到正常通信,再到连接关闭的状态示意图:

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

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

相关文章

一位入门者关于 JavaScript 单线程的一些思考

人们一提起 JavaScript 就会想起单线程,那么为什么会这样呢?这经得住推敲吗?不同的执行环境又有什么差异呢? 带着这些问题,我通过自问自答的方式,整理了一份关于 Javascript 单线程的知识汇总 整体的思考…

AI学习记录 - gpt如何进行token化,理论知识,以GPT2为举例

AI学习记录已经发了十几篇,大佬们可以看看,如果有帮助动动小手点赞 token入门版,有空会更新具体代码操作,能学到一点东西的话,大佬们点个赞!!! GPT4当中,我们提问问题是…

Webpack构建工具

1 概述 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。 它的主要作用是将多个松散的模块,包括 JavaScript、CSS、图片、字体等资源,按照指定的规则和依赖关系打包成一个或多个优化后的静态资源文件…

基于RHEL7系统搭建PXE技术体系

目录 一、kickstart自动化安装脚本制作 1、实验前提 2、安装图形界面并启动,关闭DHCP服务 3、安装图形化生成kickstart自动安装脚本的工具并启动 二、搭建DHCP服务并测试脚本 1、安装dhcp 2、生成配置文件 3、编辑配置文件 三、搭建pxe网络安装环境实现服务…

centos安装maven

1.下载maven 去官网选择自己需要的版本 Maven – Download Apache Maven 复制链接 2.使用wget下载 先切换到opt文件夹 再将复制的链接使用wget下载 因为wget下载速度很慢,所以这里使用https://mirrors.tuna.tsinghua.edu.cn镜像 cd /opt wget https://mirrors.tu…

交易困境如何克服,可以先浏览Anzo Capital 昂首资本官网

是不是经常有这样的交易员,常因感到“我知道得不够多”而在交易中做出不合逻辑的行为。在这种心态下,交易员总想寻找更优秀的交易者、更佳的买卖时机以及更有效的策略。事实上,这类追求往往陷入过多无用信息的泥潭,让人难以甄别哪…

【系统架构设计师】二十五、大数据架构设计理论与实践③

目录 六、大数据架构设计案例分析 6.1 Lambda架构在某网奥运中的大数据应用 6.2 Lambda架构在某网广告平台的应用与演进 6.2.1 第一版架构 6.2.1 第二版架构 6.2.3 第三版架构 6.3 某证券公司大数据系统 6.4 某电商智能决策大数据系统 六、大数据架构设计案例分析 6.…

centos上传工具

yum install lrzsz 安装完成之后 作用是 输入 rz 可以本地上传文件

【生成式人工智能-八-大型语言模型的能力评估】

语言模型的能力评估 评估难度来自哪里输出没办法确定给出选择题本身就没标准答案 评估方法人力用语言模型来评估语言模型语言模型的偏爱 评估语言模型的数据集评估模型的不同能力阅读长文的能力心智测验道德性测试安全性测试 通常情况下我们想到的语言模型能力评估,…

图神经网络实战(18)——消息传播神经网络

图神经网络实战(18)——消息传播神经网络 0. 前言1. 消息传播神经网络2. 实现 MPNN 框架小结系列链接 0. 前言 我们已经学习了多种图神经网络 (Graph Neural Networks, GNN) 变体,包括图卷积网络 (Graph Convolutional Network, GCN)、图注意…

在macOS平台上通过Jenkins远程打包报错,提示errSecInternalComponent

问题:在macOS平台上通过Jenkins远程打包报错,提示errSecInternalComponent 原因 出现这个问题的主要原因:Jenkins以ssh方式到slave机上,默认是没有账户的,但是访问钥匙串要求必须有用户身份 通过Xcode打包的过程中&am…

Ps:通过 RGB 值计算 HSB 值

在 Photoshop 中,HSB(色相、饱和度和明度)仅作为表达颜色的一种方式而存在,并不是一种颜色模式。 色相/饱和度命令就是基于色彩三要素进行调色的常用命令。 还有一个与 HSB 相关的滤镜:HSB/HSL 滤镜,用于实…

无人机培训机构推广运营理论技术

一、市场定位与品牌建设 在无人机培训行业的激烈竞争中,精准的市场定位是成功的第一步。首先,需明确目标学员群体,如航拍爱好者、农业植保服务者、应急救援人员或专业无人机操作员等。基于目标群体的需求,构建差异化的品牌形象。…

一个升级的多租户权限管理系统,组件化,模块化,轻耦合,高扩展企业级的应用框架,功能强大(附源码)

前言 在现代软件开发中,多租户权限管理系统是企业级应用中的一个关键组件。然而,现有的一些框架,如RuoYi,虽然提供了一些基本的功能,但在面对更复杂的企业级需求时,如原生的MyBatis使用、复杂的分页处理&a…

【桥接模式】设计模式系列:分离抽象与实现的艺术(构建可扩展性的桥梁)

文章目录 Java设计模式系列之桥接模式:分离抽象与实现1. 引言2. 设计模式简介桥接模式定义桥接模式与其他模式的区别 3. 桥接模式的基本原理模式的核心概念抽象化与实现化的分离实现细节的封装解耦的机制 4. 桥接模式的角色介绍角色介绍UML和时序图代码示例说明 5. …

.Net Core IIS 程序报错 Access to the path c:\\windows\\TEMP\\poifiles is denied

程序运行报错:Access to the path c:\\windows\\TEMP\\poifiles is denied ,此错误本文介绍两种解决办法,选择适合你的方法即可;一般.Net程序运行方案二可能比较常用。 解决方案一: 从 IIS 访问文件系统 如果您在浏…

【HarmonyOS NEXT星河版开发学习】小型测试案例09-B站卡片

个人主页→VON 收录专栏→鸿蒙开发小型案例总结​​​​​ 基础语法部分会发布于github 和 gitee上面(暂未发布) 前言 鸿蒙开发中层叠布局通过Stack容器组件实现了强大的页面层叠和位置定位能力。这种布局方式不仅增强了界面的美观性和功能性&#xff0c…

《Advanced RAG》-10-Corrective Retrieval Augmented Generation (CRAG)

摘要 CRAG 设计了一个轻量级检索评估器,用于评估针对特定查询检索到的文档的整体质量,并使用网络搜索作为改进检索结果的辅助工具。CRAG 可与基于 RAG 的各种方法无缝集成,并提供了一个插件式的解决方案。 CRAG 的主要思想是引入一个检索评估…

前端面试宝典【vue篇】【5】

在前端开发的世界里,每一次面试都是一次机遇,也是一次挑战。 你是否曾因技术深度不够而错失良机? 或是面对最新的技术趋势感到迷茫? 我们的【前端面试宝典】正是为此而来。 由拥有多年一线实战经验的资深工程师亲自授课,结合最新的行业动态与实战案例,旨在全面提升你的技…

Java与Python的跨界融合:打造高效与灵活的编程体验

目录 一、引言 1.1 为什么结合Java与Python 1.2 结合方式概览 二、实现方法详解 2.1 Web服务接口 2.2 命令行调用 三、高级融合方式 3.1 Jython 3.2 GRPC/Protobuf 四、优势与挑战 4.1 优势 4.2 挑战 五、结论 在当今快速发展的软件开发领域,单一编程语…