47、TCP的流量控制

从这一节开始,我们学习通信双方应用进程建立TCP连接之后,数据传输过程中,TCP有哪些机制保证传输可靠性的。本节先学习第一种机制:流量控制。


窗口与流量控制

首先,我们要知道的是:什么是流量控制?使用流量控制是为了解决什么问题?

在这之前,我们学习过“接收窗口”的概念,其实也就是接收缓存的大小,能够容纳多少字节的数据,这个数值是有限的。所以接收窗口在容纳了足够的数据量之后,就没有缓存再接收对方发来的数据了。如果这时对方还在不断地发来数据,那么这些数据到达接收方之后,接收方由于没有空余的空间来容纳,来不及接收,就只能把它们丢弃掉。

所以,必须要有一种机制能够解决这种问题,这就是流量控制。流量控制就是为了能够控制发送方的发送速率,使其不要太快,要能够让接收方来得及处理

可以用比较经典的原理图来说明流量控制,如下图:

在这个图中,为了方便叙述原理,假设发送方只简单的发送数据,接收方只简单的接收数据,并设置接收方的接收窗口大小为400个字节。

一开始,发送方发送了两个大小为100字节数据的报文段,接收方收到后进行确认回复:ack=201,rwnd=200。意思是,截止到序号为200的报文,我已经都收到了,我期望你下一个发来的报文的序号是201,现在我的接收窗口大小是200字节,你最多再给我发200字节的数据。

发送方知道这个情况之后,接着发送了200个字节的数据。这时候接收方给出接收窗口大小为0的确认报文,告诉发送方:我目前已经没有接收缓存了,暂时先不要发送数据了。

接收方通过在确认报文中给出自己当前接收窗口的大小,使发送方知道应该向对方发送多少数据量,就是TCP流量控制的方法。


“零窗口”死锁现象

了解了上面流量控制的过程之后,可能会想一个问题:接收方最后发送窗口值大小为零的确认报文之后,发送方就会暂停发送数据,等待接收方告诉缓存有空间了再继续发送。可是如果接收方将“缓存有空间”的消息告诉发送方的时候,这个消息不巧在传输过程中丢失了,那么发送方会不会一直等下去呢?

这个现象就叫做“零窗口”死锁现象,由于发送方没收到“接收方缓存有空间”的消息,所以发送方一直以为接收方当前接收缓存没有空间。所以双方就会产生这样一种“死锁”的局面

为了解决这种死锁问题,所以每一个TCP连接都会设置有一个“坚持定时器”。这个定时器的作用是:从收到对方发来“窗口大小为零”的报文开始,启动定时器,等到定时器到期如果还没有收到对方发来“接收缓存有空间”的消息,那么就主动向对方发送一个“零窗口探测”报文,这个探测报文只带有一个字节的数据,目的就是为了探测一下对方窗口大小有没有改变。

对方收到这个探测报文后,给出确认报文,其中包含了当前窗口值,如果当前窗口值已经不是零了,这个死锁的局面就打破了,发送方可以继续发送数据;但如果当前窗口值仍然为零,那么发送方将再次启动“坚持定时器”,时间到就再次发送探测报文。

学到这里,又出现一个问题:既然接收方的窗口值都为零了,也就意味着接收方不能再接收数据了,那么为什么发送方的“零窗口探测”报文能被接受呢?

这其实是TCP的一个规定:当接收窗口大小为零时,也必须接收“零窗口探测”报文。还有一个前面学过的,首部中URG位被设置为1的紧急报文,也是即使窗口值为零时必须被接收。


糊涂窗口综合症

糊涂窗口综合症主要反映的是:接收方应用进程和接收缓存交互数据的时候效率低下,从而导致TCP传输效率低下的问题。

比如这样一个情景:接收方的窗口值为零,意味着当前接收缓存已满,但是上层的应用进程一次只读取一个字节的数据,这样缓存中就有了一个字节的空间,这时接收方给发送方发出确认,表明自己的接收窗口值是1,你可以发来1个字节的数据。

这样的话,可以想一下,发送方要把这一个字节的数据加上至少20字节的TCP首部,再加上至少20字节的IP首部,层层封装,就会造成传输首部信息的开销大,而实际的有用数据才只有一个字节。如此反复,一次只有一个字节的有效数据在传输,就导致TCP传输效率的低下,这就是糊涂窗口综合症的现象。

要解决这种问题,可以在接收方和发送方分别设置一些机制,双方配合起来,使得接收方不要有了一点空间就立即发送确认报文,同时发送方也不要每次只发送一个很小的报文段。

可以在接收方设置:等到缓存中有了能够容纳一个最大长度报文段的空间时,或者缓存空间有一半是空余的,就可以给发送方发去确认,通告自己的接收窗口大小。

