当前位置: 首页 > news >正文

TCP滑动窗口和流量控制详解

1. 什么是滑动窗口

TCP 每发送⼀个数据,都需要⼀次应答,然后继续发送,这样为每个数据包都进⾏确认应答,缺点是:数据往返时间越⻓,⽹络吞吐量越低。为了解决这个问题,TCP 引⼊了 窗⼝ 这个概念。即使在往返时间较⻓的情况下,它也不会降低⽹络通信的效率。⽽窗⼝的⼤⼩呢,就是⽆需等待确认应答,可以继续发送数据的最⼤值。
假设窗⼝⼤⼩为 3 TCP 段,那么发送⽅就可以「连续发送」 3 TCP 段,并且中途若有 ACK 丢失,可以通过「下⼀个确认应答进⾏确认」。如下图:
窗⼝的实现就是操作系统开辟的⼀个缓存空间,发送⽅主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
图中的 ACK 600 确认应答报⽂丢失,也没关系,因为可以通过下⼀个确认应答进⾏确认,只要发送⽅收到了 ACK700 确认应答,就意味着 700 之前的所有数据「接收⽅」都收到了。这个模式就叫 累计确认或者累计应答

2. 什么决定窗⼝⼤⼩

TCP 头部有⼀个字段叫 window ,窗⼝⼤⼩。
这个字段是接收端告诉发送端⾃⼰还有多少缓冲区可以接收数据。于是发送端就可以根据这个接收端的处理能⼒来 发送数据,⽽不会导致接收端处理不过来
通常窗⼝的⼤⼩是由接收⽅的窗⼝⼤⼩来决定的。
发送⽅发送的数据⼤⼩不能超过接收⽅的窗⼝⼤⼩,否则接收⽅就⽆法正常接收到数据。

3. 发送⽅的滑动窗⼝

下图就是发送⽅缓存的数据,根据处理的情况分成四个部分:
#1 是已发送并收到 ACK 确认的数据: 1 31 字节
#2 是已发送但未收到 ACK 确认的数据: 32 45 字节
#3 是未发送但总⼤⼩在接收⽅处理范围内(接收⽅还有空间): 46 51 字节
#4 是未发送但总⼤⼩超过接收⽅处理范围(接收⽅没有空间): 52 字节以后
下图表示数据全都发送以后,可⽤窗⼝⼤⼩为 0 ,在没收到 ACK 确认应答之前⽆法继续发送数据。
下图,当收到之前发送的数据 32~36 字节的 ACK 确认应答后,如果发送窗⼝的⼤⼩没有变化,则 滑动窗⼝往右边 移动 5 个字节,因为有 5 个字节的数据被应答确认 ,接下来 52~56 字节⼜变成了可⽤窗⼝,那么后续也就可以发送 52~56 5 个字节的数据了。
在收到 32-36 ACK 应答后,如果窗⼝⼤⼩不变,则滑动窗⼝先后移动 5 个字节,那么 52-56 变成可⽤窗⼝,可以继续发送数据。

4. 程序是如何表示发送⽅的四个部分的呢?

TCP 滑动窗⼝⽅案使⽤三个指针来跟踪在四个传输类别中的每⼀个类别中的字节。其中两个指针是绝对指针(指特定的序列号),⼀个是相对指针(需要做偏移)。
  • SND.WND:表示发送窗口的大小(大小是由接收方指定的);

  • SND.UNASend Unacknoleged):是一个绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号,也就是 #2 的第一个字节。

  • SND.NXT:也是一个绝对指针,它指向未发送但可发送范围的第一个字节的序列号,也就是 #3 的第一个字节。

  • 指向 #4 的第一个字节是个相对指针,它需要 SND.UNA 指针加上 SND.WND 大小的偏移量,就可以指向 #4 的第一个字节了。

那么可用窗口大小的计算就可以是:

可用窗口大小 = SND.WND -(SND.NXT - SND.UNA)

已发送未确认 = SND.NXT - SND.UNA)

5. 接收⽅滑动窗⼝

接收窗⼝根据处理的情况划分成三个部分:
  • #1 + #2 是已成功接收并确认的数据(等待应用进程读取);
  • #3 是未收到数据但可以接收的数据;
  • #4 未收到数据并不可以接收的数据;

其中三个接收部分,使用两个指针进行划分:

  • RCV.WND:表示接收窗口的大小,它会通告给发送方。
  • RCV.NXT:是一个指针,它指向期望从发送方发送来的下一个数据字节的序列号,也就是 #3 的第一个字节。
  • 指向 #4 的第一个字节是个相对指针,它需要 RCV.NXT 指针加上 RCV.WND 大小的偏移量,就可以指向 #4 的第一个字节了。

6. 接收窗⼝和发送窗⼝的⼤⼩是相等的吗?

并不是完全相等,接收窗口的大小是约等于发送窗口的大小的。

