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

JavaEE 第23节 TCP的流量控制与阻塞控制详解

目录

    • 前言(必读)
    • 1、滑动窗口
      • 背景
      • 运行机制
    • 2. 流量控制
      • 作用
      • 实现机制
      • 关键目标
    • 3. 拥塞控制
      • 作用
      • 实现机制
      • 作用
    • 4. 流量控制和拥塞控制的区别
      • 作用对象不同
      • 触发条件不同
      • 控制方式不同
    • 5.总结

前言(必读)

流量控制(Flow Control)拥塞控制(Congestion Control) 是TCP协议中的两个重要机制,虽然它们都涉及到数据流的管理,但它们的作用和处理对象是不同的
如图,两种机制相辅相成,保证数据可靠传输的情况下,实现数据传输效率最大化:
在这里插入图片描述

1、滑动窗口

滑动窗口是TCP进行流量控制的核心机制,了解滑动窗口的运行方式,有助于理解流量控制和阻塞控制。

如果知道什么是滑动窗口,或者暂且不想了解这块内容,当然可以直接跳过。

背景

我们知道TCP协议为了实现传输可靠性,数据发送存在确认应答机制。也就是发送端发送一段数据流,之后进入等待状态,直到接收端接收到数据,把ACK信号传输回发送端,发送端再苏醒发送下一段数据流。

上面这个传输方式虽然确保了传输可靠性,但是几乎牺牲了所有的传输效率。TCP协议虽然相对UDP协议传输速度慢,但是也是要拥有一定传输速度的。
而滑动窗口机制,就是用来解决这个问题的,在此机制作用下,发送端可具有一个可滑动的发送窗口以动态调整数据发送量,接收端也有一个可滑动的接收窗口动态调整数据的接收量,这种方式既可以保证数据可靠传输,又可以提升数据传输效率。

运行机制

假定滑动窗口的大小是20个字节。
如图,深蓝色方框是发送窗口(也就是发送端滑动窗口),紫色方框是可用窗口(用于表示剩余可发送的数据):在这里插入图片描述

  • #1 是已发送并收到 ACK确认的数据:1~31 字节。
  • #2 是已发送但未收到 ACK确认的数据:32~45 字节。
  • #3 是未发送但总大小在接收方处理范围内(接收方还有空间):46~51字节。
  • #4 是未发送但总大小超过接收方处理范围(接收方没有空间):52字节以后。

很快,46~51字节的数据被发送出去了,这时可用窗口就为0了,发送端不能继续发送数据,必须等待发送窗口中至少一个数据接收到ACK,才能继续发送数据:
在这里插入图片描述

又过了一段时间,32~36字节的数据被接收端接收,并发送ACK给到发送端,那么**发送窗口就会开始向右滑动5个字节,此时可用窗口从0变成了5:
在这里插入图片描述
接着继续发送数据,等待接收ACK,然后继续滑动如此反复,实现数据传输。
这里的发送窗口就是“
滑动窗口 **”的运行机制了,接收端滑动窗口的运行机制大体和发送端是一样的,大家可以自行画图尝试。

滑动窗口的大小不是随便设置的!
在流量控制机制中维护着一个 接收窗口 (接收缓冲区),在拥塞控制机制中发送端维护着一个拥塞窗口
滑动窗口的大小(这里特指发送端实际发送窗口大小)=Min(接收窗口大小拥塞窗口大小)。

2. 流量控制

作用

  • 流量控制的目的:
    • 流量控制主要关注对象是数据收发两端。 要求发送方的发送速率不会超过接收方的处理能力。它主要通过限制发送方可以发送的数据量,避免接收方的接收缓冲区溢出,确保接收方能够及时处理接收到的数据。

实现机制

因为流量控制只关心发送端和接收端两端数据处理速度的能力,有时由于双方没有协调好数据的发送量和接收量,就可能出现这种情况:
在这里插入图片描述

