(考研湖科大教书匠计算机网络)第五章传输层-第四节:TCP流量控制

news2024/12/24 11:45:05
  • 获取pdf:密码7281
  • 专栏目录首页:【专栏必读】考研湖科大教书匠计算机网络笔记导航

文章目录

  • 一:流量控制概述
  • 二:流量控制举例
  • 三:拓展阅读(可不看)
    • (1)TCP流量控制完整例子
    • (2)操作系统缓冲区与滑动窗口的关系
      • A:若应用程序没有及时读取缓冲区
      • B:操作系统直接减少缓冲区大小

本节对应视频如下

  • 【计算机网络微课堂(有字幕无背景音乐版)】:TCP流量控制

一:流量控制概述

流量控制:一般来说,我们总希望数据能够传输得更快一些,但是存在一个问题,如果发送方发送数据过快那么接收方就有可能来不及接收,从而造成数据的丢失。所谓流量控制,就是让发送方的发送速率不要太快,让接收方能够来得及接收,TCP流量控制是利用滑动窗口机制来实现流量控制的

二:流量控制举例

如下图,A和B是因特网行两台主机,它们之间已经建立了TCP连接,A给B发送数据,B对A进行流量控制。左上角是主机A中待发送数据的字节序号,假设主机A发送的每个TCP报文段可携带100字节数据,因此图中每个小格子表示100字节数据的序号。在主机A和B建立TCP连接时,B告诉A“我的接收窗口为400”,因此主机A将自己的发送窗口也设置为400,这意味着主机A在未收到主机B发来的确认时可将序号落入发送窗口中的全部数据发送出去

在这里插入图片描述

