TCP的滑动窗口机制和流量控制

目录

滑动窗口

流量控制

拥塞控制


滑动窗口

  TCP除了保证可靠性之外,也希望能够尽可能高效的完成数据传输。滑动窗口就是一种提高效率的机制。以下是不引入滑动窗口的数据传输过程:

可以看到,主机A这边每次收到一个ACK才发送下一个数据。这个过程其实是比较低效的。

于是我们就引入了滑动窗口:

这样,就不是一次发送一条数据了,而是一次发送一组,再批量等待一组ACK。就把一条一条发送转化成批量发送了。就把等待时间重叠了,提高了效率。

不等待ack,批量发送多少数据,这个过程就是称为“窗口大小”。

分析:上述过程,收到了2001的ack,此时这个1001-2000的数据就得到了确认,标记成灰色了。接下来,当然要继续等待2001-5000的ack,与此同时,也发送一个新的数据,5001-6000。(此时要等待ack的数据还是四组数据)就像一个固定大小向后滑动的窗口一样。

注意:滑动窗口中,批量发送4组数据之后,不是等到4个都回来才继续发送新的数据,而是收到一个ack,就往后发一个新的。

问题:在滑动窗口中,收到的ack不一定是按照发送顺序返回的,有可能1001-2000和2001-3000的数据先发,但是3001-4000的数据的ack先返回了,这样该怎么办?

3001的意思是3001之前的数据已经收到了,这样滑动窗口就可以向后走两格

那如果3001之前的数据丢包了,怎么办?

有两种情况:(滑动窗口之下,搭配的丢包处理机制,是很高效的,称为快速重传

虽然主机A仍然在继续给B往后发送,接下来的每个数据,B都是再向A索要1001这个数据报。

A这边连续收到若干个1001这样的ack,就明白了,原来是1001-2000这个数据丢了,于是紧接着A就将1001-2000这个数据重传。B收到之后,会从7001开始发送ack。1001-2000的数据就像一块拼图,一但拼图凑齐,B就会从最新的7001开始发送。

因为对于B来说有一个接收缓冲区,数据报都是先存在接收缓冲区里的。当缓冲区存在某个缺口的时候,返回的ack,确认序号都是在索要缺口的数据。

超时重传和快速重传是否是冲突的? 当然不冲突。两者只是不同情况下采取的重传策略。快速重传相当于在滑动窗口下的特殊变种。

注:如果TCP传输的数据比较少,不频繁,此时就不会触发滑动窗口,仍然按照超时重传的方式来解决丢包问题。如果短时间传输大量数据,此时才能触发滑动窗口。此时才触发快速重传,按照ack反馈的次数来解决丢包问题。

重要结论:滑动窗口,说是提升效率的机制,更准确地说,是“亡羊补牢”的机制。TCP为了保证可靠性,牺牲了很多效率。引入滑动窗口,是让效率上的牺牲,变少一些,但是仍然是存在牺牲的。再如何滑动窗口,速度也不可能比UDP这种没有可靠机制的协议更快

流量控制

  滑动窗口的窗口大小是可变的。可以通过窗口大小,来控制发送方的发送速度。窗口越大,单位时间发的数据就越多,效率就越高。窗口越小,单位时间发的数据就越少。

通常情况下,肯定是希望尽可能高效的传输。但是高效的前提一定是可靠性

如果发送速度太快,接收方处理不过来,此时还可能引起丢包。

接收方根据自身的处理能力,反向制约发送方的速度,是双方达成一个“平衡”。这样的机制,就称为“流量控制”。

如何衡量接收方的处理速度?   接收方有一个接收缓冲区(阻塞队列)。

空闲空间大小,作为发送方发送数据的窗口大小。接收方给发送方返回ack,把这个数值告诉发送方,在ack报文中,在tcp报头里,指定一个字段,表示上述的空闲空间大小。

窗口拓展因子,就可以使窗口大小大于64kb。

发送方就可以按照上述窗口大小,决定下一轮数据发送的窗口大小了。

拥塞控制

拥塞控制和流量控制类似,都是和滑动窗口搭配的机制。流量控制是站在接收方的角度,影响发送方的速度。而拥塞控制是站在发送方的角度,影响接收方的速度

流量控制的时候,很容易定量的来衡量,接收缓冲区的剩余空间大小,用这个作为发送窗口大小。但是考虑中间结点,就复杂了。每次走的路径,每个设备的处理能力,繁忙程度,都不一样。

但是无论中间结构多复杂,tcp都会把它们视为一个整体,然后通过“实验”的方式,找到一个合适的窗口大小(发送速度)。具体流程如下

刚开始按照小的速度,小的窗口来发送数据。如果没有出现丢包(说明中间链路非常通畅),就可以增加速度,增加窗口大小。如果还是没丢包,仍然很通畅,就继续增加速度,继续增加窗口大小。.........增加到一定程度,发送速度非常快了,此时可能某个设备到达瓶颈,出现丢包了。此时,发送方立即减少窗口大小,继续发送,看是否还丢包。如果不丢包,再继续尝试加。如果丢包,就继续尝试减。这样就能找到一个合适的窗口大小的值,就可以不丢包,并且还能以比较快的速度完成传输。

由于网络是复杂的,也是多变的。按照上述方式,动态调整,随时适应网络中的变化。

拥塞控制的窗口,影响发送速度。流量控制窗口,也会影响发送速度。这俩窗口哪个小,就听那个的。

拥塞控制窗口大小动态变化是否有规律?

1)刚开始,以比较小的窗口,来传输数据。主要因为刚开始不知道网络是否拥堵,先试试看。

