计算机网络:运输层 —— TCP的流量控制

文章目录

    • TCP的流量控制
      • TCP的流量控制方法
        • 滑动窗口机制
        • 持续计时器

TCP的流量控制

当 TCP 客户端持续发送大量数据时,应用程序可能正忙于其他任务,并不一定能够立刻取走数据,这会造成接收方接收缓存的溢出,导致数据丢失

![[TCP的流量控制.png]]

TCP 为应用程序提供了流量控制(Flow Control)机制,以解决因发送方发送数据太快而导致接收方来不及接收,造成接收方的接收缓存溢出的问题

流量控制的基本方法:接收方根据自己的接收能力(接收缓存的可用空间大小)控制发送方的发送速率

TCP的流量控制方法

TCP 的流量控制方法旨在确保发送方和接收方之间的数据传输速度合理、稳定,避免发送方发送速度过快导致接收方无法处理和接收数据。

以下是 TCP 流量控制的主要方法:

  1. 滑动窗口机制

    • TCP 中的滑动窗口机制允许发送方在不等待确认的情况下连续发送多个数据包。

    • 接收方会发送一个窗口大小的确认信息(rwnd),告诉发送方可以继续发送多少个数据包。

    • 通过动态调整滑动窗口的大小,可以有效控制数据的发送速度。

  2. 接收方窗口调整

    • 接收方可以根据其接收缓存的大小,动态调整发送方的发送窗口大小。

    • 如果接收方的处理能力较低,可以减小接收窗口的大小,从而限制发送方的发送速度。

  3. 基于时间的流量控制

    • TCP 还可以使用基于时间的流量控制方法,例如持续计时器超时机制

    • 发送方在发送数据之后会启动一个计时器,如果在一定时间内没有收到接收方的确认信息,发送方会认为数据丢失并重新发送。

    • 通过持续计时器和超时机制,可以有效控制数据的发送速度。

滑动窗口机制

TCP 中的滑动窗口机制允许发送方在不等待确认的情况下连续发送多个数据包,主要包含以下部分:

  • 窗口大小的确定:TCP 连接建立后,接收方会在确认应答报文中告知发送方自己的接收窗口rwnd)大小(通过 TCP 首部中的 “窗口字段” 表示)。接收窗口大小代表接收方当前能够接收的数据量

    例如,接收方告知发送方窗口大小为 500 字节,就意味着发送方最多可以发送 500 字节的数据给接收方。

  • 数据发送与确认:发送方根据接收方的窗口大小,将数据分成多个报文段进行发送。每发送一个报文段,就会启动一个定时器等待接收方的确认应答。接收方成功接收数据后,会向发送方发送确认应答,其中包含确认号 ACK 和当前的接收窗口大小。确认号用于告知发送方下一个期望接收的字节序号,而接收窗口大小的更新则让发送方知道后续还可以发送多少数据。

  • 窗口的滑动:随着接收方不断接收和处理数据,接收窗口会不断地向前滑动。比如,接收方最初的接收窗口范围是从序列号 1001 到 1500,当接收方成功接收并处理了序列号为 1001 到 1200 的数据后,接收窗口就会向前滑动,新的接收窗口范围变为从序列号 1201 到 1700(假设接收窗口大小没有变化)。发送方根据接收窗口的滑动情况,不断调整自己的发送窗口 swnd,继续发送后续的数据。

  • 流量控制的动态调整:如果接收方处理数据的速度较慢,导致接收窗口变小,接收方会在确认应答中告知发送方新的窗口大小。发送方收到后,就会相应地减少发送的数据量,以适应接收方的处理能力。

    如果接收方处理速度较快,接收窗口变大,接收方也会通知发送方,发送方就可以增加发送的数据量,提高数据传输效率。

例如以下示例(DATA 表示这是 TCP 数据报文段):

