【网路通信基础与实践番外二】TCP协议的流量控制和拥塞控制以及二者区别和例题

TCP协议是端对端的协议,因此在数据进行传输的过程受发送方,数据通道,接收方三方状态的影响。我们用水龙头来比喻数据发送方,水管来比喻数据通道,水桶来表示数据接收方。

图(a)表示水桶太小,来不及接受注入水桶的水,而传输网络保持畅通,这时只能请求管水龙头的人把水龙头拧小一些,以减缓放水的速率,这就相当于是流量控制。

图(b)表示虽然水桶足够大,但是管道中有很狭窄的地方,使得管道不通畅,水流被堵塞,这种情况反馈到管水龙头的人那里,请求把水龙头拧小一些,以减缓放水的速率,为的减缓水管的堵塞状态,这就相当于是拥塞控制。

一、流量控制

在每一个TCP连接的一侧主机都会有一个socket缓冲区,缓冲区会为每个连接设置接收缓存和发送缓存,当TCP建立连接后,从应用程序产生的数据就会到达接收方的接收缓冲区中,接收方的应用程序并不一定会马上读取缓冲区的数据,他需要等待操作系统分配时间片。如果此时发送方的应用程序产生数据过快,而接收方读取接收缓冲区的数据相对较慢的话,那么接受方中缓冲区的数据就会溢出。

TCP的流量控制本质上是一个速度匹配服务,匹配发送方发送率和接收方的接受速率,避免出现发送方发送过快而接收方接受过慢的情况,从而消除缓冲区溢出的情况。

TCP通过使用一个接收窗口(receive window)来提供流量控制。在TCP报文结构中首部有一个接收窗口变字段,接收端通过向发送端发送报文,报文中就包含了接受窗口变量,接收窗口会给发送方一个指示到底还有多少可用的缓存空间。发送方发送不能超过这个限额的数据,这样发送方会根据接收端的实际接受能力来控制发送到数据量。

那么知道了接收窗口(receive window)之后,它具体是如何用来流量控制呢?

如上图所示,发送端主机会定期向接收端主机发送一个窗口探测包,这个包用于探测接收端主机是否能够接收数据,当接收端的缓冲区一旦面临数据溢出的风险,窗口大小的值也随之被设置为一个更小的值通知到发送端,从而控制数据发送量。

开始的窗口大小设置为3000,发送方每次发送报文长度为1000的报文,当接收端B收到2000-2999的报文之后缓冲区已满,不得不暂停接收数据。然后主机A发送窗口探测包,窗口探测包是一个非常小的字节,然后主机B更新缓冲区接受窗口大小并发送窗口更新通知到主机A,然后主机A再继续发送报文段。在上面的发送过程中,窗口更新通知可能会丢失,一旦丢失发送端就不会发送数据,所以窗口探测包会随机发送,以避免这种情况发生。

二、拥塞控制

有了TCP窗口控制机制之后,使得计算机网络中两个主机之间不再是以单个数据段的形式发送了,而是能够连续发送大量的数据包。但是发送大数据包的时候也面临着例如网络负载、网络拥堵的问题。TCP为了防止这类问题的出现,使用了拥塞控制机制,会在面临网络拥塞时遏制发送方的数据发送。

拥塞控制主要有两种方法:

端到端的控制:因为网络层没有为运输层拥塞控制提供显示支持,IP层不会向端系统提供有关网络拥塞的反馈信息。如果超时或者三次冗余确认就被认为是网络拥塞,TCP会减小窗口的大小,或者增加往返时延来避免。

网络辅助的拥塞控制:在网络辅助的拥塞控制中,路由器会向发送方提供有关网络中拥塞状态的反馈。这种反馈信息就是一个比特信息,它指示链路中的拥塞情况。

TCP发送方通过超时或者三个冗余ACK来感知网络拥塞,通过拥塞窗口cwnd来限制TCP在接收到ACK之前可以发送到网络的数据量。

一般来说,发送方未确认的数据量不得超过cwnd和rwnd的最小值,即:

LastByteSent - LastByteAcked <= min(cwnd, rwnd)

由于每个数据包往返时间为诶RTT,我们假设接受空间有足够的缓存用来接收数据,即只考虑cwnd,那么发送方的发送速率为cwnd/RTT 字节/秒,通过调节cwnd,发送方就可以调节它向连接发送数据的速率。

TCP进行拥塞控制的算法有四种:慢开始(slow start),拥塞避免(congestion avoidance),快重传(fast retransmit)和快恢复(fast recovery)

(1)慢开始

