4.7 TCP 的流量控制

欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅!

文章目录

  • 前言
  • 1 滑动窗口与流量控制
  • 2 持续计时器与零窗口探测
  • 3 控制TCP发送报文段的时机
    • 3.1 控制发送时机的三种机制
    • 3.2 糊涂窗口综合症


前言

在网络通信中,流量控制是确保高效且可靠传输的关键。TCP协议通过滑动窗口机制实现流量控制,防止发送方以过快的速率发送数据,确保接收方有足够的缓冲空间处理接收到的数据。此外,TCP还使用持续计时器、Nagle算法和其他优化策略,进一步提高网络传输的效率。本章将深入探讨TCP流量控制的实现原理。

1 滑动窗口与流量控制

①工作原理

TCP流量控制的核心机制是滑动窗口。通过滑动窗口,TCP能够控制发送方发送数据的速率,确保接收方能够及时处理接收到的数据。每一端都维护一个窗口,接收方的接收窗口大小决定了发送方能在未收到确认的情况下发送的最大数据量。

  • 发送窗口:发送方的窗口,表示可以连续发送的数据量。
  • 接收窗口:接收方的窗口,表示接收方当前能够接收的数据量。

通过调整接收窗口的大小,接收方能通知发送方其可用的缓冲区空间,进而控制数据流动的速率。接收方的接收缓冲区越大,发送方能发送的数据量也越大;反之,接收缓冲区越小,发送方的发送速度也需要相应减缓。

【示例】
在这里插入图片描述

②优点

滑动窗口机制能动态调整数据的发送速率,避免发送方因为过快发送数据而造成接收方的缓冲区溢出。通过这一机制,TCP能够实现自适应流量控制,适应不同网络环境下的带宽和延迟条件,从而确保高效的数据传输

2 持续计时器与零窗口探测

在TCP连接中,接收方有时会因为缓冲区已满而无法接收更多的数据,导致接收窗口为零。当接收方的接收窗口为零时,发送方无法继续发送数据,这可能会导致连接的“死锁”状态。
在这里插入图片描述

为了避免这种情况,TCP引入了持续计时器(Persistence Timer)。

当发送方收到接收方的零窗口通知时,它会启动持续计时器。该计时器在到期后会发送一个零窗口探测报文段,报文中仅携带1字节的数据。接收方在确认该探测报文段时,会回复当前的窗口大小。如果窗口值变为非零,发送方即可继续发送数据,从而打破死锁

【作用】
零窗口探测报文段的发送与确认机制,使得即使接收方的窗口暂时为零,通信双方也能保持联系并避免长时间的等待。通过反复探测,直到接收方的缓冲区有足够空间接收数据,持续计时器提供了一个有效的手段来恢复数据流通。

3 控制TCP发送报文段的时机

3.1 控制发送时机的三种机制

TCP控制数据传输的时机依赖于三种机制:

①最大报文段长度(MSS)
TCP发送方根据缓存中待发送的数据量来决定发送报文段的时机。当缓存中的数据量达到MSS时,发送方会立即构造并发送一个报文段。MSS限制了每个报文段的最大数据量,避免报文过大而导致网络拥塞。

②推送(Push)操作
发送方可以通过推送操作指示TCP立即发送当前缓存中的数据,而不必等待缓存满。当应用层需要立即传输数据时,推送操作便能够加快数据传输速度。

③计时器到期
TCP发送方维护一个计时器,在计时器到期时,它会将当前缓存中的数据(最多MSS字节)打包成报文段并发送出去。

3.2 糊涂窗口综合症

①糊涂窗口综合症
糊涂窗口综合症是指发送方在每次接收到极小的数据时就发送一个报文段,导致网络传输的效率严重下降
在这里插入图片描述

②发送方的糊涂窗口
当接收方的应用程序缓慢地消费数据(如每次仅读取一个字节)时,发送方可能每次接收到一个字节的数据后就立即发送一个报文段。

