1、TCP拥塞控制
拥塞控制有两种方式,一是端到端,二是网络设备提供拥塞信息;(TCP是端到端拥塞控制)
检测拥塞程度及控制
- 轻微拥塞,如何降低发送速率;
- 拥塞,如何降低发送速率;
- 不拥塞,如何增加发送速率;
2、如何感知拥塞?
超时:拥塞
超时大概率是网络拥塞,路由器无缓冲空间丢弃了;小概率是某一级校验出错,丢弃了;
将超时认为是网络拥塞,有一定误判,但大概率是对的;
3次冗余ACK:轻微拥塞
有出现丢包的情况,但网络仍有一定的传输能力,属于轻微拥塞;
丢包也可能是网络拥塞,也有概率是某一级校验出错;
3、TCP拥塞控制:速率控制
维持一个拥塞窗口的值:CongWin;
这时的网络速率rate = CongWin/RTT (b/s);
发送端 限制 “已发送未确认” 的数据量,LastByteSent - LastByteAcked ≤ CongWin;
拥塞控制和流量控制联合:取两个中最小的;
3.1、关于CongWin
CongWin是动态的,是感知网络拥塞程度的函数
- 初始阶段:CongWin = 1;
- SS慢启动阶段:每经过一个RTT,CongWin翻倍增加;
- CA拥塞避免阶段:每经过一个RTT,CongWin加1;
- 超时:跌为CongWin = 1,进入SS阶段,加到上次CongWin/2,进入CA阶段;
- 3次冗余ACK:降到CongWin/2,进入CA阶段;
例子:
初始CongWin = 1 MSS;
进入SS阶段,2,4,8,16超时,跌回CongWin = 1;(16/2 = 8);
再进入SS阶段,2,4,8,进入CA阶段,9,10,11,12,超时,跌回CongWin = 1;(12/2 = 6);
再进入SS阶段,2,4,进入CA阶段,5,6,7,8,9,到10时发现有3个ACK的轻微拥塞,降为一半10/2=5,再6,7,8....,遇到3个ACK再降为一半,要是直接遇到超时,只能重新再来了;
3.2、TCP拥塞控制特性:AIMD加性增乘性减
3.3、TCP吞吐量
忽略慢启动阶段,假设发送端总有数据要传输;
每个RTT时间,传输3/4W的数据,速率即(3/4)*(W/RTT);
4、TCP公平性
K个TCP会话,分享一个链路带宽为R的瓶颈,每个会话有效带宽为R/K;
下面是2个TCP会话,横轴吞吐量Rx,纵轴吞吐量Ry,Rx+Ry=R;
斜率为-1的这条线,代表了总吞吐量为R;吞吐量摇摆的过程中向这条线靠近,在超过这条线时由于轻微拥塞又回去;
- 一开始在①处,Rx和Ry相差很大,随着CA过程的进行,超过最大吞吐量;
- 取一半的位置到②处,再进入CA过程向上加,超过最大吞吐量;
- 等到③的时候,Rx和Ry的差距已经很小了,最终会收敛到虚线处;
但是在网络上不止有TCP,还有UDP,UDP并不会进行流量/拥塞控制,这对TCP来说是不公平的;
主机间可以建立多个TCP连接,如果一对主机建立了1个TCP连接,另一对主机建立了10个TCP连接,这一点也是不公平的;