随着网络技术的飞速发展,越来越多的工作依赖网络完成,基于互联网的实时通信系统的质量和实时性也很大程度也依赖于网络质量。然而,在Internet的TCP/IP体系结构中,拥塞的发生是其固有的属性。网络拥塞是指用户对网络资源(包括链路带宽、存储空间和处理器处理能力等)的需求超过了固有的处理能力和容量, 相比UDP,TCP自身具有拥塞控制机制,并且需要保障数据可靠传输,这会对基于TCP的音视频实时传输造成一定的困扰。本文将深入讲解TCP的拥塞控制机制以及如何基于TCP传输来设计一个实时音视频系统。
PART 01 TCP拥塞控制简介
TCP/IP协议栈开始广泛运行后,网络开始遭受拥塞崩溃;即数据发送主机会以建议允许的速度将其数据包发送到互联网,当某些路由器发生拥塞,导致数据包被丢弃;对于TCP这种有重传机制的传输协议,当发生数据丢失时,重传数据将延长数据到达的时间;同时,高频率的重传,也将导致网络的拥塞得不到缓解,从而引发更多的拥塞。为了避免这类问题,1980年代后期,TCP拥塞控制被引入到网络协议中。
从广义上讲,TCP拥塞控制的是让每个源确定网络中有多少可用容量,以便它知道可以安全传输多少数据包,防止过多的数据注入到网络中,使网络中的路由或者链路不至于过载。在网络中发生拥塞时,拥塞控制减少向网络中发送数据的速度,防止造成恶性循环;同时在网络空闲时,提高发送数据的速度,最大限度地利用网络资源。当然,确定可用网络容量并非易事,不断有新的TCP连接的加入和减少;更糟糕的是,可用带宽会随着时间的推移而变化,这意味着任何给定的源都必须能够调整它在传输中的数据包数量。
PART 02 TCP拥塞控制算法分类
理论上,拥塞控制有两种实现方式:
- 端到端拥塞控制:在这种拥塞控制方法中,由发送端自己来判断是否拥塞,然后调整传输速率;
- 网络辅助的拥塞控制:由网络中的路由器来告诉发送方,网络的拥塞情况。
通过网络层反馈拥塞信息实现拥塞控制的方法,需要得到网络设备的支持,改造底层硬件;现在常用的TCP协议大都采用的是端到端拥塞控制,即由发送端自己来判断是否拥塞;若发送端检测到这种现象,就应该降低发送数据的速率,若没有,则可以慢慢提高速率。拥塞控制算法需要解决以下三个问题:
- TCP如何限制数据的发送速率;
- TCP如何检测网络中是否拥塞;
- TCP采用什么算法来调整速率(什么时候调整,调整多少)。
TCP拥塞控制算法发展的过程当中出现了以下