计算机网络学习笔记:TCP流控、拥塞控制

文章目录

  • 前言
  • 一、TCP流量控制
    • 1.1、案例:三次流量控制
    • 1.2、持续计时器
  • 二、TCP拥塞控制
    • 2.1、拥塞控制的指标
    • 2.2、慢开始算法和拥塞避免算法
    • 2.3、快重传算法和快恢复算法
    • 2.4、练习
  • 三、TCP拥塞控制与网际层拥塞控制
  • 总结


前言

  TCP协议中的流量和拥塞,是两个关键的控制指标,两者的侧重点也是不一样的:

  • 流量控制:侧重于控制点对点通信中发送方与接收方的流量,保证发送方的发送速率不高于接收方的接收速率,避免接收方的缓存溢出。
  • 拥塞控制:侧重于控制全局网络中的主机,路由器,按照拥塞控制算法,自行控制发送速率。防止过多的数据注入到网络中,使网络可以承受现有的负荷。

一、TCP流量控制

  流量控制的目的,是为了避免发送方的发送速率高于接收方的接收速率,具体是接收方根据自己的接收能力,控制发送方的发送速率。
  控制手段则是通过发送方的发送窗口swnd(s:send)和接收方的接收窗口rwnd(r:receive)

1.1、案例:三次流量控制

  TCP流量控制的过程,假设我有A和B两台主机,A是发送方,B是接收方。那么在建立连接时,B应该通知A,自己的接收窗口是多少,A相应地将自己的发送窗口也设置相同的大小:
在这里插入图片描述
  A发送出第一个报文段,对应的是1-100:
在这里插入图片描述
  A发送出第二个报文段,对应的是101-200:
在这里插入图片描述
  发送第三个报文段,丢失:
在这里插入图片描述
  主机B给主机A发送累计确认报文段,对seq为201之前的数据进行累计确认
在这里插入图片描述
  在累计确认的同时,接收方通知发送方,自己的rwnd大小发生了变更,则发送方在将自己发送数据的滑动窗口向前滑动时,也要将自己的swnd同步变更,当前的rwnd和滑动窗口如图所示,这是第一次流量控制的体现
在这里插入图片描述
  随后发送301~500的数据。
在这里插入图片描述
  201到300的重传计时器超时了,主机A将其重新封装成一个TCP报文段进行发送,主机B发送一个确认报文段,同时调整自身的接收窗口为100:
在这里插入图片描述
  这是第二次流量控制的体现
在这里插入图片描述
  最后发送501~600的数据,并且接收方进行确认,并进行最后一次流量控制,将rwnd设置为0,表示不再接受数据,有可能是因为接收方的缓存区已满。
在这里插入图片描述
  上述的过程,就是一次完整的流量控制。

1.2、持续计时器

  接着上面的案例,假设最后一次流量控制之后,接收方B处理完成了数据,缓存区又有了空间,准备继续接收发送方A的数据,这时B需要再次对A进行流量控制,将自身的rwnd调整至300:
在这里插入图片描述
  但是消息在发送的过程中丢失了,那么就会出现A一直等待B的非零窗口通知,B一直等待A发送消息,造成通信死锁的情况。
  为了解决这样的问题,TCP给每一个连接都设置了一个持续计时器,并且规定,即使接收窗口值为0,也必须接受零窗口探测报文段,确认报文段以及携带有紧急数据的报文段

在这里插入图片描述
在这里插入图片描述

二、TCP拥塞控制

  网络拥塞问题是指网络中传输的数据过多,超过了网络设备(如路由器、交换机)或链路的处理能力,导致网络性能下降的现象。就像高峰期的马路:

  • 如果车(数据包)太多,马路(网络)就会堵;
  • 堵车后,不仅原来开的慢,新车也进不来;
  • 严重时还可能发生车辆回退(丢包)、绕路(重传)甚至“交通瘫痪”(网络崩溃)。

  如果不加以控制,导致的就是整个网络的崩溃,类似于微服务的雪崩