因为滑动窗口并不是一成不变的。比如,当接收方的应用进程读取数据的速度非常快的话,这样的话接收窗口可以很快的就空缺出来。那么新的接收窗口大小,是通过 TCP 报文中的 Windows 字段来告诉发送方。那么这个传输过程是存在时延的,所以接收窗口和发送窗口是约等于的关系。

7. 什么是TCP流量控制机制

TCP 流量控制(Flow Control)机制是为了防止发送方发送数据过快,导致接收方的缓冲区溢出而设计的一种控制机制。TCP 使用一种被称为“滑动窗口协议”的方法来实现流量控制。

主要概念

  1. 滑动窗口(Sliding Window)

    • 滑动窗口是一种流量控制技术,它允许发送方在等待接收方确认之前发送多个数据包。
    • 窗口大小决定了发送方在等待确认之前可以连续发送的最大数据量。
  2. 接收窗口(Receive Window)

    • 接收窗口(rwnd)是接收方用于通知发送方自己可以接收的数据量。
    • 接收窗口的大小通常由接收方的缓冲区大小决定,接收方会在每次发送确认包时,包含当前的接收窗口大小。
  3. 拥塞窗口(Congestion Window)

    • 拥塞窗口(cwnd)是为了防止网络拥塞而引入的窗口。
    • 拥塞控制是另一个独立的机制,用于调整发送方在网络中实际发送的数据量。

流量控制的工作原理

TCP 流量控制主要依靠接收窗口大小来进行。接收方通过在确认包中包含当前接收窗口大小,来告知发送方自己的接收能力。

1. 接收窗⼝ :接收⽅维护⼀个接收窗⼝,表示可以接收的数据段的范围。窗⼝⼤⼩可以根据接收⽅的处理能⼒进⾏调整。
2. 通告窗⼝⼤⼩ :接收⽅通过 TCP 报⽂中的确认信息,通告当前的接收窗⼝⼤⼩给发送⽅。发送⽅会根据这个窗⼝⼤⼩来控制发送数据的速率。
3. 窗⼝滑动 :随着接收⽅处理数据的能⼒,窗⼝可以向前滑动。接收⽅可以通告更⼤的窗⼝,表示它可以接收更多的数据。
4. 发送速率控制 :发送⽅会根据接收⽅通告的窗⼝⼤⼩来控制发送数据的速率。如果接收窗⼝变⼩,表示接收⽅的处理能⼒减弱,发送⽅会减慢发送速率,避免数据拥塞。
5. 动态调整 TCP 流量控制是动态的,适应⽹络和接收⽅的变化。如果⽹络拥塞或接收⽅的处理速度变慢,流量控制可以适时地减少发送速率。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ChatGPT对话:Windows如何将Python训练模型转换为TensorFlow.js格式
  • R语言画散点图-饼图-折线图-柱状图-箱线图-直方图-等高线图-曲线图-热力图-雷达图-韦恩图(二D)
  • FlutterWeb启动耗时优化
  • MFC:只允许产生一个应用程序实例的具体实现
  • 【AI教程-吴恩达讲解Prompts】第1篇 - 课程简介
  • 浅谈Visual Studio 2022
  • Docker安装笔记
  • 百分点科技携智慧政务解决方案亮相GITEX AFRICA 2024
  • FastAPI 学习之路(五十二)WebSockets(八)接受/发送json格式消息
  • 【VUE】v-if和v-for的优先级
  • Perl与数据库交互:深入理解DBI模块
  • centos(或openEuler系统)安装clickhouse集群
  • MySQL 关键字 IN 与 EXISTS 的使用与区别
  • 前端书籍翻页效果
  • 【proteus经典实战】定时器控制交通灯指示灯
  • 【前端学习】-粗谈选择器
  • avalon2.2的VM生成过程
  • CentOS从零开始部署Nodejs项目
  • css布局,左右固定中间自适应实现
  • download使用浅析
  • Iterator 和 for...of 循环
  • Java深入 - 深入理解Java集合
  • js数组之filter
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • 多线程事务回滚
  • 记一次和乔布斯合作最难忘的经历
  • 那些年我们用过的显示性能指标
  • 使用Swoole加速Laravel(正式环境中)
  • hi-nginx-1.3.4编译安装
  • 数据可视化之下发图实践
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​MySQL主从复制一致性检测
  • ​油烟净化器电源安全,保障健康餐饮生活
  • ######## golang各章节终篇索引 ########
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (回溯) LeetCode 131. 分割回文串
  • (回溯) LeetCode 78. 子集
  • (排序详解之 堆排序)
  • (十三)MipMap
  • (原+转)Ubuntu16.04软件中心闪退及wifi消失
  • (转)linux自定义开机启动服务和chkconfig使用方法
  • (转)为C# Windows服务添加安装程序
  • (转载)跟我一起学习VIM - The Life Changing Editor
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .NET Framework 3.5中序列化成JSON数据及JSON数据的反序列化,以及jQuery的调用JSON
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?