TCP_可靠数据传输原理

news2025/1/12 20:54:18

引言

在网络通信中,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在网络中表现得如此出色?让我们一同揭开拥塞控制的面纱,深入理解其背后的原理与挑战。

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

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

相关文章

[概率论]四小时不挂猴博士

贝叶斯公式是什么 贝叶斯公式是概率论中的一个重要定理,用于计算在已知一些先验信息的情况下,更新对事件发生概率的估计。贝叶斯公式的表达式如下: P(A|B) P(B|A) * P(A) / P(B) 其中,P(A|B)表示在事件B发生的条件下事件A发生的概…

Android App从备案到上架全过程

不知道大家注意没有,最近几年来,新的移动App想要上架是会非常困难的,并且对于个人开发者和小企业几乎是难如登天,各种备案和审核。但是到底有多难,或许只有上架过的才会有所体会。 首先是目前各大应用市场陆续推出新的声明,各种备案截止日期到12月就要到最后期限责令整改…

wps将姓名处理格式为:姓**

1.打开wps,在要处理数据右侧一个单元格 输入公式:LEFT(A1,1)&"**",然后回车 2.按住ctrl和处理好的数据的右下角小方框,往下拖动即可生成格式为:姓** 格式的数据 3.复制生成的数据,右键选择 “…

三、HTML元素

一、HTML元素 HTML 文档由 HTML 元素定义。 *开始标签常被称为起始标签(opening tag),结束标签常称为闭合标签(closing tag)。 二、HTML 元素语法 HTML 元素以开始标签起始。HTML 元素以结束标签终止。元素的内容是…

Zero-shot:半监督:pansharpening

