计网第五章(运输层)(五)(TCP拥塞控制)
目录
一、基本概念
二、拥塞控制算法
慢开始:
拥塞避免:
快重传:
快恢复:
一、基本概念
若对网络中某一资源的需求超过了该资源所能提供的可用部分(供不应求),网络性能就会变坏。
在计算机网络中的带宽、交换节点中的缓存和处理机等都是网络的资源。
如果出现拥塞而不控制,整个网络的吞吐量(单位时间内从网络输出的分组数量)会随着输入负荷的增大而下降。
就好像交通堵塞一样,公路就相当于网络资源,当车(相当于分组)过多时就会出现交通堵塞,自然就会出现到达目的地的时间变长甚至无法移动等。
在上一节提到,发送窗口的值实际是在发送方自身的拥塞窗口的值和接收方的接收窗口的值之间取较小者。
在本篇博客中,假设接收方一直有足够的缓存空间,即发送方的发送窗口由网络拥塞程度来决定。
假设A为发送方,B为接收方。发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化。
拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,窗口值就会再增大一些,出现拥塞就减小一些。
判断是否出现拥塞的依据:没有按时收到应当到达的确认报文。(即发生了超时重传)。
发送方将拥塞窗口作为发送窗口swnd。
维护一个慢开始门限ssthresh状态变量。
当swnd < ssthresh时,使用慢开始算法。
当swnd > ssthresh时,停止使用慢开始算法,开始使用拥塞避免算法。
当swnd = ssthresh时,慢开始算法和拥塞避免算法都可以使用。
二、拥塞控制算法
在讨论拥塞控制时,以最大报文段MSS的个数为讨论问题的单位,而不是以字节为单位。
慢开始:
慢开始算法就是在达到慢开始门限ssthresh前,拥塞窗口值在每个轮次之后增加一倍,又因为拥塞窗口和发送窗口值相等,所以每个轮次发送窗口发送的报文段都是上个轮次的2倍。
即窗口值呈指数级增长。
“慢开始”指的是一开始向网络注入的报文段较少,并非指增长速度慢。
就好像跑步,可能刚开始比较慢,然后越来越快。
拥塞避免:
当达到慢开始门限值之后,开始使用拥塞避免算法,拥塞窗口值每个轮次之后增加1,
即窗口值呈线性增长。
在某一轮次发送方发送的报文段引起超时重传时,发送方就会判断可能发生了网络拥塞。于是就会进行以下操作:
首先将慢开始门限值缩小为发生拥塞时拥塞窗口值的一半。随后将拥塞窗口值减小为1,并重新开始慢开始算法。
“拥塞避免”是指将拥塞窗口控制为线性增长,使得网络比较不容易出现拥塞。
有时引发超时重传只是报文段在传输过程中丢失,并非是网络出现了拥塞,而因为引发发送方超时重传导致发送方误认为发生了网络拥塞。这时候重新启动慢开始算法必然会导致传输效率降低。于是就有了以下两种算法的出现。
快重传:
快重传算法采取的措施是可以让发送方尽早知道发生了个别报文段的丢失。这样发送方可以尽快进行重传,而并不是等待重传计时器超时后再重传。
这里就要求接收方不要等待自己发送数据时才捎带确认,而是立即发送确认。如果收到了失序的报文段,也要立即发出对已收到的报文段的重复确认。(注意:如果收到失序的报文段,接收方会先将其缓存下来,等待连续的报文段到达后,再按顺序处理。在之前总结TCP和UDP的对比时,也有提到使用TCP协议时,接收方从接收到的报文段中取出数据载荷部分并存储在接收缓存中,同时将接收缓存中的一些字节交付给上层。这里就很明显体现了这一点)
发送方一旦收到3个连续的重复的确认后,就对相应的报文段立即进行重传。
快恢复:
在发送方收到3个连续的重复的确认后,就知道现在只是丢失了个别报文段,于是执行快恢复算法。
这时候发送方会将慢开始门限值和拥塞窗口的值都降为当前窗口值的一半,随后进行拥塞避免算法。
总结:最开始只有慢开始和拥塞避免算法,在出现超时重传时,会被误判为网络拥塞。但是实际上可能只是个别报文段丢失,所以为了提高TCP的性能,出现了快重传和快恢复两个算法。它们两个就像泡面和火腿。快重传使得发送方收到三个重复确认后可以尽快进行重传,不用等到重传计时器超时后再重传。这时候发送方就知道并未发生网络拥塞,于是执行快恢复操作。
超时重传引起的操作是慢开始门限值降为当前窗口值的一半,拥塞窗口值变为1,随后重新启动慢开始算法。
但是快恢复是慢开始门限值和拥塞窗口值都变为当前窗口值的一半,并且随后执行拥塞避免算法。
相关文章:
计网第五章(运输层)(五)(TCP拥塞控制)
目录 一、基本概念 二、拥塞控制算法 慢开始: 拥塞避免: 快重传: 快恢复: 一、基本概念 若对网络中某一资源的需求超过了该资源所能提供的可用部分(供不应求),网络性能就会变坏。 在计算…...

