【TCP协议】流量控制 滑动窗口 拥塞控制

目录

说明:

流量控制

为什么要流量控制

什么是流量控制

如何控制流量:16位窗口大小

如果主机 B 一直没空间呢?标志位 PSH

滑动窗口:全面认识序号和确认序号

为什么需要滑动窗口?

理解滑动窗口

序号和确认序号

窗口如何向右滑动

最左侧的报文丢包了:

快重传

最左侧报文没丢,但中间或者最右侧的报文丢包了:

应答丢包了:

按序处理

拥塞控制

为什么要拥塞控制?

什么是拥塞控制

为什么一开始指数增长?

为什么后来变成线性增长?

滑动窗口的大小


说明:

在本文中,主机 A 表示通信的发送方,主机 B 表示通信的接收方。

流量控制

为什么要流量控制

TCP 支持全双工,是因为发送方和接收方都有发送缓冲区和接收缓冲区。双方在通信时,

1、如果发送方发送消息太快了,就会导致接收方的接收缓冲区满了,接收方来不及接收新来的报文,导致新来的报文被丢弃,发送方没有收到对应的报文的应答,就会超时重传,一直超时重传,就会浪费网络资源;

2、如果发送方发送消息太慢了,就会影响通信的效率。

不难看出,需要进行流量控制,帮助维持网络的稳定性和效率。

什么是流量控制

流量控制是一种用于管理数据在网络中传输速率的机制,旨在防止数据发送方以超过接收方处理能力的速度发送数据,从而避免造成数据丢失、网络拥塞以及其他潜在问题。它确保了通信双方能够高效且可靠地交换数据。

如何控制流量:16位窗口大小

进行流量控制,就需要让发送方(主机A)知道接收方(主机B)的接受能力,而接受能力就是接收方(主机B)的接收缓冲区的剩余空间的大小,所以主机B就在报文中的16位窗口中填上自己接收缓冲区的大小,通过 ACK 报文告诉主机 A。

窗口大小字段越大, 说明网络的吞吐量越高;主机 B 一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给主机 A ;主机 A 接受到这个窗口之后, 就会减慢自己的发送速度;

如果主机 B 缓冲区满了, 就会将窗口置为 0;这时主机 A 不再发送数据,但是需要定期发送一个窗口探测数据段, 使主机 B 把窗口大小告诉主机 A ,主机 B 也会向主机 A 主动发送窗口更新通知,这两种策略会同时生效,保证尽快恢复通信。

如果主机 B 一直没空间呢?标志位 PSH

ssize_t read(int fd, void *buf, size_t count);

在 read 函数中,可以通过 count 参数指定想要读取的字节数,但 read 实际返回的字节数可能会少于请求的数量。例如,到达文件末尾时,或者当读取过程中出现错误时,read 将返回一个不大于 count 的值,包括可能返回 0(表示文件结束)或 -1(表示发生错误)。

可以看出主机 B 上层在读取接收缓冲区的字节时,会尽量按照我们设置的字节数来读取。如果主机 B 的接收缓冲区一直没有空间,说明上层一直没有读数据的速度太慢了,能读数据时却没有尽快读走数据,主机 A 可以发送标志位 psh 置为 1 的报文,催主机 B 的上层尽快读取数据,尽快腾出空间,不要等到列车满员了再发车,现在就可以发车了。

当发送方设置PSH标志时,意味着它希望接收方尽快将已接收到的数据递交给上层应用,而不是等待更多数据的到来以形成更大的报文段。
 

滑动窗口:全面认识序号和确认序号

为什么需要滑动窗口?

 如果发送方一次发送一条报文,接收方发送 ACK 报文,发送方收到 ACK 报文后再继续发送报文,这样一发一收的效率很低。所以发送方一次性发送多条数据,就可以提高效率。

一次性发送多条报文,就需要对发送缓冲区的字节进行管理,哪些字节组成的报文是已经发送且已经收到应答的,哪些字节组成的报文是已经发送但未收到应答,哪些字节组成的报文是还没有发送的。

如果把发送缓冲区看成一个数组,那么每个字节都有自己的序号,对不同类型的报文的管理,就可以看成对发送缓冲区的字节的管理。

理解滑动窗口

有了上面的认识之后,就需要有一个窗口对发送缓冲区的字节进行分类,窗口内的字节组成的报文就是已经发送但未收到应答的,窗口左侧的字节组成的报文就是已经发送且已经收到应答的,窗口右侧的字节组成的报文就是未发送的。

 有了窗口后,我们规定窗口只能向右滑动,不能向左滑动,如果向左滑动,那么已经发送且已经收到应答的报文就变成已经发送但未收到应答的报文,打乱了规则。那么窗口如何向右滑动呢?

序号和确认序号