主机B对主机A进行流量控制过程如下

  • 主机A将发送窗口内序号1-100的数据封装为一个TCP报文段发送出去,发送窗口内还有300字节可以发送

    • seq是TCP报文段首部中的序号字段,取值为1表示TCP报文段数据载荷的第一个字节序号是1
    • Data是TCP数据报文段
  • 主机A将发送窗口内序号101-200的数据封装为一个TCP报文段发送出去,发送窗口内还有200字节可以发送
    在这里插入图片描述

  • 主机A将发送窗口内序号201-300的数据封装为一个TCP报文段发送出去,但丢失了,发送窗口内还有100字节可以发送
    在这里插入图片描述

  • 主机B对主机A所发送的201号之前的数据进行累积确认,并在该累积确认中将窗口字段额值调整为300,也就是对主机A进行流量控制

    • ACK是TCP报文段首部中的标志位,取值为1表示这是一个TCP确认报文段
    • ack是TCP报文段首部中的确认号字段,取值为201表示201之前的数据已全部正确接收,现在希望收到序号201及其后续数据
    • rwnd是TCP报文段首部中的窗口字段,取值300表示自己的接收窗口大小为300
      在这里插入图片描述
  • 主机A收到该累积确认后,将发送窗口向前滑动,使已发送并收到确认的这些数据的序号移出发送窗口

  • 由于主机B在该累积确认中将自己的接收窗口调整为了300,因此主机A相应地也将自己的发送窗口调整为300
    在这里插入图片描述

  • 主机A现在可以将发送缓存中序号1-200的字节数据全部删除了,因为已经收到了主机B对它们的累积确认

  • 目前,主机A发送窗口内的序号为201-500,也即主机A还可以发送这300字节

    • 201-300:是已发送的数据,若重传计时器超时,它们会被重传
    • 301-400和401-500:还未被发送,可被分别封装在一个TCP报文段中发送
      在这里插入图片描述
  • 主机A将发送窗口内序号301-400的数据封装成一个TCP报文段发送出去,发送窗口内还有100字节可以发送

  • 主机A将发送窗口内序号401-500的数据封装成一个TCP报文段发送出去。

  • 至此,序号落在发送窗口内的数据已经全部被发送出去了,不能再发送新数据了
    在这里插入图片描述

  • 现在,发送窗口内序号201-300这100字节数据的重传计时器超时了,主机A将它们重新封装为一个TCP报文段发送出去,暂时不能发送其他数据
    在这里插入图片描述

  • 主机B收到重传的TCP报文段后,对主机A所发送的501号之前的数据进行累积确认,并在该累积确认中将接收窗口调整为100,这是主机B对主机A进行的第二次流量控制
    在这里插入图片描述

  • 主机A收到该累积确认后,将发送窗口向前滑动,使以发送并收到确认的这些数据的序号移出发送窗口

  • 由于主机B在该累积确认中将自己的接收窗口调整为了100,因此主机A相应地也将自己的发送窗口调整为100
    在这里插入图片描述

  • 主机A现在可以将发送缓存中序号201-500的字节数据全部删除了,因为已经收到了主机B对它们的累积确认

  • 目前,主机A发送窗口内的序号为501-600,也即主机A还可以发送这100字节
    在这里插入图片描述

  • 主机A将发送窗口内序号501-600的数据封装成一个TCP报文段发送出去

  • 至此,序号落在发送窗口内的数据已经全部被发送出去了,不能再发送新数据了
    在这里插入图片描述

  • 主机B对主机A所发送的601号之前的数据进行累积确认,并在该累积确认中将窗口字段的值调整为0,这是主机B对主机A进行的第三次流量控制
    在这里插入图片描述

  • 主机A收到该累积确认后,将发送窗口向前滑动,使以发送并收到确认的这些数据的序号移出发送窗口

  • 由于主机B在该累积确认中将自己的接收窗口调整为了0,因此主机A相应地也将自己的发送窗口调整为0

  • 目前,主机A不能再发送一般的TCP报文段了
    在这里插入图片描述

  • 主机A现在可以将发送缓存中序号501-600的字节数据全部删除了,因为已经收到了主机B对它们的累积确认
    在这里插入图片描述

  • 假设主机B向主机A发送了零窗口的报文段后不久,主机B的接收缓存又有了一些存储空间

  • 于是,主机B向主机A发送了接收窗口为300的报文段,然后它在传输过程中丢失了
    在这里插入图片描述

  • 主机A一直等待主机B发送的非零窗口的通知

  • 主机B一直等到主机A发送的数据

  • 如果不采取措施,这种互相等待的死锁局面将会一直持续下去
    在这里插入图片描述

  • 为了解决这个问题,TCP为每一个连接设置了一个持续计时器,只要TCP连接的一方收到对方的零窗口通知就启动持续计时器;若持续计时器超时,就发送一个零窗口探测报文,仅携带一字节的数据,而对方在确认这个探测报文段时,给出自己现在的接收窗口值。TCP规定:即使接收窗口为0也必须接收零窗口探测报文段、确认报文段以及携带有紧急数据的报文段

    • 如果接收窗口仍然为0:那么收到这个报文段的一方就会重新启动持续计时器
    • 如果接收窗口不是0:那么死锁局面就可以被打破
  • 对于本例,主机A收到零窗口通知时,就启动一个持续计时器,当持续计时器超时,主机A立刻发送一个仅携带一字节数据的零窗口探测报文段
    在这里插入图片描述

  • 假设此时主机B的接收窗口又为0了,主机B就在确认这个零窗口探测报文段时,给出自己现在的接收窗口值为0
    在这里插入图片描述

  • 主机A再次收到零窗口通知,就再次启动一个持续计时器,当持续计时器超时,主机A立刻发送一个仅携带一字节数据的零窗口探测报文段
    在这里插入图片描述

  • 假设主机B此时的接收缓存又有了一些存储空间,于是将自己的接收窗口调整为了300

  • 主机B就在确认这个零窗口探测报文段时,给出自己现在的接收窗口值为300
    在这里插入图片描述

三:拓展阅读(可不看)

(1)TCP流量控制完整例子

如下图是一个经典的场景,其中客户端是接收方,服务端是发送方。假设接受窗口和发送窗口都为200。假设两个设备在传输过程中都保持相同的窗口大小,不受外界影响