也可以在发送方使用Nagle算法:当数据已达到发送窗口大小的一半或已达到报文段的最大长度时,就立即发送一个报文段。

两种方法配合起来使用,可以有效避免糊涂窗口综合症的现象发生。


本节内容我们学习了TCP规定在数据传输过程中的流量控制的方法原理,另外还介绍了“零窗口”死锁和糊涂窗口综合症两个可能会发生的问题和相应的解决办法。下一节,我们学习TCP的可靠传输。

参考教材:杨英鹏《计算机网络原理与实践》

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

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

相关文章

MR源码解析和join案例

MR源码解析 new Job(): 读取本地文件, xml配置job.start(): 启动线程job的run():线程方法 runTasks(): 传入对应的接口,启动map或者reduceMapTask类的run(): 设置map阶段的参数,初始化任务,创建上下文对象 创建读取器LineRecordReader判断是…

Windows下搭建MavLink通信协议环境,并用C++程序测试

搭建环境 git克隆 git clone https://github.com/mavlink/mavlink.git --recursive安装python的future库 pip install future使用可视化工具生成mavlink库 XML是选择消息格式,也可以自定义Out是输出路径Language是生成的语言,我这里是CProtocol是协议…

“五度晟企通”企业发展服务平台正式发布,帮扶企业行稳致远!

在数字中国建设的大背景下,“五度易链”以企业实际发展需求为牵引,以帮扶企业行稳致远为目标,基于全体量产业大数据,运用NLP、AI等新一代信息技术,打造了数字化ToB企业发展服务平台“五度晟企通”,旨在以数…

企微SCRM营销平台MarketGo-ChatGPT助力私域运营

一、前言 ChatGPT是由OpenAI(开放人工智能)研发的自然语言处理模型,其全称为"Conversational Generative Pre-trained Transformer",即对话式预训练转换器。它是GPT系列模型的最新版本,GPT全称为"Gene…

16-数据结构-图的存储结构

简介:主要为图的顺序存储和链式存储。其中顺序存储即邻接矩阵的画法以及代码,邻接矩阵又分为有权图和无权图,区别就是有数据的地方填权值,无数据的地方可以填0或者∞,而有权图和无权图,又细分为有向图和无向…

【腾讯云Cloud Studio实战训练营】戏说cloud studio

文章目录 前言产品概述项目体验登录空间模板模板项目体验 总结 前言 在奇幻世界中,存在着一片神秘的云海,被人们称为腾讯云云端开发环境 Cloud Studio。这片云海是一座巨大的浮岛,上面漂浮着一个集成式开发环境(Integrated Devel…

CUDA和cudnn详细安装过程【通用win】

1 软硬件资源 仅作参考,其他型号通用 win 11 32内存显卡 RTX 2080Ti ,驱动版本号:516.59python 3.8.10torch 1.8.0 框架cudatoolkit 11.1cudnn 8.0.4 2 查看适用cuda版本 2.1 查看本机的cuda算力 安装之前先进入官网查看自己的显卡能不能用…

Android 在TextView前面添加多个任意View且不影响换行

实现效果如下: 如上,将头像后面的东西看作一个整体,因为不能影响后面内容的换行,且前面控件的长度是可变的,所以采用自定义View的方法来实现: /*** CSDN深海呐 https://blog.csdn.net/qq_40945489/articl…

leetcode386. 字典序排数(java)

字典序排数 题目描述递归法迭代 题目描述 难度 - 中等 leetcode386. 字典序排数 给你一个整数 n ,按字典序返回范围 [1, n] 内所有整数。 你必须设计一个时间复杂度为 O(n) 且使用 O(1) 额外空间的算法。 示例 1: 输入:n 13 输出&#xff1a…

手机也可以搭建个人博客?安卓Termux+Hexo搭建属于你自己的博客网站【cpolar实现公网访问】

文章目录 前言 1.安装 Hexo2.安装cpolar3.远程访问4.固定公网地址 前言 Hexo 是一个用 Nodejs 编写的快速、简洁且高效的博客框架。Hexo 使用 Markdown 解析文章,在几秒内,即可利用靓丽的主题生成静态网页。 下面介绍在Termux中安装个人hexo博客并结合…

基于Java+SpringBoot+Vue前后端分离农产品直卖平台设计和实现

博主介绍:✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专…

调教 文心一言 生成 AI绘画 提示词(Midjourney)

文章目录 第一步第二步第三步第四步第五步第六步第七步第八步 文心一言支持连续对话 我瞎玩的非专业哈哈 第一步 你好,今天我们要用扩散模型创建图像。我会给你提供一些信息。行吗? 第二步 这是Midjourney的工作原理:Midjourney是另一个基于ai的工具,能…