TCP之滑动窗口和流量控制

news2025/1/15 23:30:22

TCP 利用发送字节数和接收字节数,这个二元组的唯一性保证顺序。讨论下保证顺序的具体算法,以及如何在保证顺序的基础上,同时追求更高的吞吐量。——TCP 的滑动窗口算法。
TCP 作为一个传输层协议,最核心的能力是传输。传输需要保证可靠性,还需要控制流速,这两个核心能力均由滑动窗口提供。而滑动窗口中解决的问题,是你在今后的工作中可以长期使用的,比如设计一个分布式的 RPC 框架、实现一个消息队列或者分布式的文件系统等。

请求/响应模型

TCP 中每个发送的请求都需要响应。如果一个请求没有收到响应,发送方就会认为这次发送出现了故障,会触发重发。大体的模型,和下图很像。但是如果完全和下图一样,每一个请求收到响应之后,再发送下一个请求,吞吐量会很低。因为这样的设计,会产生网络的空闲时间,说白了,就是浪费带宽。带宽没有用满,意味着可以同时发送更多的请求,接收更多的响应。
在这里插入图片描述
一种改进的方式,就是让发送方有请求就发送出去,而不是等待响应。通过这样的处理方式,发送的数据连在了一起,响应的数据也连在了一起,吞吐量就提升了。
在这里插入图片描述
但是如果可以同时发送的数据真的非常多呢?比如成百上千个 TCP 段都需要发送,这个时候带宽可能会不足。像下图这样,很多个数据封包都需要发送,该如何处理呢?
在这里插入图片描述

排队(Queuing)

这种情况下,通常我们会考虑排队(Queuing)机制。
在这里插入图片描述
考虑这样一个模型,如上图所示,在 TCP 层实现一个队列。新元素从队列的一端(左侧)排队,作为一个未发送的数据封包。开始发送的数据封包,从队列的右侧离开。
这样做就需要多个队列,我们要将未发送的数据从队列中取出,加入发送中的队列。然后再将发送中的数据,收到 ACK 的部分取出,放入已接收的队列。而发送中的封包,何时收到 ACK是一件不确定的事情,这样使用队列似乎也有一定的问题。

滑动窗口(Sliding Window)

在上面的模型当中,我们之所以觉得算法不好设计,是因为用错了数据结构。有个说法叫作如果程序写复杂了,那就是写错了 。这里其实应该用一种叫作滑动窗口的数据结构去实现。
在这里插入图片描述
如上图所示:

  • 深绿色代表已经收到 ACK 的段
  • 浅绿色代表发送了,但是没有收到 ACK 的段
  • 白色代表没有发送的段
  • 紫色代表暂时不能发送的段
    下面我们重新设计一下不同类型封包的顺序,将已发送的数据放到最左边,发送中的数据放到中间,未发送的数据放到右边。假设我们最多同时发送 5 个封包,也就是窗口大小 = 5。窗口中的数据被同时发送出去,然后等待 ACK。如果一个封包 ACK 到达,我们就将它标记为已接收(深绿色)。如下图所示,有两个封包的 ACK 到达,因此标记为绿色。
    在这里插入图片描述
    这个时候滑动窗口可以向右滑动,如下图所示:
    在这里插入图片描述

重传

如果发送过程中,部分数据没能收到 ACK 会怎样呢?这就可能发生重传。如果发生下图这样的情况,段 4 迟迟没有收到 ACK。
在这里插入图片描述
这个时候滑动窗口只能右移一个位置,如下图所示:
在这里插入图片描述
在这个过程中,如果后来段 4 重传成功(接收到 ACK),那么窗口就会继续右移。如果段 4发送失败,还是没能收到 ACK,那么接收方也会抛弃段 5、段 6、段 7。这样从段 4 开始之后的数据都需要重发。

快速重传

