TCP_可靠数据传输原理
引言
在网络通信中,TCP是确保数据可靠传输的关键协议。但在我们深入研究TCP拥塞控制技术之前,让我们先探索可靠数据传输的原理,特别是TCP头部中一些重要字段的作用。
网络层提供了点对点的通信服务,努力交付数据报,但并不保证可靠交付。这引出了运输层的角色,而TCP和UDP是两种截然不同的协议,其中UDP实现了运输层的基本职能,而TCP在此基础上实现了数据的可靠传输。

在这个庞大的网络中,我们如何确保数据在通信过程中能够可靠传输?有哪些技术和机制可以应对不同的通信问题,如比特差错、乱序、丢包等?
本文将基于《计算机网络*自顶向下方法》一书的第3.4节内容进行整理,介绍可靠数据传输不同版本的演进过程,对问题逐一进行解答。
构建可靠的数据传输协议
rdt: 可靠数据传输协议(reliable data transfer protocol);
tcp是双向数据传输,简化场景,考虑单向数据传输可靠性如何来保障。从最简单的场景来逐步演化,得到一个可靠的数据传输协议。
rdt1.0:经完全可靠信道的可靠数据传输
这是一种最简单的场景,认为网络层的信道是可靠的,此时接收、发送方直接收发数据即可,无需额外的动作;
状态机:

报文格式:data
rdt2.0: 经具有比特差错信道的可靠数据传输
网络层保障数据的有序送达,但不保障原样交付,即数据可能会出错;
发送方需要增加冗余信息(即tcp头部中的校验和),
接收方需要来识别数据是否损坏(或者说被修改),并告知发送方识别结果;
接收方如果被告知数据损坏,需要进行重传。
此场景下,NAC或者ACK受损的情况。
状态机

报文格式。发送方:data+校验和;接收方应答:接收结果。
rdt2.1:经具有比特差错和乱序信道的可靠数据传输
网络层不会丢包,会保障数据的送达,但不保障有序性和原样交付;即在rdt2.0的基础上,增加了乱序的场景;
如何解决乱序问题,最简单的方案,增加编号。
状态机:


报文格式。发送方:data+校验和+序号;接收方应答:序号+接收结果。
rdt2.2:无NAK机制的rdt2.1实现
在rdt2.1的基础上进行了微调,去掉了显示的NAK应答,只回复ACK信息;通过对同一个分组连续的两个ACK来隐性实现NAK的效果;
状态机:


报文格式和rdt2.1的相同;
rdt3.0:经具有比特差错的丢包信道的可靠数据传输
网络层尽力而为的交付数据报,但不保证可靠交付,在rdt2.2的基础上,增加了丢包。此时网络模型贴合我们实际的环境,即乱序、丢包、受损均可能出现。
识别丢包,发送方需要增加超时机制,超时未收到应答需要重传。重传的引入,可能导致数据包重复接收/送达,接收方需要根据序号去重。
状态机:

和rdt2.2相比,发送方增加了超时处理机制,但对于接收方而言无感,故接收方的状态机和rdt2.2的相同;
报文格式和rdt2.2相同;
交互过程如下:

至此,可靠数据传输协议原理介绍完毕,它用到了校验和、序号、结果确认、定时器这些技术。
性能问题如何提升
rdt3.0保证了数据的可靠传输,但存在一个性能问题,即一次只能传输一个分组。
在千兆带宽、往返传播时延RTT为30ms,一个分组为1500字节的情况下,计算可得真实速率为400Kbps,带宽利用率为万分之四。
为了提高性能,我们需要提高发送数据量的大小、降低RTT,并提升带宽大小。发送数据量的增加和RTT的降低可以提高真实使用速率和带宽利用率。
然而,对于传输链路上的带宽,发送者并不知道它的具体情况。这引出了TCP的拥塞控制机制,它是如何解决这个问题的,我们将在后文中介绍。
流水线可靠数据传输协议
为了提高带宽利用率,我们引入了流水线作业的概念,允许在未收到ACK的情况下同时发送多个数据报。

