什么是拥塞控制,tcp协议拥塞控制机制

随着网络技术的飞速发展,越来越多的工作依赖网络来完成,基于网络的实时通信系统的质量和实时性也在很大程度上依赖于网络质量。 但是,在因特网的TCP/IP架构中,拥塞的发生是固有的属性。 网络拥塞是指用户对网络资源(包括链路带宽、存储空间和处理器处理能力)的需求超过了其固有的处理能力和容量。 与UDP相比,TCP本身需要具有拥塞控制机制,以确保数据的可靠传输,这给基于TCP的音视频实时传输带来了一定的困扰。 本文详细描述TCP拥塞控制机制和基于TCP传输设计实时音视频系统的方法。

在PART 01 TCP拥塞控制配置文件TCP/IP协议栈开始广泛运行后,网络开始遭遇拥塞崩溃; 这意味着,在数据发送主机以建议的速度将数据包发送到internet,并且传输协议具有类似于TCP的重发机制(其中一些路由器拥塞导致数据包被丢弃)的情况下,如果发生数据丢失,重发数据会增加数据到达时间此外,高频率重新发送不会缓解网络拥塞,会导致更多拥塞。 为了避免这种问题,20世纪80年代后期,在网络协议中引入了TCP拥塞控制。

广义上,TCP拥塞控制是每个源确定网络中的可用容量,知道可以安全传输的分组的数目,防止向网络注入过多的数据,防止网络中的路由或链路过载。 在网络上发生拥塞时,拥塞控制可以减少向网络发送数据的速度,防止引起恶性循环; 同时,在网络空闲时,加快发送数据的速度,充分利用网络资源。 当然,确定可用网络容量并不容易,不断有新的TCP连接的加入和减少; 更糟的是,可用带宽会随着时间而变化。 这意味着,特定源必须能够调整正在传输的分组数。

在PART 02 TCP拥塞控制算法的分类理论上,拥塞控制有两种实现方式。

端到端拥塞控制:在该拥塞控制方法中,发送端自身判断是否拥塞,调整传输速率; 网络辅助的拥塞控制:网络内的路由器向发送方传达网络的拥塞状况。 从网络层反馈拥塞信息实现拥塞控制的方法,需要在网络设备的支持下对底层硬件进行改造目前常用的TCP协议大多采用端到端的拥塞控制,发送端自身是否存在拥塞如果发送方检测到这种现象,则应该降低发送数据的速率,否则可以逐渐提高速率。 拥塞控制算法需要解决以下三个问题:

TCP限制数据传输速率的方法TCP如何检测网络拥塞; TCP用什么算法调整速率? 什么时候调整,调整多久? 在TCP拥塞控制算法发展的过程中,出现了以下几种不同的思路。

丢包拥塞控制:将丢包视为发生了拥塞,采用缓慢检测的方式,逐渐增大拥塞窗口,发生丢包时减少拥塞窗口。 例如Tahoe、Reno、BIC-TCP、Cubic等;

基于时延的拥塞控制:将时延增加视为正在发生拥塞,时延增加会增加拥塞窗口,时延减少会减少拥塞窗口。 例如Vegas、Westwood等;

基于链路容量的拥塞控制:实时测量网络带宽和时延,如果网络上的消息总量大于带宽时延的乘积,则认为发生了拥塞。 例如BBR;

基于学习的拥塞控制:没有特定的拥塞信号,利用评价函数,根据训练数据,采用机器学习的方法制定Remy等控制策略。

PART 03常见的TCP拥塞控制算法TCP Reno

Reno算法中包含的慢启动、拥塞避免和快速重发、快速恢复机制是现有基于丢包的拥塞控制算法的许多基础。 发送侧维持拥塞窗口cwnd (称为congestion window的状态变量和慢启动阈值ssthresh状态变量。 ssthresh的使用方法如下。

对于cwndssthresh,请使用慢启动算法。

对于cwndssthresh,切换到拥塞避免算法。

如果cwnd=ssthresh,则慢启动和拥塞避免算法是任意的。

(1)慢启动算法慢启动

表示连接建立后首先初始化cwnd=1,可以传输MSS大小的数据。

每次收到ACK、cwnd; 直线上升。

每次经过RTT时,cwnd=cwnd*2; 指数上升。

(2)拥塞避免算法congestion avoidance

如果cwnd=ssthresh,则进入拥塞避免算法。 算法如下。

收到一个ACK时,cwnd=cwnd 1/cwnd

每次通过一个RTT时,cwnd=cwnd 1

(3)拥塞算法快速重传

当收到三个duplicate ACK时,Reno会打开重传,直到RTO超时。 如果发生拥塞:

cwnd=cwnd/2

sshthresh=cwnd

)4)快速恢复快速恢复

cwnd=sshthresh3*MSS(3表示确认收到了三个数据包) ) ) )。

重发由Duplicated ACKs指定的数据包;

收到duplicated Acks时,cwnd=cwnd 1;

收到新的Ack后,假设cwnd=sshthresh,进入拥塞避免算法。

BIC-TCP 和 C

UBIC

TCP-Reno在大拥塞窗口环境下,由于一个数据包的丢失所带来的窗口缩小要花费很长的时间来恢复(每次仅增加1),这样,带宽利用率不可能很高且随着网络的链路带宽不断提升,这种弊端将越来越明显。为了改善Reno拥塞避免阶段的表现,BIC-TCP提出这样一个二分思想的:当出现丢包的时候,说明最佳窗口值应该比这个值小,那么BIC就把此时的cwnd设置为max_win,把乘法减小后的值设置为min_win,然后BIC就开始在这两者之间执行二分思想–每次跳到max_win和min_win的中点。