过程如下

  • 1:客户端向服务端发送请求数据报文
  • 2:服务端受到请求报文后,发送确认报文和80字节的数据,于是可用窗口可用窗口减少为120字节。同时,SND.NXT指针也向右移动80字节,指向321,意味着下次发送数据序列号为321
  • 3:客户端收到80字节数据后,其接受窗口向右移动80字节,RCV.NXT指向321,意味着客户端期望的下一个报文序列号是321,接着发送确认报文给服务端
  • 4:服务端再次发送120字节数据,可用窗口耗尽为0,无法再发送数据
  • 5:客户端收到120字节数据后,接受窗口向右移动120字节,RCV.NXT指向441,接着发送ACK
  • 6:服务端收到对80字节数据的确认报文后,SUD.UNA指针向右偏移指向321,于是可用窗口增大到80
  • 7:服务端受到对120字节的确认报文后,SUD.UNA指针向右偏移指向441,于是可用窗口增大到200
  • 8:服务端现在可以继续发送,发送160个字节的数据后,SND.NXT指向601,可用窗口减少到40
  • 9:客户端收到160字节后,接收窗口向右移动160字节,RCV.NXT指向601,接着发送ACK
  • 10:服务端收到对160字节数据的确认报文后,发送窗口向右面移动60字节,SND.UNA指针偏移160后指向601,可用窗口增大至200

在这里插入图片描述

(2)操作系统缓冲区与滑动窗口的关系

上面的例子中,发送窗口和接受窗口的大小是不变的。但在实际情况中,发送窗口和接受窗口中存放的字节数,都会存放在操作系统中的内存缓冲区,因此一定会受到操作系统的控制而被调整。当应用程序由于各种原因未及时读取缓冲区中的内容时,也会对缓冲区造成影响

A:若应用程序没有及时读取缓冲区

下面的例子展示的是由于应用程序没有及时读取缓冲区时,发送窗口和接受窗口的变化情况,其中

  • 客户端为发送方,服务端为接收方,发送窗口和额接受窗口初始大小为360
  • 服务端很忙,收到客户端数据时,应用层未能及时处理数据

过程如下

  • 1:客户端发送140字节数据,可用窗口变为220
  • 2:服务端受到140字节数据,由于服务器繁忙,应用程序仅仅读取了40字节,还有100字节占用缓冲区,因此接收窗口缩小到260(360-100),最后发送ACK时,将窗口大小告知客户端
  • 3:客户端收到ACK后,将发送窗口减少为260
  • 4:客户端发送180字节数据,可用窗口减少到80
  • 5:服务端收到180字节后,但是应用层没有读取任何数据,180字节直接留在了缓冲区,于是接收窗口缩小到了80(260-180),最后发送ACK时,将窗口大小告知客户端
  • 6:客户端收到ACK后,将发送窗口减少为80
  • 7:客户端发送80字节数据后,可用窗口耗尽
  • 8:服务端收到80字节数据,但是应用程序依然没有读取任何数据,这80字节仍然留在缓冲区,于是接收窗口缩小到了0,最后发送ACK时,将窗口大小告知客户端
  • 9:客户端收到ACK后,将发送窗口减少为0

最后窗口变为了0,也即是发生了窗口关闭。当发送方窗口为0时,发送方实际上会定时发送窗口探测报文,以便知道接受方的窗口是否发生了改变

在这里插入图片描述

B:操作系统直接减少缓冲区大小

当服务器系统资源很紧张的时候,操作系统可能会直接减少接受缓冲区的大小,这时应用程序又无法及时读取缓冲区数据的话,那么可能导致丢包现象的产生