当一条TCP开始建立连接时,cwnd的值会初始化一个MSS的较小值。在慢启动的方式中,cwnd的值会初始化为一个MSS,并且每次传输报文确认后会增加一个MSS,cwnd的值会变成2个MSS,这两个报文段都传输成功后每个报文段加一,会变成4个MSS,以此类推,每成功一次cwnd的值会翻倍。

(2)拥塞避免

为了防止cwnd增长过大引起网络拥塞,还需要设置一个慢开始门限ssthresh状态变量。当cwnd > ssthresh时停用慢开始算法而改用拥塞避免算法,具体表现为加法线性规律缓慢增大。

(3)快重传和快恢复

有时候个别报文段就会在网络中意外丢失,但是实际上网络并未发生拥塞。如果发送方迟迟收不到确认,就会产生超时,并误认为网络发生了拥塞。这就导致发送方错误地开启慢启动模式,又将拥塞窗口设置为1,不必要的降低了传输效率。

快重传算法规定发送方只要一连收到3个重复确认,就可以知道现在并未出现网络拥塞,而只是接收方少收到一个报文段,并对此报文段进行重传。

在3-ACK点处发送方知道现在只是丢失了个别的报文段,于是不启动慢开始,而是执行快恢复算法。这时发送方第二次调整门限值,使ssthresh = cwnd / 2,开始执行拥塞避免算法。

 

三、流量控制和拥塞控制的区别

四、例题

 超时之后ssthresh = cwnd / 2 = 16 / 2 =8,之后执行慢开始,第一个RTT是2,第二次RTT是4,第三个RTT是8,此时cwnd = ssthresh = 8,执行拥塞避免算法,每次增长1,第四个RTT是9

 

 

 

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

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

相关文章

Unity实战案例全解析:RTS游戏的框选和阵型功能(3)生成范围检测框 +重置框选操作

前篇&#xff1a;Unity实战案例全解析&#xff1a;RTS游戏的框选和阵型功能&#xff08;2&#xff09; 生成选择框-CSDN博客 本案例来源于unity唐老狮&#xff0c;有兴趣的小伙伴可以去泰克在线观看该课程 我只是对重要功能进行分析和做出笔记分享&#xff0c;并未无师自通&…

给出向量求叉乘(在垂直的时候可以简化)

1、可以用那个求行列式的方法求叉乘。 2、在两个向量垂直的时候&#xff0c;可以用简化方法&#xff0c;前面幅度相乘&#xff0c;然后ex叉乘ey是ez 注意叉乘结果无论原向量是不是垂直&#xff0c;叉乘结果都与两个向量垂直

深入探秘 Java 网络编程:从基础到多线程服务器的全方位指南

我的主页&#xff1a;2的n次方_ Java 作为一门功能强大的编程语言&#xff0c;不仅在桌面应用、移动开发、后端开发等领域表现出色&#xff0c;还在网络编程中拥有广泛的应用。网络编程涉及在两个或多个设备之间通过网络进行通信&#xff0c;这对于构建分布式系统、客户端…

【Linux】进程管理:状态与优先级调度的深度分析

✨ 山海自有归期&#xff0c;风雨自有相逢 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;Linux—登神长阶 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1…

spring揭秘25-springmvc03-其他组件(文件上传+拦截器+处理器适配器+异常统一处理)

文章目录 【README】【1】文件上传与MultipartResolver【1.1】使用MultipartResolver进行文件上传【1.2】springmvc处理multipart多部件请求流程【1.3】使用springmvc上传文件代码实现&#xff08;springmvc6.10版本&#xff09;&#xff1a; 【2】Handler与HandlerAdaptor&…

stm32单片机学习 - MDK仿真调试

1 进行环境配置 点击 Options for Target&#xff0c;也就是我们俗称的魔法棒。 将"C/C"中的Optimization选项选为Level 0(-O0) 作用:优化等级调为0级,便于调试时分析代码 勾选"Debug"中的Load Application at Starup 和 Run to main() 选项 作用:Load…

Emergency Stop (ES)

文章目录 1. 介绍2. Feature List3. 紧急停止信号触发方式3.1 Port触发紧急停止信号3.2 SMU事件触发紧急停止信号3.3 软件触发紧急停止信号 4. 应用场景4.1 Port4.2 MSC 1. 介绍 Emergency Stop (ES)是Ifx System Control Units (SCU)六大模块之一。详细信息可以参考Infineon-…

latex有哪些颜色中文叫什么,Python绘制出来