2)按照指数方式扩大窗口(*2)

这里慢启动说的“慢”说的是刚开始窗口大小比较小,传输速度慢。而不是窗口大小的变化速度慢(指数增长非常快的)。

3)指数增长的过程中,达到某个阈值,就要变成线性增长(+n)。

4)线性增长,也是增长,发送速度越来越快。增长到一定程度,就会出现丢包。此时,发送方大概就摸到了网络的大概能力是在啥样的水平。此时就会立即把窗口变小(发送速度减下去)。

5)缩小有两种方式

 1、直接缩到底(回到了最初慢启动的时候),接下来指数增长,线性增长。

 2、缩到出现丢包时,窗口大小一半这样的位置,接下来线性增长。

第一种方式比较低效,现在已经废弃了。第二种方式是当前实际使用的方式。

以上关于滑动窗口,希望对你有所帮助。

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

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

相关文章

NSS【web】刷题

[SWPUCTF 2021 新生赛]jicao 类型&#xff1a;PHP、代码审计、RCE 主要知识点&#xff1a;json_decode()函数 json_decode()&#xff1a;对JSON字符串解码&#xff0c;转换为php变量 用法&#xff1a; <?php $json {"ctf":"web","question"…

【瑞萨RA6M3】2. UART 实验

https://blog.csdn.net/qq_35181236/article/details/132789258 使用 uart9 配置 打印 void hal_entry(void) {/* TODO: add your own code here */fsp_err_t err;uint8_t c;/* 配置串口 */err g_uart9.p_api->open(g_uart9.p_ctrl, g_uart9.p_cfg);while (1){g_uart9.…

使用java.io库序列化Java对象

在我们使用诸如Redis这类缓存系统时&#xff0c;我们往往会存在如下需求&#xff1a;将Java对象保存到Redis缓存中&#xff0c;然后在其他机器上还原回来。 Json方案 我们可以引入Json库等方式&#xff0c;将Java对象序列化为Json字符串来实现这个目的&#xff0c;但是这样的…

iOS——runtime

什么是runtime 我们都知道&#xff0c;将源代码转换为可执行的程序&#xff0c;通常要经过三个步骤&#xff1a;编译、链接、运行。 C 语言 作为一门静态类语言&#xff0c;在编译阶段就已经确定了所有变量的数据类型&#xff0c;同时也确定好了要调用的函数&#xff0c;以及函…

mysql主从热备部署

1、主从复制原理 mysql之间数据复制的基础是二进制日志文件。一台mysql数据库一旦开启用日志文件后&#xff0c;其作为master&#xff0c;它的数据库所有操作都会以事件的方式记录在二进制日志中&#xff0c;其他数据库作为slave通过一个I/O线程与主数据库保持通信&#xff0c;…

OpenAI 发布新款大型语言模型 GPT-4o,带大家了解最新ChatGPT动态。

OpenAI 发布新款大型语言模型 GPT-4o 昨日OpenAI 举办了一场线上活动&#xff0c;正式发布了其最新研发的 AI 模型 GPT-4o&#xff0c;并详细介绍了该模型的强大功能和未来发展规划。此次发布标志着 AI 技术的重大突破&#xff0c;为用户提供了更加便捷、高效的 AI 工具&#…

MySQL创建索引报错 Specified key was too long;max key length is 1000 bytes.

MySQL对创建索引的大小有限制&#xff0c;一般索引键最大长度总和不能超过1000个字节。 问题描述 MySQL创建索引时报错 Specified key was too long;max key length is 1000 bytes. 解决办法 (1) 修改存储引擎 InnoDB的索引字段长度限制大于MyISAM&#xff0c;可以尝试改成…

Pytorch学习-引言

Pytorch相关链接 Pytorch官方网站 https://pytorch.org/ Pytorch的Github仓库 https://github.com/pytorch/pytorch Pytorch论坛 https://discuss.pytorch.org/ Pytorch离线下载包链接 https://download.pytorch.org/whl/torch_stable.html Pytorch学习视频推荐链接 http://【…

记一次跨域问题

线上跨域问题&#xff0c;在自己配置确认没问题下&#xff0c;要及时找运维看看是不是nginx配置问题。 两个方面&#xff1a; 项目代码 nginx配置 SpringBoot 解决跨域问题的 5 种方案&#xff01; SpringBoot解决CORS跨域问题 SpringBoot-实现CORS跨域原理及解决方案

2024 年第一季度全球互联网中断事件

2024 年第一季度伊始&#xff0c;互联网发生了多起中断事件。陆地和海底电缆的损坏在多个地方造成了问题&#xff0c;而与持续中地缘政治冲突相关的军事行动影响了其他地区的连接。 几个非洲国家以及巴基斯坦的政府下令关闭互联网&#xff0c;主要针对移动网络连接。 被称为Ano…

【机器学习】逻辑回归:智能垃圾邮件分类实例

逻辑回归&#xff1a;智能垃圾邮件分类的利器 一、引言二、逻辑回归概述三、垃圾邮件分类实例数据准备特征选择与建模 四、总结与展望 一、引言 随着互联网的迅猛发展&#xff0c;电子邮件已成为人们日常生活和工作中不可或缺的一部分。然而&#xff0c;与此同时&#xff0c;垃…