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…...
23款奔驰GLC260L升级原厂540全景影像 高清环绕的视野
嗨 今天给大家介绍一台奔驰GLC260L升级原厂360全景影像 新款GLC升级原厂360全景影像 也只需要安装前面 左右三个摄像头 后面的那个还是正常用的,不过不一样的是 升级完成之后会有多了个功能 那就是新款透明底盘,星骏汇小许Xjh15863 左右两边只需要更换后…...
SQL 在已有表中修改列名的方法
文章目录 1. MySQL2. SQL Server3. Oracle / PostgreSQL Question: 假设有一张表 StudentInfo,表中有一个列名是 Student_Name ,想要把这个列名改成 StudentName 应该如何操作? 建表语句如下: --建表 if object_id(S…...
QT----Visual stdio翻金币案例,附源码
历经一个月,各种事情磕磕绊绊,终于结束了,自己还是太菜了 案例的文档写的教程已经很详细,这边主要是记录一些问题 github代码 gitee代码 1、图片无法加载 一开始加载首页图片和标题出不来,结果是paintEvent重写的字打…...
总结:浏览器解析html与执行JS之生命周期详解
总结:浏览器解析html与执行JS之生命周期详解 一浏览器解析html的生命周期:1.请求HTML文档:2接收响应:3构建DOM树:4加载外部资源:5DOMContentLoaded事件:6样式计算与布局:7绘制与渲染…...
aspose通过开始和结束位置关键词截取word另存为新文件
关键词匹配实体类: Data EqualsAndHashCode(callSuper false) public class TextConfig implements Serializable {private static final long serialVersionUID 1L;/*** 开始关键词,多个逗号分隔*/private String textStart ;/*** 结束关键词&#x…...
深入解析美颜SDK:绿幕抠图功能的算法原理
当下,美颜SDK绿幕抠图功能成为许多应用中不可或缺的一环。本文将深入解析美颜SDK中绿幕抠图功能的算法原理,揭示其背后的技术奥秘。 一、什么是美颜SDK绿幕抠图? 美颜SDK的绿幕抠图功能是一种通过计算机视觉技术,将视频或图像中…...
从有向带权图判断最短路径里各目标顶点顺序
对如下有向带权图,若采用迪杰斯特拉(Dijkstra)算法求从源点a到其他各顶点的最短路径,则得到的第一路径的目标顶点是b,第二条最短路径的目标顶点是c,后续得到的其余各最短路径的目标顶点依次是() A.d,e,f B.e,d,f C.f,d,e D.f,…...
鼠标驱动框架:模拟键盘按键
/* 参考: drivers\hid\usbhid\usbmouse.c */ #include <linux/kernel.h> #include <linux/slab.h> #include <linux/module.h> #include <linux/init.h> #include <linux/usb.h> #include <linux/input.h> #include <linux/hid.h>st…...
ES6之Promise的链式调用
✨ 专栏介绍 在现代Web开发中,JavaScript已经成为了不可或缺的一部分。它不仅可以为网页增加交互性和动态性,还可以在后端开发中使用Node.js构建高效的服务器端应用程序。作为一种灵活且易学的脚本语言,JavaScript具有广泛的应用场景&#x…...
HTML----JavaScript操作对象BOM对象
文章目录 目录 文章目录 本章要求 一.BOM模型概述 二.BOM核心:window对象 常用属性 常用方法: confirm() 案例 open ()close()案例 setTimeout( ) 案例 setInterval( ) 案例 document对象 练习 本章要求 了解BOM模型掌握BOM模型实际应用 一.BOM模型…...
软件或者网站的搜索怎么做/百度网盘资源分享
这里只是突然发现jquery 1.7 之后的事件绑定推荐了一些变化。jquery推荐使用on方法来绑定事件。 相信以前都是用的click,bind,unbind方法吧。 如果你仔细看看jquery的源码的话,那么你会发现bind的方法也是用的on方法来实现的。 在一定程度上on方法比bind或者是click…...
什么网站可以做私房菜外卖/网络优化的工作内容
目录 简略说明 详细说明 Yum apt-get dnf Homebrew 区别 YUM和DNF的区别 Yum和apt-get的区别 Yum和rpm的区别 常用命令 yum/dnf 常用命令 rpm命令 linux命令好玩的命令 简略说明 apt-get 是德班系(Debian、Ubuntu等)的软件管理命令 yum 是红帽系…...
网架公司安全员需要什么证书/班级优化大师学生版
一、软件缺陷的信息 1. 软件缺陷的基本内容 缺陷的标题、预置条件、重现步骤、期望结果、实际结果 2. 软件缺陷的状态 新建 --> 打开 --> 修复 --> 关闭 3. 软件缺陷的严重程度 致命、严重、一般、可优化 4. 软件缺陷的优先级 低优先级、中等优先级、高优先级 5.…...
织梦网站打不开/清理大师
系统视图下配置端口镜像 observe-port 1 interface GigabitEthernet 0/0/24 然后再进入需要镜像的端口 interfaceGigabitEthernet 0/0/23 在配置镜像端口模式 port-mirroringto observe-port 1 both...
宁波拾谷网站建设/西地那非片多少钱一盒
关于Python,如何利用Python技术变现 & 兼职接单也是大家比较感兴趣的; 这里总结了一些用Python赚外快的方式,大家伙可以自己去尝试一下。 Python兼职分为以下三种: 商家提供接口爬取数据(当然不做违法的爬取) 淘宝、拼多多等商业数据进行分析整理(数据分析、爬虫、…...
公司网站制作策划/seo赚钱培训
访问修饰符 修饰符 返回值类型 方法名(参数列表){ 语句块;} 访问修饰符:所有类成员访问修饰符都可以使用,如果省略访问修饰符,默认是private。 修饰符:在定义方法时修饰符包括virtual(虚拟的)、abstract(抽象的)、override(重…...