latex有哪些颜色中文叫什么&#xff0c;Python绘制出来 为了展示xcolor包预定义的颜色及其对应的中文名称&#xff0c;并使用Python打印出来&#xff0c;我们可以先列出常见的预定义颜色名称&#xff0c;然后将它们翻译成中文&#xff0c;并最后用Python打印出来。 步骤 列出…

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.mapset(模拟实现)

1.对红黑树进行改造 1.1treenode模板参数改变 之前构建treenode模板参数传的是class k,class v(set为k&#xff0c;k&#xff1b;map是k&#xff0c;v&#xff09;&#xff0c;现在直接用T代替 template<class T> //这里直接传了T作为模板参数&#xff0c;T可能是pai…

19.第二阶段x86游戏实战2-寻找寻路call

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

什么是reactor以及其三种版本

写在前面 本文来看下什么是reactor以及其三种版本。 1&#xff1a;什么是reactor以及其三种版本 为了更好的理解什么是reactor&#xff0c;我们结合现实生活中的例子来看下。 翠花是个貌美如花的姑娘&#xff0c;人称赛东施&#xff0c;她的梦想是嫁给王子&#xff0c;可是天…

hystrix微服务部署

目录 一.启动nacos和redis 1.查看是否有nacos和redis 二.开始项目 1.hystrix1工程&#xff08;修改一下工程的注册名字&#xff09; 2.运行登录nacos网站查看运行效果&#xff08;默认密码nacos,nacos&#xff09; 3.开启第二个项目 hystrix2工程 4.关闭第二个项目 hyst…

SpringBoot学习笔记(2)

1.静态文件访问 使用IDEA创建Spring Boot项目&#xff0c;会默认创建出classpath:/static/目录&#xff0c;静态资源一般放在这个目录下即可。 如果默认的静态资源过滤策略不能满足开发需求&#xff0c;也可以自定义静态资源过滤策略。 1.1直接访问 在application.properties中…

Coze:如何使用主页对话框?

你好&#xff0c;我是三桥君 我们今天要介绍的功能模块是“主页对话框”。 目录 访问官网 登录首页 基本功能 主页对话框 第一个功能&#xff1a;如何与自己收藏的机器人进行对话&#xff1f; 第二个功能&#xff1a;如何请求主页对话框的机器人帮助创建一个新的机器人&#x…

【北京迅为】《STM32MP157开发板嵌入式开发指南》- 第十八章 Linux编写第一个自己的命令

iTOP-STM32MP157开发板采用ST推出的双核cortex-A7单核cortex-M4异构处理器&#xff0c;既可用Linux、又可以用于STM32单片机开发。开发板采用核心板底板结构&#xff0c;主频650M、1G内存、8G存储&#xff0c;核心板采用工业级板对板连接器&#xff0c;高可靠&#xff0c;牢固耐…

【算法系列-数组】螺旋矩阵(模拟)

【算法系列-数组】螺旋矩阵(模拟) 文章目录 【算法系列-数组】螺旋矩阵(模拟)1. 螺旋矩阵II(LeetCode 59)1.1 思路分析&#x1f3af;1.2 解题过程&#x1f3ac;1.3 代码示例&#x1f330; 2. 螺旋矩阵(LeetCode 54)2.1 思路分析&#x1f3af;2.2 解题过程&#x1f3ac;2.3 代码…

如何使用ssm实现基于web的网站的设计与实现+vue

TOC ssm756基于web的网站的设计与实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范…

极端天气道路目标检测数据集 3400张 带标注 VOC YOLO 6类

分类名: (图片张数&#xff0c;标注个数) car: (3210&#xff0c; 13654) truck: (1168&#xff0c;1629) per son: (1517&#xff0c;4359) bicyc le: (334, 589) bus: (381&#xff0c; 439) motorcycle: (164, 214) 总数: (3404, 20884) 总类(nc): 6类 极端天气道路目标检测…

09_OpenCV彩色图片直方图

import cv2 import numpy as np import matplotlib.pyplot as plt %matplotlib inlineimg cv2.imread(computer.jpeg, 1) img cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.show()plot绘制直方图 plt.hist(img.ravel(), 256) #ravel() 二维降一维 256灰度级…

pycharm汉化插件无法使用也无法卸载的解决方法

pycharm汉化插件无法使用也无法卸载的解决方法 本文目录&#xff1a; 一、故障描述 二、故障解决 零、时光宝盒 学习没有可能一帆风顺&#xff0c;我们都是在不断遇到的各种突发问题&#xff0c;不断努力解决的过程中成长。 前几天&#xff0c;我发现家里的网络晚上12点左右开…