tcp分包传图片 如何还原_技术控丨超详细解析TCP重传机制

1eb1406f4ba220f1b732f004820040f0.gif

作者:Zhang_Jiawen ; 来自:Dell技术社区

TCP 的主要任务是很简单:打包和发送数据。TCP 与其他协议的不同之处在于使用滑动窗口来管理基本数据收发过程,同时确保数据流的有效及可靠传输,从而不致发送速率明显快于接收速率。

本文将描述 TCP是如何确保设备可靠、有效地进行传输的。首先阐述 TCP检测丢失片段以及重传的基本方法,之后介绍 TCP如何判断一个片段为丢失片段。

一、TCP 片段重传计时器以及重传队列:

检测丢失片段并对之重传的方法概念上是很简单的。每一次发送一个片段,就开启一个重传计时器。计时器有一个初始值并随时间递减。

如果在片段接收到确认之前计时器超时,就重传片段。TCP 使用了这一基本技术,但实现方式稍有不同。原因在于为了提高效率需要一次处理多个未被确认的片段,以保证每一个在恰当的时间重传。

84e220fcb7ccc62984efd71586ccd1d0.png

二、TCP 按照以下特定顺序工作:

放置于重传队列中,计时器开始 包含数据的片段一经发送,片段的一份复制就放在名为重传队列的数据结构中,此时启动重传计时器。

因此,在某些时间点,每一个片段都会放在队列里。队列按照重传计时器的剩余时间来排列,因此 TCP 软件可追踪那几个计时器在最短时间内超时。

确认处理 如果在计时器超时之前收到了确认信息,则该片段从重传队列中移除。

重传超时 如果在计时器超时之前没有收到确认信息,则发生重传超时,片段自动重传。当然,相比于原片段,对于重传片段并没有更多的保障机制。

因此,重传之后该片段还是保留在重传队列里。重传计时器被重启,重新开始倒计时。如果重传之后没有收到确认,则片段会再次重传并重复这一过程。

58f4f91b4a984165d2eac74d55c61de1.png

在某些情况下重传也会失败。我们不想要 TCP永远重传下去,因此 TCP只会重传一定数量的次数,并判断出现故障终止连接。

但是我们怎样知道一个片段被完全确认呢?重传是基于片段的,而 TCP确认信息是基于序列号累积的。每次当设备A发送片段给设备B,设备 B查看该片段的确认号字段。

所有低于该字段的序列号都已经被设备 A接收了。因此,当片段中所发送的所有字节的序列号都比设备A到设备B的最后一个确认号小的时候,一个从设备 B发到设备 A的片段被认为是确认了。这是通过计算片段中最后一个序列号结合片段的数据字段来实现的。

让我们以下图为例来说明一下确认和重传是怎样工作的。假设连接中的服务器发出了四个连续片段(号码从1开始)

  • 片段1 序列号字段是1片段长度80。所以片段1中最后一个序列号是80。
  • 片段2 序列号是81片段长度是120。片段2中最后一个序列号是200。
  • 片段3 序列号是201片段长度是160。片段3中最后一个序列号是360。
  • 片段4 序列号是361片段长度是140。片段3中最后一个序列号是500。

这些片段是一个接一个发送的,而无需等待前一个发送得到确认。这是 TCP滑动窗口的一个主要优势(细说 TCP滑动窗口)。

假设客户端接收到前两个传输,它会发回一条确认消息确认号为201。从而告知服务器前两个片段已经被客户端成功接收了,它们从重传队列中移除(并且服务器发送窗口右移200字节)。

在接收到确认号361或更高的片段之前,片段3会保留在重传队列中;片段4需要确认号501或更高。

现在,让我们进一步假设传输过程中片段3丢失了,但片段4被接收到了。客户端将片段4保存在接收buffer中,但是不需要确认,因为TCP是累积确认机制——确认片段4表示片段3也接收到了,但实际上并没有。

因此,客户端需要等待片段3。实际上,服务器端片段3的重传计时器会超时,服务器之后重传片段3。之后客户端收到,然后发送片段3和4的确认信息给服务器。

9d687e27f0031557432d17ec08f2d34c.png

还有一个重要的问题,服务器将如何处理片段4呢?

虽然客户端在等待片段3,服务器没有收到反馈,所以它并不知道片段3丢失了,同样它也不知道片段4发生了什么(以及接下来传输的数据)。

很有可能客户端已经接收到了片段4但是不能确认,也有可能片段4也丢失了。一些实现中会选择仅仅重传片段3,也有些会把3和4都重传。

最后一个问题是重传队列中所使用片段重传计时器的值。如果设置过低,会发生过量重传,如果设置过高,重传丢失片段会减弱性能。必须通过一个称为自适应重传的过程来动态调整这个值,接下来的章节会讲到。

5160ab4473b83c1d9a8893f05fc34ae6.png

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

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

相关文章

超详细!上线一个机器学习项目你需要哪些准备?

摘要: Canvas是用于设计和记录机器学习系统的模板。它比简单的文本文档具有优势,因为Canvas用简单的部件通过部件之间的相关性来寻找机器学习系统的关键组件。这个工具已经很流行,因为它对复杂项目进行了可视化操作。 在本文中,我…

漫画:什么是插入排序?

戳蓝字“CSDN云计算”关注我们哦!————— 第二天 —————————————————人们如何进行扑克牌的排序呢?举个例子,比如我手中有红桃6,7,9,10这四张牌,已经处于升序排列:这时候,我又抓到了一…

(vue基础试炼_03)使用vue.js实现TodoList

接上一篇:(vue基础试炼_02)使用vue.js实现隔2秒显示不同内容https://gblfy.blog.csdn.net/article/details/103841818 指令作用v-for循环数据v-on绑定事件v-model数据的双向绑定文章目录一、需求说明① 案例文档② 基础代码③ 基础效果图二、…