过程解释如下

  • 1:客户端发送140字节的数据,可用窗口减少到了220
  • 2:服务端因为现在非常繁忙,操作系统于是就把接受缓存减少了120字节,当收到140字节数据后,由因为应用程序没有及时读取数据,所以140字节留在了缓冲区中,于是接受窗口大小由360缩小到了100。最后发送ACK时,通知窗口大小给对方
  • 3:此时客户端因为还没有收到服务端的ACK,所以不知道此时接受窗口缩减到了100,客户端只会看到自己的可用窗口还有220,于是客户端发送了180字节数据,可用窗口减少到了40
  • 4:服务端收到了140字节数据,发现数据大小超过了接收窗口的大小,于是直接把数据丢了
  • 5:客户端收到第2步服务端发送的ACK后,尝试减少发送窗口到100,把窗口的右端向左收缩了80,但是在第3步时,已经发送了超过100字节的数据,所以可用窗口出现负值

所以如果发生了先减少缓存,再收缩窗口,就会出现丢包的现象。因此为了防止这种情况发生,TCP规定不允许同时减少缓存又收缩窗口的,而是先收缩窗口,一定时间后再减少缓存
在这里插入图片描述

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

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

相关文章

马上卸载这个恶心的软件!

大家好,我是良许。 春节已经过完了,但在这喜庆的日子里,又有一个小丑在上窜下跳了。 没错,这个不要脸的小丑依然还是 Notepad 的作者。 好好的一个开发者,为何老喜欢整一些有得没得的东西?好好搬砖写代码…

pygame8 扫雷游戏

一、游戏规则: 1、点击方格,如果是地雷,游戏失败,找到所有地雷游戏胜利 2、如果方块上出现数字,则表示在其周围的八个方块中共有多少颗地雷 二、游戏主逻辑: 主要逻辑即调用run_game, 然后循环检测事件…

云计算|OpenStack|社区版OpenStack---基本概念科普(kvm的驱动类别和安装)

前言: 云计算里基本都是基于kvm技术作为底层支撑,但,该技术是比较复杂的,首先,需要硬件的 支撑,表现在物理机上,就是需要在BIOS中调整设置虚拟化功能,这个虚拟机功能通常是interVT或…

Fastjson2基础使用以及底层序列化/反序列化实现探究

1 Fastjson2简介 Fastjson2是Fastjson的升级版,特征: 协议支持:支持JSON/JSONB两种协议部分解析:可以使用JSONPath进行部分解析获取需要的值语言支持:Java/Kotlin场景支持:Android8/服务端其他特性支持&a…

python基础知识有哪些需要背(记住是基础知识)我是初学者

大家好,小编来为大家解答以下问题,一个有趣的事情,一个有趣的事情,今天让我们一起来看看吧! 1、python基础知识有哪些需要背(记住是基础知识)我是初学者 或看好Python的广阔前景,或…

RabbitMQ 入门到应用 ( 五 ) 应用

6.更多应用 6.1.AmqpAdmin 工具类 可以通过Spring的Autowired 注入 AmqpAdmin 工具类 , 通过这个工具类创建 队列, 交换机及绑定 import org.springframework.amqp.core.AmqpAdmin; import org.springframework.amqp.core.Binding; import org.springframework.amqp.core.Di…

python基于django微信小程序的适老化老人健康预警小程序

随着信息技术和网络技术的飞速发展,人类已进入全新信息化时代,传统管理技术已无法高效,便捷地管理信息。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,各行各业相继进入信息管理时代, 适老化老人健康预警微信小程序就是信息时代变革中的产物之一。 任何系统都要遵…

Spring国际化实现