由于每个报文段需要添加TCP/IP头部,发送一个字节需要形成一个41字节长的IP数据报,浪费了大量的带宽。

【解决方法:Nagle算法】

为了解决发送方的糊涂窗口综合症,TCP引入了Nagle算法

算法的基本思想:发送方在没有接收到对之前数据的确认时,应该尽量将多个小数据合并成一个报文段发送。
在这里插入图片描述
Nagle算法会延迟数据的发送,直到积累足够的数据达到MSS的大小再进行发送,从而减少因发送小报文段而造成的带宽浪费。

③接收方糊涂窗口
接收方糊涂窗口问题在于接收方应用程序处理数据过慢
在这里插入图片描述
每当接收方有极小的空闲空间时,接收方就会急忙通知发送方当前的窗口大小。该做法导致发送方过于频繁地进行数据发送操作,降低效率。

【解决方法】
接收方可以设置一个阈值,只在其缓冲区的空间达到一定程度时才通知发送方。

此外,接收方也可以通过延迟确认操作,等待接收到足够多的数据后再发送确认,减少不必要的窗口大小更新。

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

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

相关文章

不良人系列-复兴数据结构(栈和队列)

个人主页:爱编程的小新☆ 不良人经典语录:“相呴相济 玉汝于成 勿念 心安” 目录 一. 栈(stack) 1. 栈的概念 2. 栈的常见方法 3.栈的模拟实现 ​编辑 二. 队列 1. 队列的概念 2. 队列的使用 2.1 队列的常见方法 2.2 队列的模拟实现 2.3 队列…

在clion中使用MySQL的教程

