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

核心机制:流量控制

搭配滑动窗口使用的

窗口大小

窗口越大,传输速度就越快,但是也不能无限大,太大了,对于可靠性会有影响

比如发生方以非常快的速度,发送,接收方的处理速度跟不上,也就会导致有效数据被接受方丢弃(又得重传)

流量控制,就是根据接收方的处理能力(如何衡量?),干预到发送方的发送速度(调整滑动窗口的大小)

应用程序调用 read 之类的操作(scanner.next)

想象成"阻塞队列",如果队列里面没有数据,应用程序在 read 就会阻塞

生产者消费者模型

发送者是生产者,接受方是消费者,通过 TCP 的接受缓冲区,作为中转场地

所谓的"接收方的处理能力"就是接收方应用程序调用 read 的速度(调用 read 有多快,每次 read 多少) 调用 read 的速度和应用程序,代码咋写的 是直接相关的,想要直接衡量 read,还不太容易得

read 到的数据,一定是有序的数据

使用另一个指标来衡量 read 的速度.直接看接受缓冲区的剩余空间的大小

接收 receive, 接受accept

连接 connection 链接 link

TCP 是"有连接" 不是 "有链接"

如果发现水位比较低,就可以认为放水的速度比较快(应用程序 read 的速度比较快)

接受缓冲区的剩余空间大小:以这个指标反向制约发送方的发送速度

在接受方返回 ack 报文的时候,在 TCP 报头中把接受缓冲区剩余空间的大小 数值 ,放到 ack 的报头中,等发送方收到 ack 就知道接收方的处理速度了

发送方收到 ack 之后,就会根据窗口大小,重新设置下一轮 滑动窗口传输数据 窗口大小

16位 = > 64kb

是否意味着,TCP 的滑动窗口大小,最大只能是 64kb??  并不是这样

TCP 在设计的时候,充分的吸取了以前 UDP 的教训,选项中有一个"窗口扩展因子"发送方收到 ack 之后,设置滑动窗口大小 16位窗口大小 << 窗口扩展因子,左移一位相当于 * 2,是指数增长的,这样的窗口大小的取值范围是非常非常大的

一般来说真实的情况是,大概率是一边收到数据,一边消耗数据

4001之后变成了 0 ,主机 A 这边就会暂停发送,队列满了,如果不暂停发送,接下来 A 数据就会被 B 丢掉,这个时候接受缓冲区更像是阻塞队列

A 不给 B 发数据,意味着 B 也就不给 A 返回 ack 了过了一会,主机 B 应用程序消耗了一部分数据

窗口探测包

当窗口大小为 0 的时候, A 只是不发送"业务数据"(TCP 载荷部分非空的数据,携带应用层数据包的数据) 但是 A 仍然会周期性的发送"窗口探测包"

另外 主机 B 也会在接受缓冲区不满的时候给 A 发一个"窗口更新包"

http://www.lryc.cn/news/2398282.html

相关文章:

  • Java中并发修改异常如何处理
  • 极智项目 | 基于PyQT实现的YOLOv12行人目标检测软件设计
  • JavaScript 对象展开语法
  • 简单transformer运用
  • vscode不满足先决条件问题的解决——vscode的老版本安装与禁止更新(附安装包)
  • RustDesk 搭建自建服务器并设置服务自启动
  • 【数据库】数据库恢复技术
  • Qt企业级串口通信实战:高效稳定的工业级应用开发指南
  • 力扣HOT100之动态规划:32. 最长有效括号
  • 深入理解前端DOM:现代Web开发的基石
  • Springboot中Controller接收参数的方式
  • 从一堆数字里长出一棵树:中序 + 后序构建二叉树的递归密码
  • Unity UI 性能优化终极指南 — Image篇
  • Nginx + Tomcat 负载均衡、动静分离群集
  • 【maker-pdf 文档文字识别(包含ocr),安装使用完整教程】
  • c++ algorithm
  • 《前端面试题:BFC(块级格式化上下文)》
  • HertzBeat的告警规则如何配置?
  • 安全-JAVA开发-第一天
  • 6月2日上午思维训练题解
  • 高考数学易错考点01 | 临阵磨枪
  • 【CF】Day69——⭐Codeforces Round 897 (Div. 2) D (图论 | 思维 | DFS | 环)
  • MySQL中的字符串分割函数
  • 前端八股之Vue
  • Matlab数值计算
  • 谷歌地图高清卫星地图2026中文版下载|谷歌地图3D卫星高清版 V7.3.6.9796 最新免费版下载 - 前端工具导航
  • 条形进度条
  • 悟饭游戏厅iOS版疑似流出:未测试版
  • 95. Java 数字和字符串 - 操作字符串的其他方法
  • IBM DB2分布式数据库架构