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

news/2024/10/3 19:06:04 标签: tcp/ip, 网络, 网络协议, 流量控制, 拥塞控制

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.niftyadmin.cn/n/5688848.html

相关文章

k8s为什么用Calico

‌Calico是一种开源的网络和安全解决方案&#xff0c;主要用于容器、虚拟机、宿主机之间的网络连接。‌ 它支持Kubernetes、OpenShift、Docker EE、OpenStack等PaaS或IaaS平台&#xff0c;提供高效的网络通信和安全控制功能‌12。 Calico的核心组件包括Felix、etcd、BIRD等。F…

枫叶MTS格式转换器- 强大、操作简单的MTS、M2TS视频转换工具供大家学习研究参考

一款功能强大、操作简单的MTS、M2TS视频转换工具,欢迎下载使用。 使用本MTS格式转换器可以帮助您将索尼和松下等摄像机录制的MTS、M2TS格式高清视频转换为其他流行的视频格式,如MP4、3GP、AVI、MPEG、WMV、ASF、MOV、RM、VCD、SVCD、DVD、MKV、FLV、SWF、MPG、MP3、WAV、WMA…

10.4 Linux_并发_线程

概述 线程的共享资源&#xff1a; 可执行的指令、静态数据、文件描述符、当前工作目录、用户ID、用户组ID 线程的私有资源&#xff1a; 线程ID、程序计数器PC和相关寄存器、堆栈、错误号、优先级、执行状态和属性 线程编译&#xff1a; gcc <.c文件> -l pthread -o…

数据结构 ——— 单链表oj题:反转链表

目录 题目要求 手搓一个简易链表 代码实现 题目要求 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表 手搓一个简易链表 代码演示&#xff1a; struct ListNode* n1 (struct ListNode*)malloc(sizeof(struct ListNode)); assert(n1);…

深入理解 Solidity 中的支付与转账:安全高效的资金管理攻略

在 Solidity 中&#xff0c;支付和转账是非常常见的操作&#xff0c;尤其是在涉及资金的合约中&#xff0c;比如拍卖、众筹、托管等。Solidity 提供了几种不同的方式来处理 Ether 转账&#xff0c;包括 transfer、send 和 call&#xff0c;每种方式的安全性、灵活性和复杂度各有…

一个简单的摄像头应用程序1

这个Python脚本实现了一个基于OpenCV的简单摄像头应用,我们在原有的基础上增加了录制视频等功能,用户可以通过该应用进行拍照、录制视频,并查看已拍摄的照片。以下是该脚本的主要功能和一些使用时需要注意的事项: 功能 拍照: 用户可以通过点击界面上的“拍照”按钮或按…

【嵌入式系统】第18章 脉宽调试器(PWM)

目录 18.1 结构框图 18.3 功能说明 18.3.4 PWM 信号发生器 18.3.5 死区发生器 18.3.6 中断/ADC 触发选择器 18.3.7 同步方法 18.3.8 故障条件 18.3.9 输出控制块 LES 硬件介绍&#xff08;12&#xff09;正交编码接口QEI 19.1 结构框图 19.2 信号描述 19.3 功能说明…

长期提供APX515/B原装二手APX525/B音频分析仪

Audio Precision APx515 是一款针对生产测试而优化的高性能音频分析仪。它因其速度、性能、自动化和易用性而成为一流的仪器。它具有卓越的性能&#xff0c;具有 –106 dB 的典型 THDN、1M 点 FFT 和 192k 数字 I/O&#xff0c;以及所有 APx 系列音频分析仪的一键式自动化和易用…