相较于rdt3.0,流水线作业模式下需要做一些新的调整:
-
增加序号范围: 由于多个分组同时在传输,需要有唯一的序号来区分,包括确认报文。
-
增加缓存空间: 发送方需要存储已发送但未确认的数据,接收方需要存储已接收但未被上层应用读取的数据。
-
异常处理: 在流水线作业中,乱序和丢包的异常处理需要考虑。有两种处理策略:回退N步和选择重传。
回退N步(Go-Back-N,GBN)
针对异常处理的一种策略,当出现丢包时,从丢包的位置开发,其后所有的分组全部重传。

选择重传(Selective Repeat,SR)
针对异常处理的另一种策略,当出现丢包时,发送方选择性的重传。

比较GBN和SR这两种策略,GBN相对简单,但可能会浪费带宽资源。例如,在传输10000个包的情况下,仅第1000个包丢失,后续的9000个包都需要全部重传,这会极大增加网络负载,可能导致拥塞。
而SR按需重传,可能会导致网络利用率较低。例如,连续10个包丢失,每个包依次等待超时重传,会阻塞后续包的传输。
TCP使用的SACK(Selective Acknowledgment)机制告知发送方接收到的失序报文段,从而使发送方更快地传输丢失的数据包。
基于这两种策略,我们可以对比TCP和UDP在传输大数据(如一个zip文件)的场景下的表现。
TCP采用类似SR策略,按需传输丢失的数据包,但由于握手和拥塞控制的影响,前期带宽利用率较低,可能会波动。
而UDP采用类似GBN策略,如果出现丢包,应用层需要重传整个数据,但网络带宽利用率不受影响。
在具体场景中,选择使用哪种协议将取决于需求和性能要求。
TCP报文格式回顾