当接收端缓冲区已满,接收端会发送ACK报文,ACK报文中的窗口大小这个字段会设置成0,告诉发送端:“接收端已经坚持不住了,暂时不能接收数据了,请等一下在发送数据。”
发送端接收到ACK后,就会暂时把发送窗口的大小调整成0,以此暂停数据发送。
过了一会儿,发送端又会发送一个探测报文(此时接收端已经处理了许多数据,接收缓冲区空间变得充裕 ):在这里插入图片描述
然后接收端返回一个ACK报文,ACK报文中的窗口大小这个字段(在报文中占用2个字节)被设置成了接收端缓冲区剩余空间大小:在这里插入图片描述
最后,发送端根据ACK报文中的窗口大小,判断是否需要调整发送窗口的大小,重新开始发送数据给接收端。

以上就是流量控制的基本流程,通过接收端接收缓冲区剩余控空间大小(接收窗口),限制发送端实际发送窗口的大小。

关键目标

  • 防止数据丢失:通过动态调整发送方的发送速率,避免因接收方处理不过来而丢失数据。
  • 平衡数据流:确保数据流速率与接收方的处理能力相匹配,优化传输效率。

3. 拥塞控制

作用

  • 拥塞控制的目的是防止发送方的发送速率超过网络的承载能力,从而导致网络拥塞。它通过动态调整发送方的发送速率,确保网络不会因为数据流量过大而出现拥塞

实现机制

  • 拥塞窗口(Congestion Window, cwnd)

    • 拥塞控制主要依赖于发送方维护的一个拥塞窗口(不存储在TCP段1中)。这个窗口反映了网络的当前拥塞状况。拥塞窗口的大小根据网络的反馈(如丢包、延迟)动态调整。
  • 拥塞窗口大小控制

