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

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

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

相关文章

根据具体时间转换为一周前、几小时前格式

export function formatChangeTime(dateTimeStamp){// dateTimeStamp是一个时间毫秒,注意时间戳是秒的形式,在这个毫秒的基础上除以1000let minute 1000 * 60; //把分,时,天,周,半个月,一…

Python课程设计基于python的人脸识别佩戴口罩系统设计

wx供重浩:创享日记 对话框发送:python口罩 获取完整论文报告源码源文件 1 研究背景与意义 新型冠状病毒展现出全球化流行和蔓延的趋势,这提醒我们:传染病防治在今后相当长时间内仍是疾病预测控制工作的重点。戴口罩是预防呼吸道…

Qt应用-实现图像截取功能类似QQ上传头像截取功能

本文演示利用Qt实现图像截取功能类似QQ上传头像截取功能。 效果如下,通过移动中间的裁剪区域可以获得一张裁剪后的图片。 目录

UE4运用C++和框架开发坦克大战教程笔记(十四)(第43~45集)

UE4运用C和框架开发坦克大战教程笔记(十四)(第43~45集) 43. 单个加载 UObject 功能获取资源 URL 链接实现异步加载单个 UObject 类型资源 44. 批量加载 UObject 功能测试加载单个 UObject 资源批量加载多个同类的 UObject 资源 45…

c# OpenCvSharp透视矫正参数调整器

透视矫正不够智能化,每次都要进行局部参数调整,不便于程序使用,程序流程还是那几个步骤; 1、读取图像、灰度化 2、高斯滤波 3、二值化 4、边缘检测 灰度化图 上个图看看经过调整透视矫正边缘检测结果我还是挺满意的 发现一个…

时间戳长度

在线工具 时间戳分秒和毫秒,秒返回的是10位数字,毫秒返回的是13位数字 无论用那种语言,时间戳都是一样的,使用的时候需要注意下长度即可。

MongoDB数据类型详解

BSON 协议与数据类型 MongoDB 为什么会使用 BSON? JSON 是当今非常通用的一种跨语言 Web 数据交互格式,属 ECMAScript 标准规范的一个子集。JSON (JavaScript Object Notation,JS 对象简谱)即 JavaScript 对象表示法…

开源项目 | 完整部署流程、一款开源人人可用的开源数据可视化分析工具

📚 项目介绍 在互联网数据大爆炸的这几年,各类数据处理、数据可视化的需求使得 GitHub 上诞生了一大批高质量的 BI 工具。 借助这些 BI 工具,我们能够大幅提升数据分析效率、生成更高质量的项目报告,让用户通过直观的数据看到结…

微服务实战系列之API加密

前言 随着一阵阵凛冽寒风的呼啸,新的年轮不知不觉滚滚而来。故事随着2023的远去,尘封于案底;希望迎着新年,绽放于枝头。在2024新岁启航,扬帆破浪之时,让烦恼抛洒于九霄,让生机蓬勃于朝朝暮暮。 …

Eureka相关问题及答案(2024)

1、什么是Eureka? Eureka是一个由Netflix开发的服务发现(Service Discovery)工具,它是Spring Cloud生态系统中的一个关键组件。服务发现是微服务架构中的一个重要概念,它允许服务实例在启动时注册自己,以便…

如何充值GPT会员账号?

详情点击链接:如何充值GPT会员账号? 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析,AI画图,图像识别,文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己的…

Copilot在PyCharm中可能遇到的问题及其解决方案

尽管GitHub Copilot为PyCharm用户带来了诸多便利,但在实际使用过程中,部分开发者可能会遇到一些问题。下面是一个典型的场景及相应的解决方法: 问题描述: 在启用GitHub Copilot后,在编写Python代码时发现,虽…

基于多反应堆的高并发服务器【C/C++/Reactor】(中)创建并初始化TcpServer实例 以及 启动

对于一个TcpServer来说,它的灵魂是什么?就是需要提供一个事件循环EventLop(EventLoop),不停地去检测有没有客户端的连接到达,有没有客户端给服务器发送数据,描述的这些动作,反应堆模型能够胜任。当服务器和…

【Docker】容器的相关命令

上一篇:创建,查看,进入容器 https://blog.csdn.net/m0_67930426/article/details/135430093?spm1001.2014.3001.5502 目录 1. 关闭容器 2.启动容器 3.删除容器 4.查看容器的信息 查看容器 1. 关闭容器 从图上来看,容器 aa…

机器学习-基于attention机制来实现对Image Caption图像描述实验

机器学习-基于attention机制来实现对Image Caption图像描述实验 实验目的 基于attention机制来实现对Image Caption图像描述 实验内容 1.了解一下RNN的Encoder-Decoder结构 在最原始的RNN结构中,输入序列和输出序列必须是严格等长的。但在机器翻译等任务中&…

idea中使用Lombok 失效,@Slf4j 找不到符号的解决办法

文章目录 一、前言二、问题排查和解决方案三、 其他解决方案3.1 另一种解决方案3.2 参考文章 一、前言 今天在一个多module工程中,新增了一个 springboot(版本 2.2.4.RELEASE) module,像往常一样,我引入了lombok依赖&…

selenium 用webdriver.Chrome 访问网页闪退解决方案

1.1.1. 解决方案: 1.1.1.1. 移动插件到谷歌的安装目录下 1.1.1.2. 设置环境变量 1.1.1.3. 重启电脑检查成功 解决时间:5min

58.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏菜单文字资源读取的逆向分析

内容来源于:易道云信息技术研究院VIP课 之前的内容:接管游戏的自动药水设定功能-CSDN博客 码云地址(master分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:34b9c1d43b512d0b4a3c395b…

Elasticsearch地理位置数据索引

地理位置数据索引 在 Elasticsearch 中,地理位置数据的索引涉及两种主要的字段类型:geo_point 和 geo_shape。这些字段类型允许 Elasticsearch 存储和查询地理空间数据,如坐标点、线和多边形。 geo_point Elasticsearch的geo_point字段类型…

Springboot支付宝沙箱支付(完整详细步骤)

Springboot支付宝沙箱支付(完整详细步骤) 网页操作步骤1.进入支付宝开发平台—沙箱环境2.点击沙箱进入沙箱环境3.进入沙箱,配置接口加签方式4.配置应用网关5.生成自己的密钥 IntelliJ IDEA 操作步骤1.导入依赖2.在 application.yml 里面进行配…