BIC-TCP在高速网络中具有良好的可扩展性、自身竞争流之间的公平性和低窗口振荡的稳定性。然而,BIC-TCP的拥塞控制窗口增长仍然可能会过大,特别是在短RTT或低速网络下。此外,在拥塞窗口控制的几个不同阶段(二进制搜索增加、最大探测、Smax和Smin)增加了协议实现和性能分析的复杂性。

CUBIC是BIC-TCP的改进算法,CUBIC算法通过寻找一个新的窗口增长函数,三次方函数,在保持BIC-TCP的优势的同时(特别是它的稳定性和可伸缩性),同时简化了窗口控制的复杂度。CUBIC窗口控制函数如下:

其中,W(t)是在时间t时,窗口的大小,C为CUBIC参数,t为上次减窗经过的时间,K为上述函数在没有进一步损失事件时将W增加到Wmax所需要的时间周期,当发生拥塞事件时,CUBIC将当前cwnd设置为Wmax * β,乘法减小系数;由此可知K是:

通过下图可以看出,

当cwnd < Wmax. CUBIC在凸函数区域,即拥塞避免区间,cwnd的增长随时间的增加而变小;
当cwnd>=Wmax. CUBIC在凹函数区域,即新的Wmax 探测区域,当距离上次发生拥塞事件越久,cwnd 增长越快。

TCPW (TCP Westwood)

基于丢包的拥塞控制方法把数据包的丢失解释为网络发生了拥塞,而假定链路错误造成的分组丢失是忽略不计的,然而在高速网络中,这种假设是不成立的,当数据传输速率比较高时,或者在无线网络环境下,链路错误是不能忽略的。此时的丢包并不一定代表网络发生拥塞。同时,基于丢包的拥塞控制方法倾向于填满缓冲区,当瓶颈链路的缓冲区很大时,需要很长时间才能将缓冲区中的数据包排空,造成很大的网络延时,这种情况称之为缓冲区膨胀。

不同于基于丢包的拥塞控制,TCPW发送端监控ACK报文的接收速率,进而估算当前连接可达到的数据发送速率(可用带宽)。当发送端检测到丢包时(超时或者3个重复ACK),发送端根据估算的发送速率设置拥塞窗口大小(cwnd)和慢启动阈值(ssthresh)。

TCPW评估当前采样点的带宽如下:

其中,dk代表发送数据的数量,tk, tk-1代表当前收到ACK包的时间和收到上一个ACK的时间;为了去除ACK带来的速率采样噪声,TCPW对采样的速率应用一个低通滤波器来获得可用带宽的低频部分,得到如下的一个离散时间滤波器:

为了方便理解,假设 tk – tk-1 是一个常量;当前的带宽评估可以可以简化为:

可以认为,当前评估带宽是,之前评估带宽和最近2次评估带宽的一个平滑值;当发生ACK丢的情况,认为当前采样时间的带宽为0,可以看出,TCPW 会把当前带宽认为是在上一个评估带宽上做了一次乘法减小。

TCP-Westwood避免太过保守的减低窗口操作,与基于丢包的拥塞控制算法相比,TCP-Westwood更适合于无线链路类的TCP连接。TCPW早在1990年代末就提出了google BBR类似的想法,通过不断的测量带宽和最小RTT来估算网络的容量,最终将发生数据收敛。

BBR

BBR是由Google设计,并于2016年发布的拥塞算法,以往大部分拥塞算法是基于丢包来作为降低传输速率的信号,而BBR基于模型主动探测。

因为最优带宽和延迟无法同时测量(btlBw的测量会造成存在网络缓存增加RTT,而RTprop的测量要求网络缓存为空),所以分别估计带宽(btlBw)和延迟(RTprop),最后计算出cwnd。同时增加变量pacing rate(btlBw * 增益系数),用于控制发送端的发送速率,以解决发送端突发造成的网络排队问题。

TCP BBR一方面能够提升丢包环境下的发送速率,充分利用网络带宽,同时,也能够降低网络链路buffer的使用率,从而降低传输延时。TCP BBR 不仅适合TCP场景,同时QUIC也使用了BBR作为拥塞控制算法。

PART 04 实时多媒体QoS与TCP拥塞控制

虽然现在的实时多媒体通讯大部分都是基于UDP协议来实现,但是也存在一些情况,需要通过TCP来传输音视频;例如UDP端口屏蔽。相对于UDP数据传输的丢包,乱序, TCP网络下的传输数据延时大,队头阻塞等问题,为实时音视频传输也带来了更大的挑战。

实时多媒体的一些特点:

对于视频高清的需求,大码率场景下,单位吞吐大幅增加,单帧大小大幅增加,导致网络丢包数大幅增加,实时通信对低延迟的要求,导致对数据传输的实时性的要求高。

为了更好的提升实时多媒体QoS,在TCP 环境下,设置拥塞控制和流量控制,需要考虑到以下一些的方面:

快速地检测到网络的拥塞事件发生;精准的控制编码码率,特别是对视频关键帧的编码,避免出现大的网络冲击;更积极的网络探测,对网络带宽的充分利用,可以带来更好的音视频体验;通过simulcast和SVC,在带宽不足的情况下,尽量保证音视频的实时性和流畅度;尽量避免发送无效数据冲击网络,例如FEC、NACK。 PART 05 总结

拥塞控制应该是TCP中相对比较复杂的一个部分了,通过介绍TCP拥塞控制设计思想以及一些常用拥塞控制算法的设计思路,希望大家能对TCP拥塞控制有更好的了解。

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注