概述
TCP相比于UDP,可靠。
而拥塞控制,流量控制可以理解为,为了实现这种可靠传输的几种方法。
基本的概念
TCP接收方维护接收窗口,发送放维护发送窗口。窗口能够理解为内存空间,即对有限空间合理使用。
- 接收窗口:接收方根据自己的缓存大小设置的值,并且要告诉发送方,自己的接收能力。
- 拥塞窗口:发送方根据自己估算的网络拥塞程度而设置的值,是当前网络容量的反映。
- 发送窗口:发送窗口=min(拥塞窗口,接收窗口),发送窗口取的是,拥塞窗口和接收窗口之间最小的那个。
举例:
自助餐馆很多人去吃,但是该店铺只有50个位置,且餐厅在2楼(一共5层的大楼,那么什别的楼层的人也需要坐电梯,这就是拥塞控制解决的问题,后面会讲到)。
为了避免上楼的人没有位置,楼下设立等待区域。
所以店铺门口电梯处有一个LED大屏幕,用来显示目前剩余的位置数量。
例如,这时候已经有20个位置已经坐了人了,只剩下30个位置(接收窗口为30)。但是电梯一次只能坐上10个人(网络拥塞窗口为10),所以可以计算发送窗口=min(30,10),即同时满足两个条件的最小,取最小值为10。
PS:因为还有吃完离开的人,数据会发生变化,这个就是后面的4种控制算法来计算的。
流量控制
流量控制的任务:流量控制就是,接收方告诉发送方的大小。即餐馆还剩多少位置。
流量控制的方法:滑动窗口机制。
- 接收方在确认报文段当中,将接收窗口(rwnd)告诉发送方。
- 发送方,根据接收窗口,和拥塞窗口来确认发送窗口。
即假设,在电梯运送了3趟途中(送上去30人),只有5个人吃完了,所以接收窗口的大小变为5,结合拥塞窗口10,min(5,10)=5。所以此时1楼的LED屏幕显示上去5个人。
PS:所以流量控制就是,LED屏幕实时变化的过程。
拥塞控制
拥塞控制的任务:检测网络的状态(电梯情况),用4种算法来估算拥塞窗口的值。
如果说,流量控制的职责就是检测餐厅剩余的位置。那么拥塞控制就是电梯剩余能坐的位置(因为排队的还有其他楼层的人,即假如有7个人是要去3楼住酒店,那么即使餐厅还有5个位置,排队的人也只能坐3个上去)。
借用一张网图。
横坐标是传输轮次(电梯每上下一趟),纵坐标是拥塞窗口(电梯容量)。
而上图所示的增长条件的前提是:接收方目前给出的空间充足。
慢开始算法:连接刚刚建立的时候,cwnd(拥塞窗口)指数增大。达到门限ssthresh改为第二种算法,拥塞避免算法。
拥塞避免算法:初始的ssthresh之后,cwnd呈加法增大。出现超时(网络拥塞的时候),调整cwnd=1,ssthresh=cwnd/2(乘法式减小)。然后又开始慢开始算法。
快重传算法:不是等到真正出现网络拥塞的时候才执行慢开始,而是接收方收到三次冗余的ACK之后就开始慢开始。(参考TCP建立阶段ACK等的发送)
快恢复算法:cwnd变为新的门限值之后,继续执行拥塞避免。
总结:即慢开始算法和拥塞避免是一直在这个过程主要循环,而快重传算法和快恢复算法是为了,到了需要变化模式的时候,更快的变换过去。
那么疑问来了,既然电梯剩余的去到餐馆的位置,就是拥塞窗口,为什么还要这样麻烦呢?原因是因为在实际的网络当中,并不能知道,该条连接有多少个资源已经被使用,即我们并不能看见此时电梯里面有几个人,即大家都是蒙上眼睛,听广播和电梯超重提示来试探性的上楼。所以需要每次先上4,8,到达第一个ssthresh之后,改变算法为拥塞避免算法。