首先就是配置好东西,也是非常简单的: 1.把mysql安装目录(其中的lib好像)中的2个文件复制到下面就行 2.然后配置,这个文件 cmake_minimum_required(VERSION 3.24) project(2024_12project)include_directories(D:\\mys…

某名校考研自命题C++程序设计——近10年真题汇总(下)

第二期,相比上一贴本帖的题目难度更高一些,我当然不会告诉你我先挑简单的写~ 某名校考研自命题C程序设计——近10年真题汇总(上)-CSDN博客文章浏览阅读651次,点赞9次,收藏13次。本帖更新一些某校的编程真题…

探讨不同类型的自动化测试框架

以下为作者观点: 在自动化测试中,框架提供了一种组织和执行测试案例的结构化方式。它们提供了一套准则和最佳实践,使测试人员能够编写可重复使用、可维护和可扩展的测试脚本。在这篇文章中,我们将讨论自动化测试中不同类型的框架…

C# 网络编程--关于Socket编程TCP协议中封包、拆包问题

在使用 Socket 编程,进行TCP协议网络通信时,经常会遇到“粘包”(也称为“封包、拆包”)的问题。粘包是指发送方发送的多个数据包被接收方合并成一个数据包,或者一个数据包被拆分成多个数据包接收。这通常是由于 TCP协议…

HarmonyOS:@Observed装饰器和@ObjectLink装饰器:嵌套类对象属性变化

装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型。对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第二层的属性变…

Excel拆分脚本

Excel拆分 工作表按行拆分为工作薄 工作表按行拆分为工作薄 打开要拆分的Excel文件,使用快捷键(AltF11)打开脚本界面,选择要拆分的sheet,打开Module,在Module中输入脚本代码,然后运行脚本 Su…

【机器人】Graspness 端到端 抓取点估计 | 论文解读

在复杂场景中实现抓取检测,Graspness是一种端到端的方法; 输入点云数据,输出抓取角度、抓取深度、夹具宽度等信息。 开源地址:GitHub - rhett-chen/graspness_implementation: My implementation of Graspnet Graspness. 论文地…

盛元广通畜牧与水产品检验技术研究所LIMS系统

一、系统概述 盛元广通畜牧与水产品检验技术研究所LIMS系统集成了检测流程管理、样品管理、仪器设备管理、质量控制、数据记录与分析、合规性管理等功能于一体,能够帮助实验室实现全流程的数字化管理。在水产、畜牧产品的质检实验室中,LIMS系统通过引入…

kubeadm安装K8s高可用集群之集群初始化及master/node节点加入calico网络插件安装

系列文章目录 1.kubeadm安装K8s高可用集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx及kubeadm部署 3.kubeadm安装K8s高可用集群之集群初始化及master/node节点加入集群calico网络插件安装 kubeadm安装K8s高可用集群之集群初始化及master/node节点加入ca…

【机器学习】以机器学习为翼,翱翔网络安全创新苍穹

我的个人主页 我的领域:人工智能篇,希望能帮助到大家!!!👍点赞 收藏❤ 在数字化浪潮汹涌澎湃的当下,网络安全如同守护数字世界的坚固堡垒,其重要性不言而喻。而机器学习技术的蓬勃…

go引用包生成不了vendor的问题

比如我要引入github.com/jinzhu/gorm这个包. 1. 首先获取包 go get github.com/jinzhu/gorm 这时go.mod文件中也有这个包依赖信息了. 2. 然后构建vendor go mod vendor 结果发现vendor目录下没有生成对应的包, 而且modules.txt也注释掉这个包了. 原因是没有其进行引用, go…

多模块的spring boot项目发布指定模块的脚本

我有一个多模块的Spring Boot项目,里面有基础模块,有业务模块,业务模块依赖一些基础模块。发布的时候,如果单独将某个模块发布,一般会报错。所以我都是整个项目,无论多少个模块,不管3721&#x…

fabric.js

目录 一、在canvas上画简单的图形 二、在canvas上用路径(Path)画不规则图形 三、在canvas上插入图片并设置旋转属性(angle) 四、让元素动起来(animate) 五、图像过滤器(filters)让图片多姿多彩 六、颜色模式(Color)和相互转换(toRgb、toHex) 七、对图形的渐变填充(Gradi…

23. 合并 K 个升序链表(java)

题目描述: 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后的链表。 示例 1: 输入:lists [[1,4,5],[1,3,4],[2,6]] 输出:[1,1,2,3,4,4,5,6] 解释&#xff…

爬取Q房二手房房源信息

文章目录 1. 实战概述2. 网站页面分析3. 编写代码爬取Q房二手房房源信息3.1 创建项目与程序3.2 运行程序,查看结果 4. 实战小结 1. 实战概述 本次实战项目旨在通过编写Python爬虫程序,抓取深圳Q房网上的二手房房源信息。我们将分析网页结构,…

【蓝桥杯】43699-四平方和

四平方和 题目描述 四平方和定理,又称为拉格朗日定理: 每个正整数都可以表示为至多 4 个正整数的平方和。如果把 0 包括进去,就正好可以表示为 4 个数的平方和。 比如: 502021222 712121222; 对于一个给定的正整数,可…

Kerberos身份验证

Kerberos是更现代化的身份验证协议,它比 NTLM 认证更安全,但域内某些服务仍支持 NTLM 认证。Kerberos 和 NTLM 认证一样,都是通过在 SSPI 接口实现的功能,这使得使用第三方协议(如:HTTP、SMB、LDAP&#xf…

达梦8-达梦数据的示例用户和表

1、示例库说明: 创建达梦数据的示例用户和表,导入测试数据。 在完成达梦数据库的安装之后,在/opt/dmdbms/samples/instance_script目录下有用于创建示例用户的SQL文件。samples目录前的路径根据实际安装情况进行修改,本文将达梦…

认识javascript中的模块化

什么是模块化? 将程序⽂件依据⼀定规则拆分成多个文件,拆分出来每个⽂件就是⼀个模块,模块中的数据都是私有的,模块之间互相隔离。如果不进行隔离,可能会造成模块间的变量定义有冲突,导致程序崩溃 为啥要使…