在 TCP 协议中,如果接收方想丢弃某个段,可以选择不发 ACK。发送端超时后,会重发这个TCP 段。而有时候,接收方希望催促发送方尽快补发某个 TCP 段,这个时候可以使用快速重传能力。例如段 1、段 2、段 4 到了,但是段 3 没有到。 接收方可以发送多次段 3 的 ACK。如果发送方收到多个段 3 的 ACK,就会重发段 3。这个机制称为快速重传。这和超时重发不同,是一种催促的机制。为了不让发送方误以为段 3 已经收到了,在快速重传的情况下,接收方即便收到发来的段 4,依然会发段 3 的 ACK(不发段 4 的 ACK),直到发送方把段 3 重传。
在 TCP 协议中,如果接收方想丢弃某个段,可以选择不发 ACK。发送端超时后,会重发这个TCP 段。而有时候,接收方希望催促发送方尽快补发某个 TCP 段,这个时候可以使用快速重传能力。例如段 1、段 2、段 4 到了,但是段 3 没有到。 接收方可以发送多次段 3 的 ACK。如果发送方收到多个段 3 的 ACK,就会重发段 3。这个机制称为快速重传。这和超时重发不同,是一种催促的机制。
为了不让发送方误以为段 3 已经收到了,在快速重传的情况下,接收方即便收到发来的段 4,依然会发段 3 的 ACK(不发段 4 的 ACK),直到发送方把段 3 重传。
窗口大小的单位是?
在上面所有的图片中,窗口大小是 TCP 段的数量。实际操作中,每个 TCP 段的大小不同,限制数量会让接收方的缓冲区不好操作,因此实际操作中窗口大小单位是字节数。

流速控制

发送、接收窗口的大小可以用来控制 TCP 协议的流速。窗口越大,同时可以发送、接收的数据就越多,支持的吞吐量也就越大。当然,窗口越大,如果数据发生错误,损失也就越大,因为需要重传越多的数据。举个例子:我们用 RTT 表示 Round Trip Time,就是消息一去一回的时间。假设 RTT = 1ms,带宽是 1mb/s。如果窗口大小为 1kb,那么 1ms 可以发送一个 1kb 的数据(含 TCP 头),1s 就可以发送 1mb 的数据,刚好可以将带宽用满。如果 RTT 再慢一些,比如 RTT = 10ms,那么这样的设计就只能用完 1/10 的带宽。 当然你可以提高窗口大小提高吞吐量,但是实际的模型会比这个复杂,因为还存在重传、快速重传、丢包等因素。而实际操作中,也不可以真的把带宽用完,所以最终我们会使用折中的方案,在延迟、丢包率、吞吐量中进行选择,毕竟鱼和熊掌不可兼得。
为了提高传输速率,TCP 协议选择将多个段同时发送,为了让这些段不至于被接收方拒绝服务,在发送前,双方要协商好发送的速率。但是我们不可能完全确定网速,所以协商的方式,就变成确定窗口大小。有了窗口,发送方利用滑动窗口算法发送消息;接收方构造缓冲区接收消息,并给发送方ACK。滑动窗口的实现只需要数组和少量的指针即可,是一个非常高效的算法。像这种算法,简单又实用,比如求一个数组中最大的连续 k 项和,就可以使用滑动窗口算法。滑动窗口是 TCP 协议控制可靠性的核心。发送方将数据拆包,变成多个分组。然后将数据放入一个拥有滑动窗口的数组,依次发出,仍然遵循先入先出(FIFO)的顺序,但是窗口中的分组会一次性发送。窗口中序号最小的分组如果收到 ACK,窗口就会发生滑动;如果最小序号的分组长时间没有收到 ACK,就会触发整个窗口的数据重新发送。另一方面,在多次传输中,网络的平均延迟往往是相对固定的,这样 TCP 协议可以通过双方协商窗口大小控制流速。

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

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

相关文章

前端CSS学习(一)

1、基础认知 CSS概述&#xff1a;CSS:层叠样式表(Cascading style sheets)CSS作用是给页面中的HTML标签设置样式&#xff0c;起到美化修饰网页的作用CSS语法规则&#xff1a;CsS写在style标签中&#xff0c;style标签一般写在head标签里面&#xff0c; title 标签下面<!DOC…

