计网第五章(运输层)(五)(TCP拥塞控制)

2023-09-16 15:46:54

目录

一、基本概念

二、拥塞控制算法

慢开始:

拥塞避免:

快重传:

快恢复:


一、基本概念

若对网络中某一资源的需求超过了该资源所能提供的可用部分(供不应求),网络性能就会变坏。

在计算机网络中的带宽、交换节点中的缓存和处理机等都是网络的资源。

如果出现拥塞而不控制,整个网络的吞吐量(单位时间内从网络输出的分组数量)会随着输入负荷的增大而下降。

就好像交通堵塞一样,公路就相当于网络资源,当车(相当于分组)过多时就会出现交通堵塞,自然就会出现到达目的地的时间变长甚至无法移动等。

在上一节提到,发送窗口的值实际是在发送方自身的拥塞窗口的值和接收方的接收窗口的值之间取较小者。

在本篇博客中,假设接收方一直有足够的缓存空间,即发送方的发送窗口由网络拥塞程度来决定。

假设A为发送方,B为接收方。发送方维护一个叫做拥塞窗口cwnd的状态变量,其值取决于网络的拥塞程度,并且动态变化。

拥塞窗口cwnd的维护原则:只要网络没有出现拥塞,窗口值就会再增大一些,出现拥塞就减小一些。

判断是否出现拥塞的依据:没有按时收到应当到达的确认报文。(即发生了超时重传)。

发送方将拥塞窗口作为发送窗口swnd。

维护一个慢开始门限ssthresh状态变量。

当swnd < ssthresh时,使用慢开始算法。

当swnd > ssthresh时,停止使用慢开始算法,开始使用拥塞避免算法。

当swnd = ssthresh时,慢开始算法和拥塞避免算法都可以使用。

二、拥塞控制算法

在讨论拥塞控制时,以最大报文段MSS的个数为讨论问题的单位,而不是以字节为单位。

慢开始:

慢开始算法就是在达到慢开始门限ssthresh前,拥塞窗口值在每个轮次之后增加一倍,又因为拥塞窗口和发送窗口值相等,所以每个轮次发送窗口发送的报文段都是上个轮次的2倍。

即窗口值呈指数级增长。

“慢开始”指的是一开始向网络注入的报文段较少,并非指增长速度慢。

就好像跑步,可能刚开始比较慢,然后越来越快。

拥塞避免:

当达到慢开始门限值之后,开始使用拥塞避免算法,拥塞窗口值每个轮次之后增加1,

即窗口值呈线性增长。

在某一轮次发送方发送的报文段引起超时重传时,发送方就会判断可能发生了网络拥塞。于是就会进行以下操作:

首先将慢开始门限值缩小为发生拥塞时拥塞窗口值的一半。随后将拥塞窗口值减小为1,并重新开始慢开始算法。

“拥塞避免”是指将拥塞窗口控制为线性增长,使得网络比较不容易出现拥塞。

有时引发超时重传只是报文段在传输过程中丢失,并非是网络出现了拥塞,而因为引发发送方超时重传导致发送方误认为发生了网络拥塞。这时候重新启动慢开始算法必然会导致传输效率降低。于是就有了以下两种算法的出现。

快重传:

快重传算法采取的措施是可以让发送方尽早知道发生了个别报文段的丢失。这样发送方可以尽快进行重传,而并不是等待重传计时器超时后再重传。

