浅谈流量控制和拥塞控制
流量控制
流量控制其实是控制发送端,在接收端接收能力不足时,发送端发送过快,接收端来不及处理,造成资源浪费。那也就是说,接收能力决定了发送速度。
在确认应答策略中,对每一个发送的数据段,都要给一个ACK确认应答,收到ACK后再发送下一个数据段,这样做有一个比较大的缺点,就是性能比较差,尤其是数据往返的时间长的时候,就特别阻塞。
当当当当,我们采用滑动窗口来实现流量控制。一次可以发送多条数据,从而去提高性能。
怎么实现流量控制
滑动窗口。这里的窗口可以理解为类似于缓存区。
接收端将自己可以接收的缓冲区大小放入 TCP 首部中的 “窗口大小” 字段, 通过ACK端通知发送端;窗口大小字段越大, 说明网络的吞吐量越高;
接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端;发送端接受到这个窗口之后, 就会减慢自己的发送速度;
如果接收端缓冲区满了, 就会将窗口置为0; 这时发送方不再发送数据, 但是会时不时地发送窗口探测数据段(一个字节), 使接收端把窗口大小告诉发送端;
拥塞控制
我们虽然有了滑动窗口这个法宝,也不能掉以轻心,如果网络中每台终端都连上网络以后,贸然发送大量的数据,网络必然会吃不消,造成网络拥堵。
所以我们控制拥塞也有几个方法:慢开始和拥塞避免、快重传和快恢复;
每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口;像上面这样的拥塞窗口增长速度, 是指数级别的. (慢开始) 只是指初使时慢, 但是增长速度非常快.为了不增长的那么快, 因此不能使拥塞窗口单纯的加倍.此处引入一个叫做慢启动的阈值。 当拥塞窗口超过这个阈值的时候, 不再按照指数方式增长, 而是按照线性方式增长(拥塞避免)。
当TCP开始启动的时候, 慢开始阈值等于窗口最大值;在每次超时重发的时候, 慢开始阈值会变成原来的一半, 同时拥塞窗口置回1;少量的丢包, 我们仅仅是触发超时重传; 大量的丢包, 我们就认为网络拥塞;
当然,只要发送端一连收到三个重复的 ACK 即可断定有分组丢失了,就应立即重传丢失的报文段而不必继续等待为该报文段设置的重传计时器的超时(快重传)。
-
当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
-
考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法
流量控制和拥塞控制的比较
-
相同点
(1)现象都是丢包;
(2)实现机制都是让发送方发的慢一点,发的少一点 -
不同点
(1)丢包位置不同
流量控制丢包位置是在接收端上
拥塞控制丢包位置是在路由器上
(2)作用的对象不同
流量控制的对象是接收方,怕发送方发的太快,使得接收方来不及处理 。
拥塞控制的对象是网络,也是怕发送方发的太快,造成网络拥塞,使得网络来不及处理。 -
联系
流量控制:流量控制发生在发送端和接收端之间,只是点到点之间的控制。
拥塞控制:拥塞控制通常表示的是一个全局性的过程,它会涉及到网络中所有的主机、所有的路由器和降低网络传输性能的所有因素。