AI类软件项目的应用场景

AI类的APP可以做很多事情&#xff0c;现在在很多业行都有具体的应用&#xff0c;从语音识别、图像识别到智能客服等都是不错的应用方向&#xff0c;在AI项目的时候一定要注意用户隐私&#xff0c;否则可能会带来不少潜在的问题。今天和大家分享一下这方面的内容&#xff0c;希望…

Call for Papers丨第三届GLB@KDD‘23 Workshop

鉴于介绍新数据集和Benchmark研究往往需要不同于常规论文的评审标准&#xff0c;计算机视觉和自然语言处理领域&#xff0c;以及最近的NeurIPS会议&#xff0c;都有专门致力于建立新Benchmark数据集和任务的Conference Track。然而在图机器学习领域&#xff0c;我们还没有类似的…

在 IDEA 中创建 Spring Boot 项目的方式(详细步骤教程)

开发环境 以下是我的开发环境 JDK 1.8Maven 3.6.3IDEA 2019&#xff08;2019 无所畏惧&#xff0c;即使现在已经 2023 年了哈哈哈&#xff09; 使用 Maven 的方式创建 Spring Boot 项目 下面的内容可能会因 IDEA 版本不同&#xff0c;而有些选项不同&#xff0c;但是大同小…

若依定制化改造

若依定制化改造 1 前端1.1 去除开屏加载动画1.2 去除登录时验证码1.3 修改网站标题&#xff08;主要是去除“若依”字样&#xff09; 2 后端2.1 用本地缓存替换Redis&#xff08;未完成&#xff09; 1 前端 1.1 去除开屏加载动画 做法&#xff1a; 效果&#xff1a; 这样子那…

契约锁助力公立医院“电子病历”评级,6大应用场景助力评审过关

2019年以来&#xff0c;公立医院每年绩效考核必须要过“电子病历关”&#xff0c;国家卫健委要求所有三级医院电子病历评级要达到4级以上&#xff0c;二级医院要达到3级以上。《电子病历系统应用水平分级评价管理办法&#xff08;试行&#xff09;及评价标准&#xff08;试行&a…

不可不知的脑网络

前言 人们常说&#xff0c;大脑是人类已知的最复杂的网络。人类大脑由大约1000亿个(1011个)神经元组成&#xff0c;由大约100万亿个(1014个)突触连接&#xff0c;这些神经元在多个空间尺度上进行组织&#xff0c;在多个时间尺度上进行功能交互。这个庞大的系统是我们所有思想、…

Prompt learning 教学[基础篇]:prompt基本原则以及使用场景技巧助力你更好使用chatgpt,得到你想要的答案

Prompt learning 教学[基础篇]&#xff1a;prompt基本原则以及使用场景技巧助力你更好使用chatgpt&#xff0c;得到你想要的答案 如果你想系统学习 如果你对 AI 和 Prompt Engineering 不是很了解&#xff0c;甚至连 ChatGPT 也不是很了解&#xff0c;那我建议你从基础篇开始读…

GPS定位与IP地址定位

在日常生活中&#xff0c;常用的定位技术包括GPS定位、基站定位与IP地址定位​、WIFI定位。 关于GPS定位 GPS(Global Positioning System&#xff0c;全球定位系统)起始于1958年美国军方的一个项目&#xff0c;1964年投入使用。20世纪70年代美国陆海空三军联合研制了新一代卫…

HBase入门 Phoenix使用第三方客户端DataGrip连接 连接包含hbase-site.xml配置(八)

1、因为hbase配置了phoenix HBase入门 Phoenix使用第三方客户端DataGrip连接&#xff08;六&#xff09; <property><name>phoenix.schema.isNamespaceMappingEnabled</name><value>true</value></property><property><name>…

@RequestBody,@RequestParam,@RequestPart应用场景和区别