在这里插入图片描述
  拥塞控制的基本方法,分为开环控制闭环控制

  • 开环控制侧重于从设计的角度避免出现拥塞的问题,前提是要提前知道进行控制的网络的参数和流量。
  • 闭环控制侧重于从运行时的角度避免拥塞的问题,即对于网络进行监控,及时接受反馈并且调整。

在这里插入图片描述
  闭环控制,又可以分为显式控制算法隐式控制算法

  • 显式控制算法指的是,路由器向源点反馈网络的拥塞状态,即路由器拥塞,丢弃IP数据报,并且通知源站,通知同样需要利用网络通信,通知的行为,可能会造成网络更加拥堵。可以在路由器的转发分组中,保留一个字段,该字段的值表示网络的拥塞状态。
  • 隐式控制算法指的是,源站点自己对网络的指标进行观察,判断网络是否发生拥塞。TCP使用的就是隐式控制算法

在这里插入图片描述

2.1、拥塞控制的指标

  对于发送方而言,指标有发送窗口swnd(s:send),拥塞窗口cwnd(c:crowded),对于接收方而言,指标有接收窗口rwnd(r:reveive)
  只有序号落入swnd的数据,发送方才可以进行发送,swnd的取值,是cwnd和rwnd的最小值。
  rwnd用于控制流量,cwnd用于控制拥塞
在这里插入图片描述
在这里插入图片描述

2.2、慢开始算法和拥塞避免算法

  慢开始算法拥塞避免算法,通常配合使用,这里加入了一个ssthresh慢开始门限的指标
在这里插入图片描述
  使用慢开始算法和拥塞避免算法组合时,首先运用的是慢开始算法将cwnd进行逐次指数累加,直到到达ssthresh的值:
在这里插入图片描述
  然后改用拥塞避免算法每个轮次cwnd的值只能 + 1,而不像慢开始算法,可以指数增长,当发生了重传和报文段丢失的情况,说明网络中出现了拥塞,就需要调整拥塞窗口cwnd和ssthresh的值,然后重新执行慢开始算法

  1. ssthresh的值调整为发生拥塞时,拥塞窗口cwnd值的一半。
  2. cwnd的值重置为1。

在这里插入图片描述
  最终的曲线如下:
在这里插入图片描述

2.3、快重传算法和快恢复算法

  快重传算法快恢复算法是对于慢开始算法拥塞避免算法的改进。因为后者可能会存在一个问题,也就是如果路由器是因为请求出现了误码,才将其丢弃**(非网络出现拥塞)**,源站是无法判断这种情况的,会将cwnd的值重置为1重新开始,降低了效率。
  快重传算法的目的是让发送方尽快知道TCP报文段的丢失,从而尽快地进行重新传输,就要求接收方在收到消息后,立刻进行ack。
在这里插入图片描述
  如下图,如果TCP没有接收到3号报文段,就会在后续报文段到达时,**发送对未收到报文段的重复确认。**当发送方接收到3次重复确认后,就对丢失的报文进行立刻重传(接收方在接收到M4后,发现M3并没有接收到,于是重复确认M2,重复确认M2到达3次后,发送方立刻重传M2)
在这里插入图片描述
  当发送方接收到3次重复确认后,同时也会执行快恢复算法 + 拥塞避免算法

  1. ssthresh的值调整为cwnd值的一半。
  2. cwnd的值调整为cwnd值的一半。

在这里插入图片描述
  最终的曲线如下图:
在这里插入图片描述
在这里插入图片描述

2.4、练习

在这里插入图片描述
  这道题的答案是C。拥塞窗口为16KB时发生了超时,那么此时的指标:

  • ssthresh:16/2 = 8
  • cwnd:1

  然后重新使用慢开始算法