根据前面介绍的知识点,回顾TCP报文格式中部分字段的含义。
Sequence Number:发送序列号;
Acknowledge Number:确认序列号;
Window:(作为接收方时的)窗口大小;
Checksum:数据校验和;
Options.type=5:SACK机制;用于对收到乱序数据包的场景进行部分确认的机制;
完整格式解读,参见《TCP_报文格式解读》
小结
TCP作为网络通信中的关键协议,在可靠数据传输方面经过多个版本的演进,逐步解决了不同的通信问题,如比特差错、乱序、丢包等。流水线作业的引入为提高带宽利用率提供了思路,而回退N步和选择重传这两种异常处理策略则为解决传输中的异常情况提供了灵活性选择。
在实际应用中,选择TCP或UDP取决于具体场景需求。TCP通过拥塞控制机制适应网络环境变化,而UDP则更适用于对时延和实时性要求较高的场景。对于性能优化,需要平衡发送数据量大小、RTT和带宽,以达到更高的真实速率和带宽利用率。接下来,我们将聚焦于另一个关键领域:TCP的拥塞控制技术。究竟是什么让TCP在网络中表现得如此出色?让我们一同揭开拥塞控制的面纱,深入理解其背后的原理与挑战。
相关文章:
TCP_可靠数据传输原理
引言 在网络通信中,TCP是确保数据可靠传输的关键协议。但在我们深入研究TCP拥塞控制技术之前,让我们先探索可靠数据传输的原理,特别是TCP头部中一些重要字段的作用。 网络层提供了点对点的通信服务,努力交付数据报,但…...
Python随机点名
python随机点名 # 生成 0 ~ 9 之间的随机数 # 导入 random(随机数) 模块 import random print(random.randint(0,9)) 执行以上代码输出结果为: 4 尝试一下 以上实例我们使用了 random 模块的 randint() 函数来生成随机数,你每次执行后都返回不同的数字&a…...
HarmonyOS4.0系统性深入开发07创建一个ArkTS卡片
创建一个ArkTS卡片 在已有的应用工程中,创建ArkTS卡片,具体操作方式如下。 创建卡片。 根据实际业务场景,选择一个卡片模板。 在选择卡片的开发语言类型(Language)时,选择ArkTS选项,然后单…...
胡润研究院发布《2023胡润中国最具历史文化底蕴品牌榜》
胡润研究院发布《2023胡润中国最具历史文化底蕴品牌榜》,前十名分别是片仔癀、同仁堂、贵州茅台、五粮液、中国银行、中华、黄山、农业银行、建设银行、汾酒。 榜单调研范围涵盖中国内地具有60年以上历史的为消费者提供产品或服务的品牌,综合考察品牌历史…...
MFC编程技巧与范例详解01
目录 1、MFC概述 (1)、MFC为什么不用C语言使用C (2)、MFC的开发模型文档-视图模型 (3)、一个完善的MFC程序应该包括 (4)、MFC常用的类 2、MFC的特性 (1)…...
TPS5430正负电源模块
TPS5430正负电源模块 Chapter1 TPS5430正负电源模块一、芯片重要参数二、tps5430参考电路讲解以及PCB布局1.正压降压(15V转12V)2.正压降负压(15V转-12V) Chapter2 使用tps5430制作正负DC-DC降压电源,tps7a47和tps7a33制…...
【LeetCode 面试经典150题】45. Jump Game II 跳跃游戏II
45. Jump Game II 题目大意 You are given a 0-indexed array of integers nums of length n. You are initially positioned at nums[0]. Each element nums[i] represents the maximum length of a forward jump from index i. In other words, if you are at nums[i], yo…...
RustDesk连接客户端提示key不匹配 Key Mismatch无法连接(已解决)
环境: RustDesk1.1.9 服务端docker部署 问题描述: RustDesk连接客户端提示key不匹配 Key Mismatch无法连接 解决方案: 1.docker部署RustDesk服务检查配置 networks:rustdesk-net:external: falsevolumes:hbbr:hbbs:services:hbbs:container_name: rustdesk-hbbsport…...
puppeteer入门指南
一、简介 Puppeteer 是一个 Node 库,它提供了一个高级 API 来通过 DevTools 协议控制 Chromium 或 Chrome。 二、使用 1、安装nodejs最新版 2、安装puppeteer-core npm install puppeteer-core 3、编写main.js const puppeteer require(puppeteer-core);(as…...
vue3按钮点击频率控制
现有一个按钮,如下图 点击时 再次点击 刷新窗口再次点击 刷新窗口依然可以实现点击频率控制。 代码实现: <template><!--<el-config-provider :locale"locale"><router-view/></el-config-provider>--><el…...
(一)Matlab数值计算基础
目录 1.2Matlab中的数据类型 1.2Matlab中的数据类型 逻辑型 逻辑型变量值为1或0字符型 MATLAB的字符型输入使用单引号括起来,字符串存储为字符数组,每个元素占一个ASCII字符数值型 数值型分为整型(int)、单精度浮点型࿰…...
《MySQL系列-InnoDB引擎02》InnoDB存储引擎介绍
文章目录 第二章 InnoDB存储引擎1 InnoDB存储引擎概述2 InnoDB存储引擎的版本3 InnoDB体系架构3.1 后台线程3.2 内存 4 Checkpoint技术5 Master Thread 工作方式5.1 InnoDB 1.0.x版本之前的Master Thread5.2 InnoDB 1.2.x版本之前的Master Thread5.3 InnoDB 1.2.x版本的Master …...
单片机大小端模式
单片机大小端模式 参考链接 单片机干货-什么是大小端_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Ju4y1M7Tx/?spm_id_from333.337.search-card.all.click&vd_sourcee821a225c7ba4a7b85e5aa6d013ac92e 特此记录 anlog 2024年1月2日...
Codeforces Good Bye 2023 A~E
A.2023(思维) 题意: 有一个序列 A a 1 , a 2 , . . . , a n k A a_1, a_2, ..., a_{n k} Aa1,a2,...,ank,且这个序列满足 ∏ i 1 n k a i 2023 \prod\limits_{i 1}^{n k}a_i 2023 i1∏nkai2023,而这个序列中的 k k k个…...
【蓝桥杯】比赛大纲整理
枚举[1-3] 排序 (1)冒泡排序[2] (2)选择排序[3] (3)插入排序[3] 搜索(bfs, dfs)[1-5] 贪心[1-5] 模拟[1-3] 二分[2-5] DP(普通一维问题)[3-5] 高精度[1-5] 数据结构 (1)栈[2-4]&…...
探索 CodeWave低代码技术的魅力与应用
目录 前言1 低代码平台2 CodeWave简介3 CodeWave 的独特之处3.1 高保真还原交互视觉需求3.2 擅长复杂应用开发3.3 支持应用导出&独立部署3.4 金融级安全要求3.5 可集成性高3.6 可拓展性强 4 平台架构和核心功能4.1 数据模型设计4.2 页面设计4.3 逻辑设计4.4 流程设计4.5 接…...
《2023我的编程之旅》
一、背景 自从踏入编程的世界,我就像乘坐了一辆无法停下的列车,穿行在数据的丛林中,寻找解决问题的答案。编程不仅是我的职业,更是我表达自我、解决问题的工具。在这篇文章中,我将分享一段令人印象深刻的实战经历&…...
C++ 二进制图片的读取和blob插入mysql_stmt_init—新年第一课
关于二进制图片的读取和BLOB插入一共包含五步 第一步:初始化 MYSQL_STMT* stmt mysql_stmt_init(&mysql); 第二步:预处理sql语句 mysql_stmt_prepare(stmt,sql,sqllen); 第三步:绑定字段 mysql_stmt_bind_param(stmt,bind); 第四…...
向爬虫而生---Redis 基石篇2 <拓展Hash>
前言: 延续上一篇向爬虫而生---Redis 基石篇 <拓展str>-CSDN博客 这个章节拓展一下hash的玩法,主要是要挖一挖 ,啥时候用它最合适;让他并不是一无是处.. 正文: 哈希(Hash)数据结构是Redis中的一种常用的数据类型。它是一个键值…...
【论文精读】A Survey on Large Language Model based Autonomous Agents
A Survey on Large Language Model based Autonomous Agents 前言Abstract1 Introduction2 LLM-based Autonomous Agent Construction2.1 Agent Architecture Design2.1.1 Profiling Module2.1.2 Memory ModuleMemory StructuresMemory FormatsMemory Operations 2.1.3 Plannin…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
小智AI+MCP
什么是小智AI和MCP 如果还不清楚的先看往期文章 手搓小智AI聊天机器人 MCP 深度解析:AI 的USB接口 如何使用小智MCP 1.刷支持mcp的小智固件 2.下载官方MCP的示例代码 Github:https://github.com/78/mcp-calculator 安这个步骤执行 其中MCP_ENDPOI…...
java 局域网 rtsp 取流 WebSocket 推送到前端显示 低延迟
众所周知 摄像头取流推流显示前端延迟大 传统方法是服务器取摄像头的rtsp流 然后客户端连服务器 中转多了,延迟一定不小。 假设相机没有专网 公网 1相机自带推流 直接推送到云服务器 然后客户端拉去 2相机只有rtsp ,边缘服务器拉流推送到云服务器 …...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...
中国政务数据安全建设细化及市场需求分析
(基于新《政务数据共享条例》及相关法规) 一、引言 近年来,中国政府高度重视数字政府建设和数据要素市场化配置改革。《政务数据共享条例》(以下简称“《共享条例》”)的发布,与《中华人民共和国数据安全法》(以下简称“《数据安全法》”)、《中华人民共和国个人信息…...
前端打包工具简单介绍
前端打包工具简单介绍 一、Webpack 架构与插件机制 1. Webpack 架构核心组成 Entry(入口) 指定应用的起点文件,比如 src/index.js。 Module(模块) Webpack 把项目当作模块图,模块可以是 JS、CSS、图片等…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术点解析 第一轮:基础概念问题 请解释Spring框架的核心容器是什么?它的作用是什么? 程序员JY回答:Spring框架的核心容器是IoC容器(控制反转…...