这里就要求接收方不要等待自己发送数据时才捎带确认,而是立即发送确认。如果收到了失序的报文段,也要立即发出对已收到的报文段的重复确认。(注意:如果收到失序的报文段,接收方会先将其缓存下来,等待连续的报文段到达后,再按顺序处理。在之前总结TCP和UDP的对比时,也有提到使用TCP协议时,接收方从接收到的报文段中取出数据载荷部分并存储在接收缓存中,同时将接收缓存中的一些字节交付给上层。这里就很明显体现了这一点

发送方一旦收到3个连续的重复的确认后,就对相应的报文段立即进行重传。

快恢复:

在发送方收到3个连续的重复的确认后,就知道现在只是丢失了个别报文段,于是执行快恢复算法。

这时候发送方会将慢开始门限值和拥塞窗口的值都降为当前窗口值的一半,随后进行拥塞避免算法。

总结:最开始只有慢开始和拥塞避免算法,在出现超时重传时,会被误判为网络拥塞。但是实际上可能只是个别报文段丢失,所以为了提高TCP的性能,出现了快重传和快恢复两个算法。它们两个就像泡面和火腿。快重传使得发送方收到三个重复确认后可以尽快进行重传,不用等到重传计时器超时后再重传。这时候发送方就知道并未发生网络拥塞,于是执行快恢复操作。

超时重传引起的操作是慢开始门限值降为当前窗口值的一半,拥塞窗口值变为1,随后重新启动慢开始算法。

但是快恢复是慢开始门限值和拥塞窗口值都变为当前窗口值的一半,并且随后执行拥塞避免算法。

更多推荐

数据分析:利用gpt进行归因分析

prompt:你是某电商平台的一名数据分析师,发现昨日的GMV环比下降了5%,请对这数据变动做出归因。output:在电商行业中,GMV(总销售额)是一个非常重要的指标,用于衡量业务的整体健康状况。当GMV出现环比下降时,这通常意味着需要进行详细的分析以找出可能的原因。以下是一些可能导致GMV环比下降5%的因素,以及如

50行Python代码实现代理服务器的详细教程

代理服务器是一种位于客户端与目标服务器之间的中间服务器,它可以代表客户端发送请求,并将响应返回给客户端。通过搭建自己的代理服务器,我们可以实现请求的拦截、修改和转发等功能。本文将为大家介绍如何使用50行Python代码实现代理服务器。一、准备工作在开始之前,我们需要确保已经安装了以下库:socket:用于创建套接字和网

Canal 实现MySQL与Elasticsearch7数据同步

1工作原理canal模拟MySQLslave的交互协议,伪装自己为MySQLslave,向MySQLmaster发送dump协议MySQLmaster收到dump请求,开始推送binarylog给slave(即canal)canal解析binarylog对象(原始为byte流)优点:可以完全和业务代码解耦,增量日志订阅

百度APP iOS端包体积50M优化实践(六)无用方法清理

一、前言百度APP包体积经过一期优化,如无用资源清理,无用类下线,Xcode编译相关优化,体积已经有了明显的减少。但是优化后APP包体积在iPhone11上仍有350M的空间占用。与此同时百度APP作为百度的旗舰APP,业务迭代非常多且迅速,体积优化和防劣化仍然是当前阶段的一个核心任务。因此百度APP开启了粒度更小,修

php生成二维码合成文字、背景图并保存本地图片

目录1、实现效果,二维码二维码合成文字、背景图2、下载并引入qrcode3、创建static文件夹下载字体和背景图到这4、创建test2.php,合成代码1、实现效果,二维码二维码合成文字、背景图2、下载并引入qrcode1、到phpqrcpde官网下载类库,官网地址:http://phpqrcode.sourcefo

【错误记录】IntelliJ IDEA 打包包含依赖库的 Jar 包执行报错 ( Invalid signature file digest for Manifest main attribute )

文章目录一、报错信息二、解决方案博客总结:核心报错信息如下:Error:AJNIerrorhasoccurred,pleasecheckyourinstallationandtryagainExceptioninthread“main”java.lang.SecurityException:Invalidsignatu

mmap使用测试

mmap使用测试Linux系统调用mmap()api说明,这个系统函数在频繁读写文件是很高效。mmap在调用进程内开辟一块内存空间,将文件(或文件部分)内容映射到调用的进程的虚拟空间中。进程通过操作这块mmap开辟的虚拟内存,就相当于直接操作文件本身了,其余的细节都由kernel,cpu中的mcu负责完成。这样与传统的

【LeetCode每日一题】——面试题10.11.峰与谷

文章目录一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时间频度】九【代码实现】十【提交结果】一【题目类别】排序二【题目难度】中等三【题目编号】面试题10.11.峰与谷四【题目描述】在一个整数数组中,“峰”是大于或等于相邻整数的元素,相应地,“谷”是小于或等于相邻整

io概述及其分类

一、IO概念•I/O即输入Input/输出Output的缩写,其实就是计算机调度把各个存储中(包括内存和外部存储)的数据写入写出的过程;I:InputO:Output通过IO可以完成硬盘文件的读和写。•java中用“流(stream)”来抽象表示这么一个写入写出的功能,封装成一个“类”,都放在http://java.i

PyTorch深度学习实战(13)——可视化神经网络中间层输出

PyTorch深度学习实战(13)——可视化神经网络中间层输出0.前言1.可视化特征学习的结果2.可视化第一个卷积层的输出3.可视化不同网络层的特征图小结系列链接0.前言随着深度学习的快速发展,神经网络已成为解决各种复杂任务的重要工具。然而,神经网络的黑盒特性使得我们对其内部运作过程和学到的表示仍然不够了解。为了更好地

spring并发读写数据库

spring并发读写数据库多线程写入数据库,事物通过AOP控制,无需影响业务代码存在几个小问题还不太理解有大佬看懂了麻烦点拨一下有好的优化代码思路欢迎交流代码当前仓库不能公开,代码下载文章目录spring并发读写数据库待解决问题基础实现原理单独任务实现通过AOP抽离事物控制的代码待解决问题//如果executor出现问

热文推荐