在这里插入图片描述

  1. 初始状态:A 和 B 之间已经建立了TCP连接,A 开始给 B 发送数据。

  2. A发送数据

    • A 的发送窗口(swnd)初始值为400,首先发送了一个包含 seq=1seq=100 的数据块。
    • B 收到了这个数据块并返回了一个 ACK=1 ack=101 的确认消息,表示已经收到了 seq=1seq=100 的数据。
  3. 继续发送数据:A 继续发送数据,发送了 seq=101seq=200 的数据块,每次发送的数据量不超过当前的发送窗口大小 swnd

  4. 数据丢失:A 继续发送数据,发送了 seq=201seq=300 的数据块,在某个时刻,seq=201seq=300 的数据块丢失了。

  5. B的第一次流量控制:由于 B 没有收到 seq=201seq=300 这部分数据,所以不会发送相应的确认消息,只返回了 ACK=1 ack=201 rwnd=300 的确认消息,表示已经收到了 seq=101seq=200 的数据。并告诉 A 它的接收窗口大小为 rwnd=300,即 B 最多可以再接收 300 个字节的数据。

  6. A向前滑动窗口:A 根据 B 的接收窗口大小调整自己的发送窗口大小 swnd=300,并向前滑动自己的窗口,新的接收窗口范围变为从序列号 201 到 500。A 继续向 B 发送 seq=301seq=400seq=401seq=500 的数据块。

  7. 超时重传:A在一段时间后发现 seq=201seq=300 的数据块没有得到确认,于是重新发送这部分数据。

  8. B的第二次流量控制:B 向 A 返回了 ACK=1 ack=501 rwnd=100 的确认消息,表示已经接收到 seq = 500 之前的所有数据块,并告诉 A 它的接收窗口大小为 rwnd=100,即 B 最多可以再接收 100 个字节的数据。

  9. A再次向前滑动窗口:A 根据 B 的接收窗口大小调整自己的发送窗口大小 swnd=100,并向前滑动自己的窗口,新的接收窗口范围变为从序列号 501 到 600。A 继续向 B 发送 seq=501seq=600 的数据块。

  10. B的第三次流量控制:B 向 A 返回了 ACK=1 ack=601 rwnd=0 的确认消息,表示已经接收到 seq = 600 之前的所有数据块,并告诉 A 它的接收窗口大小为 rwnd=0,即 B 不再接收任何数据。

  11. A再次向前滑动窗口:A 根据 B 的接收窗口大小调整自己的发送窗口大小 swnd=0,并向前滑动自己的窗口,但不再向 B 发送数据。

持续计时器

若发送方收到了接收方 rwnd=0 的确认消息后,会一直等待其发送非零窗口通知,即将窗口大小调整为大于0,若非零窗口丢失,则会导致发送方与接收方一直互相等待,造成死锁局面,将会一直持续下去。

为了打破由于非零窗口通知报文段丢失而引起的双方互相等待的死锁局面,TCP为每一个连接都设有一个持续计时器(Persistence Timer)。

![[TCP的流量控制方法3.png]]

TCP规定:即使接收窗口值为0,也必须接受零窗口探测报文段、确认报文段以及携带有紧急数据的报文段

零窗口探测报文段也有重传计时器,当重传计时器超时后,零窗口探测报文段会被重传。

![[持续计时器.png]]

  1. 接收窗口变为0:主机 B 的接收窗口 rwnd 变为0,表明 B 暂时无法接收更多的数据。B 向 A发送一个 ACK 报文,其中包含 rwnd=0 的信息。

  2. 主机A暂停发送:A 收到主机 B 的 ACK 报文后,知道对方的接收窗口为0,因此将自己的 swnd 调整为 0,暂停发送数据。

  3. 持续定时器启动:为了避免长时间的僵局,A 启动了一个持续定时器。当持续定时器到期时,即使 B 的接收窗口仍然为0,A 也会发送一个小的数据包(零窗口探测报文段,1字节)来试探 B 的状态。

  4. 试探数据包:B 收到零窗口探测报文段后,会返回一个新的 ACK 报文,其中包含了最新的接收窗口大小。

  5. 接收窗口恢复: 如果 B 的接收窗口已经变大,那么它会在 ACK 报文中包含新的 rwnd 值。A 收到这个 ACK 报文后,就可以恢复正常的数据发送,从而打破死锁局面。

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

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

相关文章

Flink_DataStreamAPI_执行环境

DataStreamAPI_执行环境 1创建执行环境1.1getExecutionEnvironment1.2createLocalEnvironment1.3createRemoteEnvironment 2执行模式(Execution Mode)3触发程序执行 Flink程序可以在各种上下文环境中运行:我们可以在本地JVM中执行程序&#x…

鸿蒙中如何实现图片拉伸效果

2024年10月22日,华为发布会上,推出鸿蒙5.0。现在加入恰逢时机,你,我皆是鸿蒙时代合伙人。无论为了学习技术,还是为了谋福利,在鸿蒙的浩瀚海洋中分到一杯羹。现在学习鸿蒙正当时。 一文了解鸿蒙中图片拉伸的…

Unity 2022 Nav Mesh 自动寻路入门

untiy 2022 window-PackageManager-AINavigation 安装 Install 2.创建一个空物体命名Nav,在其自身挂载 NavMeshSurface 然后点击bake 烘焙地形即可 3.创建palyer和怪物 怪物AI代码 using System.Collections; using System.Collections.Generic; using UnityEngi…

基于gradio+networkx库对图结构进行可视化展示

前言 在gradio框架下对蛋白质-蛋白质相互作用网络(PPI网络)进行可视化,并将其在网页前端进行展示。 方法 其实很简单 可以直接使用networkx画图后保存图片,然后使用Gradio框架的image组件进行展示即可。 但实际上gradio还配置…

MSTP知识点

多生成树协议 在 MSTP(Multiple Spanning Tree Protocol)中,根桥(root)、指定端口(designated port)、备用端口(alternate port)等角色都是确保网络中没有循环并且流量能…

为正在运行的 Docker 容器重启策略,以提高服务的可用性