ReqeustBody 使用此注解接收参数时&#xff0c;适用于请求体格式为 application/json&#xff0c;只能用对象接收 RequestParam 支持application/json&#xff0c;也同样支持multipart/form-data请求 RequestPart RequestPart这个注解用在multipart/form-data表单提交请求的方法…

封装Python脚本:使用钉钉机器人发送消息至钉钉

官方帮助文档&#xff1a;https://open.dingtalk.com/document/robots/custom-robot-access 一、获取自定义机器人webhook 可以通过如下步骤设置钉钉机器人&#xff1a; 首先建立或者进入某个群聊在群聊内部点击“设置>机器人>添加机器人” 添加一个自定义机器人&…

从Facebook到Diem币:社交媒体巨头在加密货币领域的演变

大家都知道Facebook是一个全球知名的社交媒体平台&#xff0c;几乎每个人都在其中与朋友分享照片、发表状态或留言。 然而&#xff0c;随着时间的推移&#xff0c;Facebook不仅仅局限于社交交流&#xff0c;而是逐渐涉足更广阔的领域&#xff0c;其中之一就是加密货币。在本文…

三菱FX5U系列PLC本体自带模拟量输入输出使用方法介绍及示例

三菱FX5U系列PLC本体自带模拟量输入输出使用方法介绍及示例 如下图所示,三菱FX5U本体自带2路模拟量输入和1路模拟量输出,打开CPU左侧的保护盖板即可看到接线端子的位置, 如下图所示,查看手册,可以看到模拟量输入的相关说明: 输入:DC0-10V 软元件:SD6020(通道1)、SD…

杂记(二)2023.5.11

目录 流程图应该如何绘制&#xff1f; coverage 泡鲁达拿铁是什么&#xff1f;泡鲁达英文是什么&#xff1f;什么来历&#xff1f; 为什么我的泡鲁达咖啡会送我一些面包条呢&#xff1f; 介绍一下欧内斯特 梅的《历史的教训》 介绍一下陆奥宗光 介绍一下陆奥宗光的《蹇蹇录…

多处最优服务次序问题——算法设计与分析(C实现)

问题描述&#xff1a;设有n个顾客同时等待一项服务。顾客i需要的服务时间为&#xff0c;共有s处可以提供此项服务。应该如何安排n个顾客的服务次序&#xff0c;才能使平均等待时间达到最小&#xff1f;平均等待时间是n个顾客的等待服务时间的总和除以n。 算法设计&#xff1a;对…

数据库软件基础搭建的思考(WAMPserver)

本文的目的是介绍关于构建个人小型医学数据库的软件基础方面的一些实践和思考&#xff0c;做到局域网访问&#xff0c;乃至外网访问。 wampserver简要介绍 WampServer是一款由法国人开发的Apache Web服务器、PHP解释器以及MySQL数据库的整合软件包。它可以在Windows操作系统…

设备联网调试三板斧

在实际的工业互联网项目中&#xff0c;设备联网所占的比重越来越大。有的一期项目为了简单快速上线&#xff0c;让客户直观体会到工业互联网的效果&#xff0c;直接会把设备联网放在一期项目的重点。那么在做此类项目时&#xff0c;设备联网调试就显得尤为重要。专业的厂家和工…

DosBox在winserver2016云桌面最大化界面无法铺满全屏的问题剖析

现象引出和问题猜想 有一款用户软件叫DosBox&#xff0c;在实体机win11的时候最大化的时候&#xff0c;程序界面可以铺满全屏&#xff0c;但是在winserver2016云桌面进行最大化的时候&#xff0c;最大化的时候&#xff0c;界面无法铺满全屏&#xff1a; &#xff08;实体机最大…

递归到动态规划:省去枚举行为

如果在动态规划的过程中没有枚举行为&#xff0c;那严格位置依赖和傻缓存的方式并没有太大区别&#xff0c;但是当有枚举行为的时候&#xff08;一个位置依赖于多个位置&#xff09;&#xff0c;那严格位置依赖是有优化空间的&#xff0c;枚举行为也许可以省去&#xff0c;题目…