Zero-shot semi-supervised learning for pansharpening (用于全色锐化的零次半监督学习) 全色锐化是指融合低分辨率多光谱图像(LRMS)和高分辨率全色(PAN)图像以生成高分辨率多光谱图像(HRMS&…

履机乘变,轻舟便楫:源启分布式PaaS深度赋能企业级技术平台建设

导语 源启分布式PaaS平台围绕应用视角为用户提供应用运行的全生命周期管控能力,提供注册中心、服务路由、网关、服务治理等中间件技术支持,实现应用之间的联通,解决客户多厂商产品不兼容、产品组合不可选择、孤岛效应等问题,满足…

CSS animation动画和关键帧实现轮播图效果HTML

CSS animation动画和关键帧实现轮播图效果HTML 这轮播图效果使用h5和css3实现效果&#xff0c;不需要js控制&#xff0c;但是其中的缺点就是不能使用鼠标进行切换效果。 具有代码如下 <!DOCTYPE html> <html lang"en"><head><meta charset&quo…

MACOS Atrust服务异常

MAC版Atrust服务异常 点击进入办公后出现提示其一&#xff1a; 核心服务未启动&#xff0c;部分功能存在异常&#xff0c;确定重新启动吗&#xff1f; 可能的原因&#xff1a; 1.上次已完全退出客户端 2.核心服务被其他程序优化禁用 点击重新启动后&#xff0c;出现提示&#x…

M3u8视频地址如何转为mp4视频

在当今数字化的时代&#xff0c;视频格式的转换已成为日常需求。M3u8格式的视频由于其分段的特性&#xff0c;常常给播放和编辑带来不便。而MP4格式则因其通用性和高质量而广受欢迎。那么&#xff0c;如何将M3u8视频地址转换为MP4格式呢&#xff1f;接下来&#xff0c;我们将为…

iOS 小组件开发

iOS14之后Apple引入了新的WidgetKit&#xff0c;舍弃了原有额TodayExtension。 开发准备&#xff1a; 新的WidgetExtension只能通过SwiftUI进行开发&#xff1b; Widget有三种尺寸&#xff1a;systemSmall、 systemMedium、systemLarge&#xff0c;三种尺寸对应固定的UI类型布…

从0创建springboot项目并创建GitHub仓库

创建springboot项目 我是使用idea来创建一个新的项目&#xff0c;jdk17&#xff0c;maven。 先选一个spring web就够了&#xff0c;后续需要啥功能再慢慢添加 写个简单controller测试一下能不能成功启动项目 启动项目&#xff0c;本地访问http://localhost:8080/test/test …

polar CTF web 被黑掉的站

一、题目 二、解答 1、dirsearch 扫目录 看到shell.php和index.php.bak 一看就是爆破&#xff0c;字典都给了&#xff0c;最后得到为 nikel

C++数据结构-广义表

广义表的定义 如果允许表中的数据元素具有自身结构&#xff0c;即数据元素也可以是一个线性表&#xff0c;这就是广义表&#xff0c;有时也称之为列表&#xff08;Lists&#xff09;。 广义表是n(n≥0)个元素a1, a2, …, an的有限序列&#xff0c;即LS(a1, a2, …, an)。 其…

Objects are not valid as a React child (found: object with keys {name}).

在jsx中可以嵌套表达式&#xff0c;将表达式作为内容的一部分&#xff0c;但是要注意&#xff0c;普通对象不能作为子元素&#xff1b;但是数组&#xff0c;react元素对象是可以的 如下&#xff1a;不能将stu这个对象作为子元素放 function App() {const myCal imgStyleconst…

深度生成模型之GAN的评估 ->(个人学习记录笔记)

文章目录 深度生成模型之GAN的评估图像翻译的应用1. 风格迁移2. 数据增强3. 经典图像任务4. 内容创作5. 人脸图像编辑6. 人体图像编辑 图像翻译模型1. 有监督图像翻译模型2. 无监督图像翻译模型3. 多域图像翻译模型 深度生成模型之GAN的评估 图像翻译的应用 1. 风格迁移 各类…

本地计算机 上的 My5OL808 服务启动后停止,某些服务在未由其他服务或程序使用时将自动停止

客户反馈说mysql启动不了&#xff0c;报错信息&#xff1a; 本地计算机 上的 My5OL808 服务启动后停止&#xff0c;某些服务在未由其他服务或程序使用时将自动停止。 查了不少资料&#xff0c;最后分析问题是这样的&#xff0c;手动或者重复安装mysql时&#xff0c;创建了多个…

计算机网络 VLAN

路由器将多个局域网连接起来&#xff0c;而交换机将一个局域网里的设备连接起来。 路由器的端口分配局域网的网段&#xff08;子网网段&#xff09;&#xff0c;局域网的内部设备的ip都在这个网段里&#xff0c;再由交换机将数据派发到目的设备&#xff0c;交换机是按照MAC地址…

欢迎提交pr共同改进项目, pr的含义?

"提交PR"在软件开发和编程领域是一个常用术语&#xff0c;特别是在使用版本控制系统如Git时。这里的“PR”指的是“Pull Request”&#xff0c;它是一种通知项目维护人员您已经完成了一些代码改动并希望将这些改动合并到主项目中的方式。简单来说&#xff0c;当您对一…

lenovo联想小新Pro-13 2020 Intel IML版笔记本电脑(82DN)原装出厂Win10系统镜像

链接&#xff1a;https://pan.baidu.com/s/1bJpfXudYEC7MJ7qfjDYPdg?pwdjipj 提取码&#xff1a;jipj 原装出厂Windows10系统自带所有驱动、出厂主题壁纸、系统属性专属LOGO标志、Office办公软件、联想电脑管家等预装程序 所需要工具&#xff1a;16G或以上的U盘 文件格式&a…

electron预加载脚本

webPreferences 指定预加载脚本,可以使用部分node脚本 webPreferences: {preload: path.join(__dirname, "preload.js"),},创建preload.js 中 测试文件读取功能 const fs require(fs) const text fs.readFileSync(package.json, utf-8)console.log(text)报错,为了…