windows/ubuntu怎么修改hosts文件
windows系统修改方法: 第一步:用管理员权限打开记事本,或者visual studio。 第二步:用记事本或者vs打开地址C:\Windows\System32\drivers\etc\hosts文件,这个时候就可以直接修改了 Ubuntu22 LTS系统修改方法…...
(日积月累版)大数据基础知识点1-关系型数据库
好久不见,甚是想念。 笔者最近有时间整理关于大数据的一些基础知识点,整理的目不在于能提升多少技能,关键在于巩固一些很基础的知识点,毕竟互联网就是基础略稳固的人比较有优势,在遇到或发现一些技术问题时,…...
【开心消消乐】python实现-附ChatGPT解析
1.题目 开心消消乐 知识点编程基础:深搜、广搜 时间限制: 1s 空间限制: 256MB 限定语言:不限 题目描述: 给定一个N行M列的二维矩阵,矩阵中每个位置的数宁取值为0或1。矩阵示例如: 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的1进行反转为0,规则如下: 1)、当点击一…...
springBoot源码汇总
SpringFactoriesLoader 示例位置 SpringApplication#getSpringFactoriesInstances 加载spring.factroies下的初始化类 ClassLoader classLoader this.getClassLoader();Set<String> names new LinkedHashSet(SpringFactoriesLoader.loadFactoryNames(type, classLoade…...
代码随想录二刷day39
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、力扣62. 不同路径二、力扣63. 不同路径 II 前言 一、力扣62. 不同路径 class Solution {public int uniquePaths(int m, int n) {int[][] dp new int[m][…...

Spring面试题7:面试官:Spring是如何进行异常处理的呢?
该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring是如何进行异常处理的呢? Spring通过异常处理机制来处理应用程序中的异常。它提供了多种方式来处理异常,包括以下几种: 声明式事务管理:…...

华为云云耀云服务器L实例评测|搭建您的私人影院网站
前言 本文为华为云云耀云服务器L实例测评文章,测评内容是云耀云服务器L实例搭建在线视频网站,大家可以将这个网站作为私人影院或是分享给朋友,但是尽量不要更广的传播,因为这涉及到版权问题 系统配置:华为云 2核2G 3M…...

Solidity 小白教程:22. Call
Solidity 小白教程:22. Call 这一讲我们将介绍如何利用 Call 调用合约。 Call call 是address类型的低级成员函数,它用来与其他合约交互。它的返回值为**(bool, data),分别对应call**是否成功以及目标函数的返回值。 call是solidity官方推…...

mySQL 安装
一、windows安装包下载 mysql官网提供了两种安装方式,一个是zip安装,另一个是msi安装,这里简绍第一种安装方式,第二种简单,不再简绍 官网下载,根据自己需要选择版本:MySQL :: MySQL Community…...

涛然自得周刊(第 10 期):搬到海岛生活是一种什么体验
作者:何一涛 日期:2023 年 9 月 24 日 涛然自得周刊主要精选作者阅读过的书影音内容,周末发布。历史周刊内容可以看这里。 影音 《德雷尔一家》是一部根据书籍《希腊三部曲》改编的英剧,共 4 季,每一季豆瓣评分都超…...

pycharm中恢复原始界面布局_常用快捷键_常用设置
文章目录 1 恢复默认布局1 .1直接点击file→Manage IDE Settings→Restore Default Settings(如下图所示):1.2 直接点击Restore and Restart, 然后Pycharm就会自动重启,重启之后的界面就是最原始的界面了 2 改变主题2.…...
docker(7):实战--安装nginx并实现反向代理
基本概念 反向代理:客户端向反向代理的命名空间中的内容发送普通请求,接着反向代理将推断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。 负载均衡:当请求过多,单个服务器难以负荷…...
day-61 代码随想录算法训练营(19)一刷完结撒花
短短60天过的很快,但是让我养成了写博客的习惯。在训练营学到了挺多不同的思路,跟录友们的交流也使我受益良多。 我的感觉是,一道题没有思路的时候,要及时去看题解;毕竟是应试,第一次做的时候,没…...

C#中对泛型集合元素使用List.Sort()方法排序
啊!终于整明白了! 今天拿出一点时间研究了一下C#的List<T>如何排序,基本上整明白了。很多场景下,用这个排序还是很方便的。 //构造一个类 public class mth{//编号private string id;public string Id{get { return id; …...

【项目】在线音乐播放器测试报告
目录 项目背景 项目功能 测试计划 功能测试 登录页面的测试 测试用例 测试结果 注册页面的测试 测试用例 测试结果 音乐列表页面的测试 测试用例 测试结果 出现的bug 搜索功能的bug 问题解决 删除功能的bug 问题解决 喜欢列表页面的测试 测试用例 测试结果…...

[C++ 网络协议] 多线程服务器端
具有代表性的并发服务器端实现模型和方法: 多进程服务器:通过创建多个进程提供服务。 多路复用服务器:通过捆绑并统一管理I/O对象提供服务。 多线程服务器:通过生成与客户端等量的线程提供服务。✔ 目录 1. 线程的概念 1.1 为什…...

宝塔部署node后使用pm2管理上传文件路径失效问题
如何进行文件上传? node上传文件 vue3 elementPlus 组件封装 在本地或者以宝塔终端的形式允许 上传后是没问题的,直接默认对multer直接写入路径就可以了 const multer require(multer) const upload multer({ dest: ./public/avataruploads/ }) …...

postman-pre-request-scripts使用
一、场景 二、定义模拟接口 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using SaaS.Framework.DataTransfer; using System.Threading.Tasks;namespace SaaS.KDemo.Api.Controllers {[Route("api/[co…...

uniapp Echart X轴Y轴文字被遮挡怎么办,或未能铺满整个容器
有时候布局太小,使用echarts,x轴y轴文字容易被遮挡,怎么解决这个问题呢,或者是未能铺满整个容器。 方法1: 直接设置 containLabel 字段 options: { grid: { containLabel: true, },} 方法2: 间接设置,但是…...

利用最小二乘法找圆心和半径
#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...