在了解窗口如何向右滑动时,我们需要重新理解一下 TCP 报文中序号和确认序号的意义。

序号:表示该报文段中的第一个数据字节的编号。

确认序号:如果接收方接收到了报文,那么 ACK 报文中的确认序号就是 已经接收到的字节的编号+1。即,接收方已经收到了确认序号之前的字节!

    窗口如何向右滑动

    了解了序号和确认序号后,我们就可以知道,如果窗口内最左侧的报文收到了应答,那么窗口才可以向右滑动,但了解到这里还不能完全理解窗口的滑动。

    窗口内的字节可以分成多个报文,如果最左侧的报文丢包,窗口该怎么滑动?中间的报文丢包呢?最右侧的呢?

    最左侧的报文丢包了:

    如果最左侧报文丢包了,接收方只收到了中间和最右侧的报文,那么应答报文的确认序号是最左侧报文的序号。

    比如发送方发送了四个报文,第一个(即最左侧)报文的字节范围为 1001 ~ 2000(序号为1001),第二个报文的字节范围为 2001 ~ 3000(序号为2001),第三个报文的字节范围为 3001 ~ 4000(序号为3001),第四个报文的字节范围为 4001 ~ 5000(序号为 4001),第一个报文丢包了,但收到了第二、三、四个报文的应答,那么这些应答报文的确认序号一定是 最左侧报文的序号,即 1001。

    接收方发现第一个报文丢包了,那么第二、三、四个报文的应答报文的确认序号只能是 1001,不能是 2001,确认序号为 2001 表示接收方收到了序号为 1 ~ 2000 的字节,但是接收方并没有收到序号为 1001 ~ 2000 的字节。如果此时的应答报文的确认序号为 2001,那么窗口右移了,接收方再也收不到序号为 1001 ~ 2000 的字节,TCP 的可靠性就无法保证了。

    发送方在收到确认序号为 1001 的应答报文之后,就知道接收方没有收到序号为 1000 的报文,即最左侧报文,发送方就会对该报文进行重传,TCP 的可靠性得到了保证。当收到最左侧报文的应答后,窗口才会右移。

    在这个例子中,发送方收到了三个应答报文的确认序号都是 1001,就立即重传该报文,而不是等到超时重传的时间到了,才重传该报文,这种重传方式称为快重传。

    快重传

    当发送方连续收到三个或更多针对同一个数据包的确认(即三次ACK 的确认序号都是一样的),它会立即重传被丢失的数据包。而不是等到超时重传的时间过了,再对丢失的报文进行重传,这样做可以显著减少因为等待定时器而造成的延迟。

    最左侧报文没丢,但中间或者最右侧的报文丢包了:

    有了最左侧报文丢包了的分析后,最左侧报文没丢,但中间或者最右侧报文的丢包情况就容易多了。

    中间的报文丢包了,但是最左侧报文没丢,那么窗口就会右移,随着窗口的右移,中间的报文就会变成最左侧的报文,按照最左侧的报文的丢包来处理。

    最右侧的报文丢包了,但是最左侧和中间的报文没丢包,窗口也会右移,使最右侧报文变成最左侧报文,按照最左侧报文的丢包来处理即可。

    所以这三种情况的丢包,最后都会变成解决最左侧丢包,即使是混合情况的丢包,比如最左侧和中间丢包了,或者最左侧和最右侧丢包了,最后也是变成解决最左侧丢包。

    应答丢包了:

    如果接收方收到了最左侧报文,但是最左侧报文的应答丢了,收到了中间或者最右侧报文的应答,那么不需要重传最左侧报文的应答。

    还是以这个图来举例子,第一个报文的应答报文的确认序号为 2001,接收方收到了第一、二、三、四个报文,发送方只收到了第二、三、四个报文的应答,这些收到的应答报文的确认序号是 5001,那就表示接收方收到了序号为 1 ~ 5000 的字节,那第一个报文的确认序号收没收到也无所谓了,因为后续应答的确认序号已经包括了前面应答的确认序号。

    中间报文的 ACK 报文丢了也没关系,可以通过后续的 ACK 报文来确认。

    所以允许部分 ACK 报文的丢包,因为可以通过后续的 ACK 报文来确认。

    按序处理

    接收方在收到报文时,会把报文按照序号从小到大排序,排序后再把报文拷贝到接收缓冲区中,接收方再按序处理。

    如果接收方能够按序处理报文,则它只需针对最后一个连续的字节序列号发送一个ACK即可。但如果报文乱序到达,接收方可能需要为每一个缺失的序列号发送重复的ACK,或者采用更复杂的策略来通知发送方哪些部分已经收到、哪些部分丢失或乱序,这样会增加网络通信的复杂性和负担。

    拥塞控制

    为什么要拥塞控制?

    网络上有很多的计算机,可能当前的网络状态就已经比较拥堵。在不清楚当前网络状态下,贸然发送大量的数据,很有可能引起雪上加霜,也会导致大面积丢包。

    TCP 引入 慢启动 机制,先发少量的数据,探探路,摸清当前的网络拥堵状态,再决定按照多大的速度传输数据。

    什么是拥塞控制

    拥塞控制是计算机网络中用于防止数据传输过程中因网络过载而导致性能下降的一系列机制和技术。它主要应用于传输层协议,如TCP(传输控制协议),以确保网络资源能够被有效利用,同时避免由于过多的数据包导致网络拥堵和丢包现象。

    为什么一开始指数增长?

    发送的探测报文一旦收到了应答,说明网络状态正在慢慢变好,这时候需要尽快恢复通信,保证通信效率,拥塞窗口指数级增长,就可以尽快恢复通信。 

    为什么后来变成线性增长?

    拥塞窗口(Congestion Window, cwnd)的大小确实可以作为衡量网络状态的一个重要指标,尤其是在TCP协议中。拥塞窗口决定了发送方在没有收到确认的情况下最多可以发送多少数据,它的大小直接影响了数据传输速率和网络的整体负载情况。通过观察cwnd的变化,我们可以对当前网络状况有一定的了解。如果拥塞窗口增长太大了,就失去了探测的意义,所以增长到一定程度之后变成线性增长。

    滑动窗口的大小

    在讨论滑动窗口时,除了窗口向右滑动,我们还需要考虑窗口的大小是如何变化的。

    滑动窗口的大小需要考虑:

    1、接收方接收缓冲区的剩余空间的大小,在对方能接收的情况下,尽可能地多发送报文;

    2、网络的状态,在网络状态好的情况下,尽可能多发送报文。

    如果网络状态好,但是接收方的接收能力不足,滑动窗口的大小主要考虑接收方的接收缓冲区的剩余空间的大小;

    如果接收方接收缓冲区的剩余空间大,但是网络状态不好,滑动窗口的大小主要考虑网络情况。

    综合下来,滑动窗口的大小应该取 接收方接收缓冲区的剩余空间的大小 和 拥塞窗口 的最小值!

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

    如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

    相关文章

    K8S集群架构及主机准备

    本次集群部署主机分布K8S集群主机配置主机静态IP设置主机名解析ipvs管理工具安装及模块加载主机系统升级主机间免密登录配置主机基础配置完后最好做个快照备份 2台负载均衡器 Haproxy高可用keepalived3台k8s master节点5台工作节点(至少2及以上)本次集群部署主机分布 K8S集群主…

    三、js笔记

    (一)JavaScript概述 1、发展历史 ScriptEase.(客户端执行的语言):1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中).后将其改名ScriptEase.(客户端执行的语言)Javascript:Netscape(网景)接收Nombas的理念,(Brendan Eich)在其Netscape Navigat…

    穷举vs暴搜vs深搜vs回溯vs剪枝系列一>单词搜索

    题解如下 题目:解析决策树:代码设计: 代码: 题目: 解析 决策树: 代码设计: 代码: class Solution {private boolean[][] visit;//标记使用过的数据int m,n;//行,列char…

    使用Pygame制作“圣诞树”

    1. 前言 圣诞节到来之际,来给自己写一个圣诞树小动画吧!我们可以利用 Pygame 的绘图功能,轻松地在 2D 屏幕上绘制各种几何形状,并为圣诞树加上灯光闪烁、装饰品等效果。本篇将带领你实现一个简易版本的“屏幕圣诞树”&#xff0c…

    Windows电脑本地部署运行DeepSeek R1大模型(基于Ollama和Chatbox)

    文章目录 一、环境准备二、安装Ollama2.1 访问Ollama官方网站2.2 下载适用于Windows的安装包2.3 安装Ollama安装包2.4 指定Ollama安装目录2.5 指定Ollama的大模型的存储目录 三、选择DeepSeek R1模型四、下载并运行DeepSeek R1模型五、使用Chatbox进行交互5.1 下载Chatbox安装包…

    《AI大模型开发笔记》DeepSeek技术创新点

    一、DeepSeek横空出世 DeepSeek V3 以颠覆性技术架构创新强势破局!革命性的上下文处理机制实现长文本推理成本断崖式下降,综合算力需求锐减90%,开启高效 AI 新纪元! 最新开源的 DeepSeek V3模型不仅以顶尖基准测试成绩比肩业界 …

    【深度学习】softmax回归的从零开始实现

    softmax回归的从零开始实现 (就像我们从零开始实现线性回归一样,)我们认为softmax回归也是重要的基础,因此(应该知道实现softmax回归的细节)。 本节我们将使用Fashion-MNIST数据集,并设置数据迭代器的批量大小为256。 import torch from IP…

    python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

    【1】引言 前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…

    如果通过认证方式调用Sf的api

    导读 OAuth 2.0:是一个开放的授权框架,当用户想要访问Service Provider提供的资源时,OAuth客户端可以从IdP(Identity Provider)获得授权而不需要获取用户名和密码就可以访问该资源题。 作者:vivi,来源:osinnovation …

    SpringBoot 整合 SpringMVC:SpringMVC的注解管理

    分类&#xff1a; 中央转发器(DispatcherServlet)控制器视图解析器静态资源访问消息转化器格式化静态资源管理 中央转发器&#xff1a; 中央转发器被 SpringBoot 自动接管&#xff0c;不需要我们在 web.xml 中配置&#xff1a; <servlet><servlet-name>chapter2&l…

    【含文档+PPT+源码】基于微信小程序农家乐美食餐厅预约推广系统

    项目介绍 本课程演示的是一款基于微信小程序农家乐美食餐厅预约推广系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 …

    什么是门控循环单元?

    一、概念 门控循环单元&#xff08;Gated Recurrent Unit&#xff0c;GRU&#xff09;是一种改进的循环神经网络&#xff08;RNN&#xff09;&#xff0c;由Cho等人在2014年提出。GRU是LSTM的简化版本&#xff0c;通过减少门的数量和简化结构&#xff0c;保留了LSTM的长时间依赖…

    基于深度学习的输电线路缺陷检测算法研究(论文+源码)

    输电线路关键部件的缺陷检测对于电网安全运行至关重要&#xff0c;传统方法存在效率低、准确性不高等问题。本研究探讨了利用深度学习技术进行输电线路关键组件的缺陷检测&#xff0c;目的是提升检测的效率与准确度。选用了YOLOv8模型作为基础&#xff0c;并通过加入CA注意力机…

    【LLM-agent】(task6)构建教程编写智能体

    note 构建教程编写智能体 文章目录 note一、功能需求二、相关代码&#xff08;1&#xff09;定义生成教程的目录 Action 类&#xff08;2&#xff09;定义生成教程内容的 Action 类&#xff08;3&#xff09;定义教程编写智能体&#xff08;4&#xff09;交互式操作调用教程编…

    C++游戏开发实战:从引擎架构到物理碰撞

    &#x1f4dd;个人主页&#x1f339;&#xff1a;一ge科研小菜鸡-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 1. 引言 C 是游戏开发中最受欢迎的编程语言之一&#xff0c;因其高性能、低延迟和强大的底层控制能力&#xff0c;被广泛用于游戏…

    Time Constant | RC、RL 和 RLC 电路中的时间常数

    注&#xff1a;本文为 “Time Constant” 相关文章合辑。 机翻&#xff0c;未校。 How To Find The Time Constant in RC and RL Circuits June 8, 2024 &#x1f4a1; Key learnings: 关键学习点&#xff1a; Time Constant Definition: The time constant (τ) is define…

    DeepSeek Janus-Pro:多模态AI模型的突破与创新

    近年来&#xff0c;人工智能领域取得了显著的进展&#xff0c;尤其是在多模态模型&#xff08;Multimodal Models&#xff09;方面。多模态模型能够同时处理和理解文本、图像等多种类型的数据&#xff0c;极大地扩展了AI的应用场景。DeepSeek(DeepSeek-V3 深度剖析&#xff1a;…

    w188校园商铺管理系统设计与实现

    &#x1f64a;作者简介&#xff1a;多年一线开发工作经验&#xff0c;原创团队&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的网站项目。 代码可以查看文章末尾⬇️联系方式获取&#xff0c;记得注明来意哦~&#x1f339;赠送计算机毕业设计600个选题excel文…

    DeepSeek R1本地化部署 Ollama + Chatbox 打造最强 AI 工具

    &#x1f308; 个人主页&#xff1a;Zfox_ &#x1f525; 系列专栏&#xff1a;Linux 目录 一&#xff1a;&#x1f525; Ollama &#x1f98b; 下载 Ollama&#x1f98b; 选择模型&#x1f98b; 运行模型&#x1f98b; 使用 && 测试 二&#xff1a;&#x1f525; Chat…

    图漾相机——Sample_V1示例程序

    文章目录 1.SDK支持的平台类型1.1 Windows 平台1.2 Linux平台 2.SDK基本知识2.1 SDK目录结构2.2 设备组件简介2.3 设备组件属性2.4 设备的帧数据管理机制2.5 SDK中的坐标系变换 3.Sample_V1示例程序3.1 DeviceStorage3.2 DumpCalibInfo3.3 NetStatistic3.4 SimpleView_SaveLoad…