当前位置: 首页 > news >正文

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,流水线作业模式下需要做一些新的调整:

  1. 增加序号范围: 由于多个分组同时在传输,需要有唯一的序号来区分,包括确认报文。

  2. 增加缓存空间: 发送方需要存储已发送但未确认的数据,接收方需要存储已接收但未被上层应用读取的数据。

  3. 异常处理: 在流水线作业中,乱序和丢包的异常处理需要考虑。有两种处理策略:回退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&#xff09…...

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按钮点击频率控制

现有一个按钮&#xff0c;如下图 点击时 再次点击 刷新窗口再次点击 刷新窗口依然可以实现点击频率控制。 代码实现&#xff1a; <template><!--<el-config-provider :locale"locale"><router-view/></el-config-provider>--><el…...

(一)Matlab数值计算基础

目录 1.2Matlab中的数据类型 1.2Matlab中的数据类型 逻辑型 逻辑型变量值为1或0字符型 MATLAB的字符型输入使用单引号括起来&#xff0c;字符串存储为字符数组&#xff0c;每个元素占一个ASCII字符数值型 数值型分为整型&#xff08;int&#xff09;、单精度浮点型&#xff0…...

《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(思维) 题意&#xff1a; 有一个序列 A a 1 , a 2 , . . . , a n k A a_1, a_2, ..., a_{n k} Aa1​,a2​,...,ank​&#xff0c;且这个序列满足 ∏ i 1 n k a i 2023 \prod\limits_{i 1}^{n k}a_i 2023 i1∏nk​ai​2023&#xff0c;而这个序列中的 k k k个…...

【蓝桥杯】比赛大纲整理

枚举[1-3] 排序 &#xff08;1&#xff09;冒泡排序[2] &#xff08;2&#xff09;选择排序[3] &#xff08;3&#xff09;插入排序[3] 搜索(bfs, dfs)[1-5] 贪心[1-5] 模拟[1-3] 二分[2-5] DP(普通一维问题)[3-5] 高精度[1-5] 数据结构 &#xff08;1&#xff09;栈[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我的编程之旅》

一、背景 自从踏入编程的世界&#xff0c;我就像乘坐了一辆无法停下的列车&#xff0c;穿行在数据的丛林中&#xff0c;寻找解决问题的答案。编程不仅是我的职业&#xff0c;更是我表达自我、解决问题的工具。在这篇文章中&#xff0c;我将分享一段令人印象深刻的实战经历&…...

C++ 二进制图片的读取和blob插入mysql_stmt_init—新年第一课

关于二进制图片的读取和BLOB插入一共包含五步 第一步&#xff1a;初始化 MYSQL_STMT* stmt mysql_stmt_init(&mysql); 第二步&#xff1a;预处理sql语句 mysql_stmt_prepare(stmt,sql,sqllen); 第三步&#xff1a;绑定字段 mysql_stmt_bind_param(stmt,bind); 第四…...

向爬虫而生---Redis 基石篇2 <拓展Hash>

前言: 延续上一篇向爬虫而生---Redis 基石篇 &#xff1c;拓展str&#xff1e;-CSDN博客 这个章节拓展一下hash的玩法,主要是要挖一挖 ,啥时候用它最合适;让他并不是一无是处.. 正文: 哈希&#xff08;Hash&#xff09;数据结构是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…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

安卓基础(Java 和 Gradle 版本)

1. 设置项目的 JDK 版本 方法1&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

使用SSE解决获取状态不一致问题

使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件&#xff0c;这个上传文件是整体功能的一部分&#xff0c;文件在上传的过程中…...