Java国际化 Java使用Unicode来处理所有字符。 Locales 国际化主要涉及的是数字、日期、金额等。 有若干个专门负责格式处理的类。为了对格式进行控制,可以使用Locale类。它描述了: 一种语言一个位置(通常包含)一段脚本(可选,自Java SE7开…

CMMI之需求开发流程

需求开发(Requirement Development, RD)的目的是通过调查与分析,获取用户需求并定义产品需求。需求开发过程域是SPP模型的重要组成部分。本规范阐述了需求开发过程域的两个主要规程: 需求调查 [SPP-PROC-RM-SURVEY] 需求定义 [SPP…

消失的数字【C语言】

题目&#xff1a; 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 解法&#xff1a; int missingNumber(int* nums, int numsSize){int val0;for(int i0;i<numsSize;i){val^nums[i];}fo…

Vue3之条件渲染

1.何为条件渲染 条件渲染就是在指定的条件下&#xff0c;渲染出指定的UI。比如当我们显示主页的时候&#xff0c;应该隐藏掉登录等一系列不相干的UI元素。即UI元素只在特定条件下进行显示。而在VUE3中&#xff0c;这种UI元素的显示和隐藏可以通过两个关键字&#xff0c;v-if 和…

Qt动画框架详解

目录1.前言2.原理3.属性动画4.并行执行的动画5.顺序执行的动画6.扩展属性动画支持的数据类型1.前言 为软件适当的添加一些动画&#xff0c;能够提高软件的用户体验。在使用Qt框架开发软件时&#xff0c;我们可以用Qt提供的动画框架来为QWidget等UI元素添加动画效果。本文从动画…

程序员和他的女朋友一起创建了价值 150,000,000 美元的网站

本篇文章讲述了Otis和Elizabeth Chandler创办Goodreads.com的故事。他们从小就爱读书&#xff0c;创办网站前他们的困惑是没有很多人在线分享书评。Otis和Elizabeth觉得如果有一个地方把所有人的评论和评价收集起来&#xff0c;那将会很有价值。奥蒂斯和伊丽莎白从小就喜欢读书…

MMKV与mmap:全方位解析

概述 MMKV 是基于 mmap 内存映射的移动端通用 key-value 组件&#xff0c;底层序列化/反序列化使用 protobuf 实现&#xff0c;性能高&#xff0c;稳定性强。从 2015 年中至今&#xff0c;在 iOS 微信上使用已有近 3 年&#xff0c;其性能和稳定性经过了时间的验证。近期已移植…

海量数据相似数据查询方法

1、海量文本常见 海量文本场景&#xff0c;如何寻找一个doc的topn相似doc&#xff0c;一般存在2个问题&#xff0c; 1)、两两对比时间o(n^2) 2)、高维向量比较比较耗时。 文本集可以看成(doc,word)稀疏矩阵&#xff0c;一般常见的方法是构建到排索引&#xff0c;然后进行归并…

论文投稿指南——中文核心期刊推荐(社会学)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff0c;少数期刊所含…

【论文精读】DeepWalk: Online Learning of Social Representations

DeepWalk: Online Learning of Social Representations 本文是我参加Datawhale的CS224W图机器学习时的笔记&#xff0c;第一次学习图机器学习&#xff0c;对DeepWalk这篇开山之作的理解。 论文的三位作者均来自纽约州立大学石溪分校&#xff0c;杨振宁和丘成桐也曾在此教学。 …

JavaScript内存泄露和垃圾回收机制

1、是什么&#xff1f;内存泄露&#xff08;Memory leak&#xff09;是在计算机科学中&#xff0c;由于疏忽或错误造成程序未能释放已经不再使用的内存。并非指内存在物理上的消失&#xff0c;而是应用程序分配某段内存后&#xff0c;由于设计错误&#xff0c;导致在释放该段内…

Spring Boot 项目介绍

Spring Boot 项目介绍 作为学习过 Java 的软件开发者&#xff0c;相信都知道 Spring 这一伟大的框架&#xff0c;它所拥有的强大功能之一就是可以集成各种开源软件。但随着互联网的高速发展&#xff0c;各种框架层出不穷&#xff0c;这就对系统架构的灵活性、扩展性、可伸缩性…

【项目精选】基于JSP物流信息网(论文+源码+视频)

点击下载源码 近年来&#xff0c;随着时代的进步&#xff0c;社会随之不断发展&#xff0c;经济也快速发展起来了&#xff0c;人民的消费水平在不断地提高&#xff0c;平常的实体店消费已经不能满足人们的需求&#xff1b;在者&#xff0c;互联网技术的不断发展也为电子商务的兴…