Python API快餐教程(1) - 字符串查找API

摘要: 字符串查找API 字符串处理相关API 字符串是7种序列类型中的一种。除了序列的操作函数,比如len()来求字符串长度之外,Python还为字符串提供丰富到可以写个编辑器的API. 查找类API 首先,下面的查找API都是为了查找位置&#x…

因吵架总被骂,阿里程序猿一气之下发明“情侣吵架神器”

摘要: 最近,阿里有个叫虎跑的程序猿,发明了一个“吵架神器”。 到底是个什么黑科技? 最近,阿里有个叫虎跑的程序猿,发明了一个“吵架神器”。到底是个什么黑科技?和很多情侣一样,虎跑…

java中volatile关键字的含义_java中volatile关键字的含义

转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。Java语言是支持多线…

(vue基础试炼_04)使用组件改造TodoList

接上一篇:(vue基础试炼_03)使用vue.js实现TodoListhttps://gblfy.blog.csdn.net/article/details/103842233 指令说明v-bind传入绑定值文章目录一、前端页面组件化二、全局组件学习三、局部组件学习一、前端页面组件化 页面组件化&#xff1a…

我们到底该如何看待6G?

戳蓝字“CSDN云计算”关注我们哦!近日,加拿大媒体报道,华为已确认在加拿大渥太华开启6G网络研究,已与加拿大多所大学的研究者展开洽谈。华为表示,自家的渥太华研发实验室将引领华为全球6G发展。图片来源网络消息传出之…

两年AI研究经验(教训)总结,进来看看吧!

摘要: 本文以过来人的身份将自身2年的研究经验做了一下分享,希望本文对于即将开始从事人工智能研究的朋友有所帮助。人工智能研究这个领域是有一定门槛的。对于初学者来说,一般通常的做法是直接购买一些热门的书籍,比如“西瓜书”…

C语言:字符串字面量及其保存位置

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 虽然C语言中不存在字符串类型,但依然可以通过数组或指针的方式保存字符串,但字符串字面量却没有想象的这么简单,本文就将对此进行讨论…

system.argumentnullexception值不能为null_MySQL NULL 值如何处理?

我们已经知道 MySQL 使用 SQL SELECT 命令及 WHERE 子句来读取数据表中的数据,但是当提供的查询条件字段为 NULL 时,该命令可能就无法正常工作。为了处理这种情况,MySQL提供了三大运算符:IS NULL: 当列的值是 NULL,此运算符返回 true。IS NOT NULL: 当列…

神经网络的优缺点

摘要: 深度学习目前受到了追捧。人们想将神经网络应用到各个地方,但是它们真的适合每个地方吗?在本篇文章中,将对于这个问题以及深度学习现在如此受追捧的原因进行讨论。通过这篇文章,您将了解神经网络的主要缺点&…

(vue基础试炼_05)简单组件之间的传值

接上一篇:(vue基础试炼_04)使用组件改造TodoListhttps://gblfy.blog.csdn.net/article/details/103844256 文章目录一、上篇回顾① 代码欣赏② 代码分析二、子组件如何向父组件传值呢?① 需求案例文档② 需求案例效果图③ 思考与思…

漫画:程序员战力图鉴

戳蓝字“CSDN云计算”关注我们哦!看漫画了解程序员战斗力 are u ready?编程架构能力撕比嘴炮能力划水摸鱼能力花式甩锅能力画饼忽悠能力PPT吹比能力哈哈哈哈哈哈程序员哥哥上面说的是你吗 福利扫描添加小编微信,备注“姓名公司职位”&#xf…

Python数据挖掘与机器学习,快速掌握聚类算法和关联分析

摘要:前文数据挖掘与机器学习技术入门实战与大家分享了分类算法,在本文中将为大家介绍聚类算法和关联分析问题。分类算法与聚类到底有何区别?聚类方法应在怎样的场景下使用?如何使用关联分析算法解决个性化推荐问题?本…

评分9.7!这本Python书彻底玩大了?程序员:真香!

「超级星推官/每周分享」是一个围绕程序员生活、学习相关的推荐栏目。CSDN出品,每周发布,暂定5期。关键词:靠谱!优质!本期内容,我们将抽1人送出由我司程序员奉为“超级神作”的《疯狂Python讲义》1本&#…

vs 如何将源文件转换成可执行文件_如何将手机便签转换成word文本文档

如何将手机便签转换成word文本文档?实际上,很多手机自带的便签,虽然可以将单条便签内容,以文字或者图片的形式分享到xxx云文档,但却很少有支持直接转换成Word文档的。一般情况下,他们需要将手机便签里的内容…

端上智能——深度学习模型压缩与加速

摘要:随着深度学习网络规模的增大,计算复杂度随之增高,严重限制了其在手机等智能设备上的应用。如何使用深度学习来对模型进行压缩和加速,并且保持几乎一样的精度?本文将为大家详细介绍两种模型压缩算法,并…

jvm调优 java_opt_Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺《八》

原标题:Java-100天知识进阶-JVM调优工具-JDK自带工具-知识铺《八》JVM 监控分析工具一、JDK 自带工具1. jconsoleJDK/bin 目录下, jconsole.exe 双击打开, 自动搜索本机运行的虚拟机进程。选择其中一个进程即可,开始进行JVM监控1.…

这帮吃货程序猿,给阿里食堂来了一波骚操作

我叫宋爽,在别人眼里,我是一个程序猿。 别的程序猿,喜欢摁键盘,我嘛,就喜欢吃。 有一次,去医院体检,拿到CT片的我,看着自己的脊椎骨,脑子中一直在想:啊&#…