RTTcwnd
12
24
38(到达了ssthresh,转换为拥塞避免算法
48 + 1 = 9

在这里插入图片描述
  这道题的答案是A。同样地,拥塞窗口为8KB时发生了超时,那么此时的指标:

  • ssthresh:8/2 = 4
  • cwnd:1

  然后重新使用慢开始算法

RTTcwnd
12
24(到达了ssthresh,转换为拥塞避免算法
35
46
57
1012

  这一题比上一题多了一个考察点,发送窗口swnd 是 rwnd 和 cwnd 的较小值。 min(12,10)= 10。


在这里插入图片描述
  这道题的答案选A:
在这里插入图片描述

三、TCP拥塞控制与网际层拥塞控制

  与运输层TCP拥塞控制相关的,是网际层路由器对于IP数据报的丢弃策略。由于路由器的缓存队列是标准的“先进先出”的结构,队列已满,则会丢弃最后的元素。
  当多个发送行为触发尾部丢弃时,这些发送方都会进入慢开始状态,称为全局同步,会导致同一时刻网络流量的骤降,以及之后的持续增高。
  为了避免这样的问题,提出了主动队列管理的概念,其核心思想在于避免出现路由器缓存队列已满的情况,当队列长度达到某个阈值时,就触发丢弃策略:
在这里插入图片描述
在这里插入图片描述

总结

在这里插入图片描述

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

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

相关文章

【Linux】Tomcat搭建

前言 Tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 JSP JSP是一种跨平台的动态网页技术标准,可以…

Ajax 核心知识点全面总结

文章目录 Ajax 核心知识点全面总结一、Ajax 基础概念1、定义2、核心特点 二、Ajax 工作原理与核心组件1、工作流程2、XMLHttpRequest(XHR)对象 三、Ajax 请求方法与参数1、常见请求方法2、请求参数处理 四、Ajax 异步与错误处理1、异步处理2、错误处理 五…

SpinFlowSim:用于癌症组织学信息驱动的扩散MRI微血管映射的血流模拟框架|文献速递-深度学习医疗AI最新文献

Title 题目 SpinFlowSim: A blood flow simulation framework for histology-informeddiffusion MRI microvasculature mapping in cancer SpinFlowSim:用于癌症组织学信息驱动的扩散MRI微血管映射的血流模拟框架 01 文献速递介绍 在扩散磁共振成像&#xff08…

量化面试绿皮书:21. 抛硬币游戏

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。 21. 抛硬币游戏 两个赌徒正在玩一个抛硬币游戏。 赌徒A有(n1)枚均匀硬币,赌徒B有n枚均匀硬币。 Q: 如果两人同时抛掷所有硬币&a…

OpenLayers 框架体系

注:当前使用的是 ol 9.2.4 版本,天地图使用的key请到天地图官网申请,并替换为自己的key OpenLayers框架组织结构庞大,只通过官网API进行查看,对框架结构缺少一个整体、全面的看法。借助树形结构图或思维导图&#xff0…

缓存系统-基本概述

目录 一、系统概述 二、名词解释 三、淘汰策略 1、LRU 2、LFU 3、FIFO 4、TTL 5、Random 四、读写模式 1、Cache Aside(旁路缓存) 2、Write Through(直写) 3、Write Back(回写) 五、问题方案 …

基于GNU Radio Companion搭建的BPSK收发通信实验

目录 一、实验目的和要求 二、实验内容 1.Lab5 仿真设计一个BPSK的数字收发射系统 Lab6 实际使用RTLSDR解调BPSK信号 一、实验目的和要求 1.了解软FM的工作方式和原理,数字通信的码间串扰及星座图 2.掌握并正确使用RTL-SDL硬件和Gnuradio软件 3.正确使用Gnraduo软件,建…

华为OD机试-返回矩阵中非1的元素、个数/数值同化-BFS(JAVA 2025B卷)

import java.util.*;/*** author 308413* version Ver 1.0* date 2025/6/18* description 返回矩阵中非1的元素*/ public class Non1ElementInMatrix {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int N scanner.nextInt();int M scan…

Redis学习笔记——黑马点评 消息队列25-30

前言: 学习收获: Redis消息队列: 消息队列(Message Queue),字面意思就是存放消息的队列。最简单的消息队列包括3个角色: 消息队列:存储和管理消息,也被称为消息代理生…

基于Django+Vue3的草莓病害检测系统设计与实现,Web前后端分离,YOLOv8 Web目标检测系统

这里写自定义目录标题 基于DjangoVue3的草莓病害检测系统 基于DjangoVue3的草莓病害检测系统 本项目结合 YOLOv8 与 Django Vue3 ,构建了一个通用的 Web 前后端系统,便于用户进行目标检测的操作和展示,实现对图片、视频实时目标检测和摄像头…

【MFC】树控件的使用详解

目录 添加线条链接 添加折叠小按钮 设置树控件的节点和对应的图标 设置默认选中项 设置选中项切换响应函数 涉及接口介绍: 首先我们通过资源视图可以添加一个树形控件,如下: 添加线条链接 在树形控件中,有一个属性“Has…

跨境卖家警报。抽绳背包版权案立案,TRO在即速排查

近日Shenzhenshi Jingyida Trading Co., LTD委托律所Dewitty And Associates, Chtd.对其热销的抽绳设计多功能运动背包发起跨境版权维权,保护范围涵盖产品外观设计。 案件基本情况: 起诉时间:2025-6-12 案件号:25-cv-06509 原…

Android Activity全面解析:从创建到生命周期的完整指南

Activity作为Android四大组件之一,是构建用户界面的核心单元。笔者通过郭霖著的第一行代码入门安卓,内容基本都取自书中,这篇博客作为笔者的笔记同时精简了一些书中内容分享在csdn中 一、Activity的创建与基础配置 1.1 创建Activity的基本步…

深入理解 Python 的 secrets 模块:打造更安全的随机数生成机制

深入理解 Python 的 secrets 模块:打造更安全的随机数生成机制 在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”。安全问题的核心之一在于“随机性”——尤其是密码、验证码、Token、Session、API Key 的…

CHAPTER 19 Concurrency Models in Python

一、A Bit of Jargon 1、关键术语解析 1.1 并发 (Concurrency) 定义: 并发是指同时处理多个待处理任务的能力,这些任务可以依次或并行(如果可能)进行,最终每个任务都会成功或失败。 理解: 单核 CPU: 即使是单核 CPU 也可以实…

DCM4CHEE Archive Light 开发环境部署(5)-IDEA集成调试配置

系列文章目录 DCM4CHEE Archive light 开发环境部署(1)-前言DCM4CHEE Archive light 开发环境部署(2)-PostgreSQLDCM4CHEE Archive light 开发环境部署(3)-OpenLDAPDCM4CHEE Archive light 开发环境部署(4)-Wildfly(JBoss)DCM4CHEE Archive light 开发环境部署(5)-IDEA集成…

在rust中执行命令行输出中文乱码解决办法

如果你使用标准的依赖库执行命令中包含中文的话, 就会发现中文乱码,如果你的输出中没有中文,就可以正常输出,因为windows的命令行默认使用的是gbk编码。。。。。 #[tauri::command] pub async fn run_command(command: String) -…

判断当前浏览器卡不卡

方法一:使用 requestAnimationFrame 和时间戳计算平均 FPS let frameCount 0; let lastTime performance.now(); let fps 0; let isSlow false; // 是否卡顿的标志function calculateFPS(currentTime) {frameCount;// 每隔大约 1000 毫秒(1秒&#…

51c嵌入式~电路~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11748634 一、延长电子元器件的货架寿命 本文探讨了电子元器件的货架寿命问题,重点讨论了氧化、湿度敏感等级(MSL)与货架寿命之间的关系。文章通过具体例子说明了氧化对电子元器件可…

Eureka 与 Feign(一)

Eureka 与 Feign 知识解析 1. Eureka Spring Cloud Eureka 是服务发现组件,包含: Eureka Server:注册中心,管理服务实例Eureka Client:服务实例,向注册中心注册/获取服务信息 核心功能: 服…