在这里插入图片描述
传输轮次:通常用于描述一个数据包从发送端传输到接收端,并从接收端返回确认(ACK)的过程,来回一次就是一个传输轮次。

  • 慢启动(Slow Start):当连接开始或发生超时重传时,拥塞窗口从一个小值开始,并逐步增大(指数增长),以探测网络的可用带宽。
  • 拥塞避免(Congestion Avoidance):当拥塞窗口达到某个阈值后,增速减缓,进入拥塞避免阶段(转变为线性增长),防止发送过多数据导致网络拥塞。
  • 慢启动(Slow Start):当拥塞窗口按照线性增长到达某一个值,导致超时重传2,那么就会重新乘法减小回到慢启动阶段。并且设定从指数增长转变为线性增长的临界值为拥塞窗口最大值除以2。(Tahoe版本

关于拥塞窗口的大小还有一个重要点,当线性增长触发的不是超时重传而是 快速重传3后续不会使用Tahoe版本而是Reno版本

在这里插入图片描述
Reno版本和Tahoe版本的区别就在于下降到的最低点从1,直接改成了原来拥塞窗口峰值大小除以2。其他方面均一致。这实际上也是对TCP协议的一种优化,提高传输效率。

注意:在以前并没有这种优化,不论是快速重传还是超时重传,统一使用的Tahoe版本。

作用

  • 防止网络拥塞:通过检测网络状况(如丢包、延迟等),动态调整发送速率,避免数据流量过大导致网络拥塞。

4. 流量控制和拥塞控制的区别

作用对象不同

  • 流量控制

    • 主要针对发送方接收方,确保发送方的发送速率不超过接收方的处理能力,控制的是收发两端本身。
  • 拥塞控制

    • 主要针对整个网络路径特别是中间路由器和链路,确保发送方的发送速率不超过网络的承载能力。
    • 作用于网络环境,关注的是网络的整体负载状况。

触发条件不同

  • 流量控制

    • 由接收方的缓冲区状况触发。当接收方的缓冲区空间不足时,接收窗口减小,迫使发送方减速或暂停。
  • 拥塞控制

    • 由网络状况触发,如数据包丢失、延迟增加等。当检测到网络拥塞的迹象时,发送方通过调整拥塞窗口来减速。

控制方式不同

  • 流量控制

    • 根据接收端接收窗口大小,限制发送端实际发送窗口大小。
  • 拥塞控制

    • 更具发送端维护的拥塞窗口大小,限制发送端实际发送窗口大小。

5.总结

尽管流量控制和拥塞控制在目的和机制上有所不同,它们共同作用于TCP的数据传输过程:

实际发送窗口大小=Min(拥塞窗口大小接收窗口大小)

它们相辅相成,前者保证接收方不会被数据淹没,后者确保网络不会因过载而失效,从而共同保证数据的可靠传输和网络的高效利用。


  1. TCP段笼统讲就是TCP数据报 ↩︎

  2. 超时重传:发送端发送完一个数据包之后,就会针对这个数据报进行计时,如果在有限的时间内发送端没有得到接收端发送的ACK,那么发送端认为这个数据包丢失了,会重新发送这个数据包给到接收端。 ↩︎

  3. 快速重传:发送端发送一个数据包后,接收端发现并没有受到该数据包(通过序号和确认序号来检查),接收端就会发送“重复ACK”给到接收端,接收端接收到三次这种“重复ACK”就会重新发送该数据包。相比于超时重传,快速重传的严重程度相对小一点。 ↩︎

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 芝法酱学习笔记(0.1)——Ubuntu下,Java开发环境的基本搭建
  • 解锁Python中的人脸识别:Face Recognition库详解与应用
  • jmeter基准测试详解
  • Unity TextMeshPro 设置竖排
  • 常见概念 -- 光回波损耗
  • 快速入门游戏领域,开发游戏需要哪些技术?
  • 数理金融工程毕业之后求职应用方向,量化交易方面如何
  • 深度学习中的常用线性代数知识汇总——第一篇:基础概念、秩、奇异值
  • Android Manifest 权限描述大全对照表
  • 我的第3个AI项目-Advanced RAG with Gemma, Weaviate, and LlamaIndex
  • Windows下使用cmake编译OpenCV
  • Linux脚本实现自动化运维:系统自动备份、资源监控
  • Linux内核线程
  • Metal知识集锦
  • CTK框架(六):服务工厂
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Android系统模拟器绘制实现概述
  • EOS是什么
  • exports和module.exports
  • Java|序列化异常StreamCorruptedException的解决方法
  • JavaScript标准库系列——Math对象和Date对象(二)
  • KMP算法及优化
  • LintCode 31. partitionArray 数组划分
  • ng6--错误信息小结(持续更新)
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • Vue.js 移动端适配之 vw 解决方案
  • Vue官网教程学习过程中值得记录的一些事情
  • 从@property说起(二)当我们写下@property (nonatomic, weak) id obj时,我们究竟写了什么...
  • 分享一份非常强势的Android面试题
  • 官方新出的 Kotlin 扩展库 KTX,到底帮你干了什么?
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 前端之React实战:创建跨平台的项目架构
  • 区块链分支循环
  • 少走弯路,给Java 1~5 年程序员的建议
  • 算法-图和图算法
  • 在electron中实现跨域请求,无需更改服务器端设置
  • 找一份好的前端工作,起点很重要
  • 终端用户监控:真实用户监控还是模拟监控?
  • 7行Python代码的人脸识别
  • const的用法,特别是用在函数前面与后面的区别
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • 大数据全解:定义、价值及挑战
  • 浅谈sql中的in与not in,exists与not exists的区别
  • # AI产品经理的自我修养:既懂用户,更懂技术!
  • # 利刃出鞘_Tomcat 核心原理解析(八)-- Tomcat 集群
  • #《AI中文版》V3 第 1 章 概述
  • #07【面试问题整理】嵌入式软件工程师
  • ()、[]、{}、(())、[[]]命令替换
  • (2024,LoRA,全量微调,低秩,强正则化,缓解遗忘,多样性)LoRA 学习更少,遗忘更少
  • (4) PIVOT 和 UPIVOT 的使用
  • (52)只出现一次的数字III
  • (vue)页面文件上传获取:action地址
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (黑马点评)二、短信登录功能实现