为正在运行的 Docker 容器重启策略,以提高服务的可用性。 为正在运行的 Docker 容器添加 --restartalways –restartalways 是 Docker 中一个常用的参数,用来设置容器的重启策略。它的作用是确保容器在一定条件下能够自动重启,以提高服务的可用性。 方…

后台管理系统(开箱即用)

很久没有更新博客了,给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理,部门管理&#…

Cursor安装Windows / Ubuntu

一、安装 1、下载软件 2、安装依赖 #安装fuse sudo apt-get install fuse3、将cursor添加到应用程序列表 sudo mv cursor-0.42.5x86_64.AppImage /opt/cursor.appimage #使用自己版本号替换 sudo chmod x /opt/cursor.appimage #给予可执行权限 sudo nano /usr/share/applic…

谷粒商城のRedisESRabbit MQ集群

文章目录 前言一、搭建Redis集群三、搭建ES集群三、搭建Rabbit MQ集群 前言 本篇是谷粒商城集群部署篇,搭建Redis、ES、Rabbit MQ集群实践的个人笔记,也是谷粒商城笔记的最后一篇。集群相关的理论性内容,会放在面试篇的笔记中。 一、搭建Redi…

孙赢利_11月17日_超分周报

一. 康佳PC端实现:1080 → 4K 实时超分 1. 将图像预处理操作从 CPU → GPU 运行 2. 后处理部分操作 从 CPU → GPU 运行 inference_realesrgan_Animal_Video.py import argparse import cv2 import glob import os from basicsr.archs.rrdbnet_arch import RRDBNe…

录的视频怎么消除杂音?从录制到后期的杂音消除攻略

在录制视频时,杂音往往是一个令人头疼的问题。无论是环境噪音、设备噪音还是电磁干扰,杂音的存在都会极大地影响视频的听觉体验。录的视频怎么消除杂音?通过一些前期准备和后期处理技巧,我们可以有效地消除这些杂音,提…

论文《基于现实迷宫地形的电脑鼠设计》深度分析——智能车驱动算法

论文概述 《基于现实迷宫地形的电脑鼠设计》是由吴润强、庹忠曜、刘文杰、项璟晨、孙科学等人于2023年发表的一篇优秀期刊论文。其针对现阶段电脑鼠计算量庞大且不适用于现实迷宫地形的问题,特基于超声波测距与传统迷宫算法原理,设计出一款可在现实迷宫地…

算法日记 26-27day 贪心算法

接下来的题目有些地方比较相似。需要注意多个条件。 题目:分发糖果 135. 分发糖果 - 力扣(LeetCode) n 个孩子站成一排。给你一个整数数组 ratings 表示每个孩子的评分。 你需要按照以下要求,给这些孩子分发糖果: 每…

vue3点击按钮el-dialog对话框不显示问题

vue3弹框不显示问题,控制台也没报错 把 append-to-body:visible.sync"previewDialogOpen" 改为 append-to-bodyv-model"previewDialogOpen" 就好了。

wordpress使用相关

这里写目录标题 遇到的相关问题WordPress安装插件过程中遇到需要ftp出现确实XMLReader 插件的提示cURL Support Missing(curl 缺失) 遇到的相关问题 WordPress安装插件过程中遇到需要ftp 一般在这个位置 出现确实XMLReader 插件的提示 解决&#xff1a…

21.3D surface

3D surface """ File : 05-decoding-Major Name : 3d_surface.py Author : lyq Date : 2024/11/16 23:10 Envi : PyCharm Description: files details """ import numpy as np import matplotlib.pyplot as plt# 设置全局默认字体…

ARM(安谋) China处理器

0 Preface/Foreword 0.1 参考博客 Cortex-M23/M33与STAR-MC1星辰处理器 ARM China,2018年4月established,独立运行。 1 处理器类型 1.1 周易AIPU 1.2 STAR-MC1(星辰处理器) STAT-MC1,主要为满足AIOT应用性能、功…

windows C#-异步编程概述(二)

不要阻塞,而要等待 上述代码演示了一种不好的做法:构建同步代码来执行异步操作。正如所写,此代码会阻止执行它的线程执行任何其他工作。在任何任务正在进行时,它都不会被中断。这就像你把面包放进去后盯着烤面包机一样。你会忽略…

【Android原生问题分析】夸克、抖音划动无响应问题【Android14】

1 问题描述 偶现问题,用户打开夸克、抖音后,在界面上划动无响应,但是没有ANR。回到Launcher后再次打开夸克/抖音,发现App的界面发生了变化,但是仍然是划不动的。 2 log初分析 复现问题附近的log为: 用户…

【STM32】MPU6050简介

文章目录 MPU6050简介MPU6050关键块带有16位ADC和信号调理的三轴MEMS陀螺仪具有16位ADC和信号调理的三轴MEMS加速度计I2C串行通信接口 MPU6050对应的数据手册:MPU6050 陀螺仪加速度计 链接: https://pan.baidu.com/s/13nwEhGvsfxx0euR2hMHsyw?pwdv2i6 提取码: v2i6…