一、基础概念
关于TCP协议的一些基础概念。
1、MSL:报文最大生存时间
MSL:Maximum Segment Lifetime
任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。因为TCP报文(segment)是IP数据报(datagram)的数据部分。 RFC 793中规定MSL为2分钟,实际应用中常用的是30秒,1分钟和2分钟等。
2、TTL:报文最大生存时间
TTL:Time To Live
ip数据报头中有一个8bit字段,称为TTL域。字面意思是生存时间,但并不是一个真正的时间。该域由源主机设置初始值,定义ip数据报在网络中可以存活的总跳数,每经过一个路由器,跳数减1,如果减至0,则丢弃该数据包。
3、RTT:一个完整报文交互时间
RTT:Round Trip Time
发送一个数据包到收到对应的ACK,所花费的时间。
二、流量控制
发送报文时,控制报文的发送速率。
1、什么是流量控制?
双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发送方的发送速率太快,会导致接收方处理不过来,这时候接收方只能把处理不过来的数据存在缓存区里(失序的数据包也会被存放在缓存区里)。
如果缓存区满了发送方还在疯狂着发送数据,接收方只能把收到的数据包丢掉,大量的丢包会极大着浪费网络资源,因此,我们需要控制发送方的发送速率,让接收方与发送方处于一种动态平衡才好。
对发送方发送速率的控制,我们称之为流量控制。
2、TCP报文格式
窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。
窗口大小时一个16bit字段,因而窗口大小最大为65535。
3、如何实现流量控制
通过滑动窗口实现: 滑动窗口协议是传输层进行流控的一种措施,接收方通过通告发送方自己的可以接受缓冲区大小(这个字段越大说明网络吞吐量越高),从而控制发送方的发送速度,不过如果接收端的缓冲区一旦面临数据溢出,窗口大小值也会随之被设置一个更小的值通知给发送端,从而控制数据发送量(发送端会根据接收端指示,进行流量控制)。
4、滑动窗口工作图
三、拥塞控制
为避免拥塞而采取的一系列行为。
1、拥塞控制是什么?
拥塞:在某段时间,若对网络中某资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,导致拥塞。
拥塞控制:为避免拥塞现象的产生,而采用的一系列的控制,TCP的拥塞控制是指在协议层采用的一些策略。
2、拥塞控制算法
拥塞控制的四个算法:
- 慢开始
刚开始cwnd=1,发送窗口也为1,发送方先发送一个报文M1测试连接通畅程度,当收到对M1报文的确认之后,cwnd呈指数级增长。 - 拥塞避免
让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。 - 快重传
当不出现丢包情况时,接收方是每接收多个数据包才给发送方一个确认。快重传算法要求接收方每收到一个失序的报文段后就立即发出重复确认。这样做可以让发送方尽早知道有报文段没有到达接收方。 - 快恢复
当发送端收到连续三个重复的确认时,就执行“乘法减小”算法,把慢开始门限 ssthresh 减半。但接下去不执行慢开始算法
慢开始门限状态变量ssthresh 当 cwnd < ssthresh 时,使用慢开始算法(cwnd每轮加倍)。 当 cwnd > ssthresh 时,停止使用慢开始算法而改用拥塞避免算法。 拥塞避免算法的思路是让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口 cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。 当 cwnd = ssthresh 时,既可使用慢开始算法,也可使用拥塞避免算法。
可以看到,开始时采用慢开始算法,每经历一轮cwnd翻倍,传输的数据包翻倍,到第4轮时cwnd=16,意味着可以同时发送16个数据包,到达了设定的慢开始门限值ssthresh,随后采用拥塞避免算法。
采用拥塞避免算法期间,每经历一轮cwnd+1。当cwnd=24时,发送方不能准时收到确认数据包(即丢包),判断出现网络拥塞,于是把慢开始门限值ssthresh重新设为当前cwnd值(24)的一半,即12,并把cwnd重置为1 ,再次进入慢开始阶段。
可以看到:采用慢开始算法,cwnd按指数规律增长;采用拥塞避免算法,cwnd按线性规律增长。
3、滑动窗口和拥塞窗口的区别
- 滑动窗口:
解决的是发送方和接收方接收数据速率不一致的问题。 通过设置滑动窗口(可以通俗的理解为接收方的缓存)可以缓解这一个问题。具体的操作是接收方会向发送方通知自己可以接受数据的大小,而发送方会根据这个数值,发送数据。 - 拥塞窗口:
控制全局网络的拥塞情况。 通过控制发送方每次发送的流量的多少,用来逐渐试探整体网络的拥塞程度。如果没有拥塞控制,发送方每次发送的数据大小为滑动窗口,在只有2台主机的时候确实是没有问题的,但是如果放到现实的网络大环境中来说是行不通的。因为如果每台主机都发送的窗口大小的数据,那么整个网络系统必然会瘫痪。所以通过在发送方设置拥塞窗口,可以有效缓解网络压力。
4、其他拥塞控制算法
- Vegas
Vegas将时延 RTT 的增加作为网络出现拥塞的信号,RTT 增加,拥塞窗口减小,RTT 减小,拥塞窗口增加。具体来说,Vegas 通过比较实际吞吐量和期望吞吐量来调节拥塞窗口的大小, - Reno
Reno 将拥塞控制的过程分为四个阶段:慢启动、拥塞避免、快重传和快恢复,是现有的众多拥塞控制算法的基础,就是上面我们讲到的内容。 - Cubic
使用一个立方函数作为拥塞窗口的增长函数,其中C是调节因子,Wmax 是上一次发生拥塞时的窗口大小,β是乘法减小因子。这种策略使得拥塞窗口的增长和RTT没有关系,而是取决于上次发生拥塞时的最大窗口值和距离上次发生拥塞的时间间隔。 - BBR
BBR 算法不将出现丢包或时延增加作为拥塞的信号,而是认为当网络上的数据包总量大于瓶颈链路带宽和时延的乘积时才出现了拥塞。 周期性地探测网络的容量,交替测量一段时间内的带宽极大值和时延极小值,将其乘积作为作为拥塞窗口大小,使得拥塞窗口的值始终与网络容量保持一致。 由于 BBR 算法不将丢包作为拥塞信号,所以在丢包率较高的网络中,BBR 依然有极高的吞吐量。 - Remy
计算机生成的拥塞控制算法(computer-generated congestion-control algorithm),采用机器学习的方式生成拥塞控制算法模型。通过输入各种参数模型(如瓶颈链路速率、时延、瓶颈链路上的发送者数量等),使用一个目标函数定量判断算法的优劣程度,在生成算法的过程中,针对不同的网络状态采用不同的方式调整拥塞窗口,反复修改调节方式,直到目标函数最优,最终会生成一个网络状态到调节方式的映射表,在真实的网络中,根据特定的网络环境从映射表直接选取拥塞窗口的调节方式。
四、拓展思考
1、TCP中的拥塞控制算法是最好的吗?
不一定。 要结合使用场景,比如一下弱网环境、恶劣信道,会有一些更好的拥塞控制算法,比如上面介绍的BBR。
2、TCP是最好的吗?
不一定。 要结合使用场景,比如音视频传输场景中,UDP的效率要比TCP更高。
|