为了避免发送方无节制地发送数据,从而造成网络拥堵,所以 TCP 有一个拥塞控制。
-
流量控制:作用于接收方,控制发送者发送速度,从而使接收者来得及接收,防止分组丢失。
-
拥塞控制:作用于网络,防止过多数据发送到网络,避免网络负载过大。
TCP的拥塞控制
关于拥塞
拥塞窗口:大小根据网络拥堵程度动态变化。本质:使用算法控制拥塞窗口,避免过多的数据注入到网络。
拥塞窗口cwnd:网络没有出现拥塞,拥塞窗口增大一些
,以便把更多的分组发送出去。网络出现拥塞或有可能出现拥塞,拥塞窗口减小一些,以减少注入到网络中的分组数,缓解网络出现的拥塞。
发送方如何知道是否拥塞:是否出现超时。
网络拥塞的时候,路由器会丢弃分组。如果没有收到确认报文,说明出现了丢弃分组的现象,也就是拥塞超时了。
如何控制拥塞:
TCP拥塞控制算法:慢开始
、拥塞避免
、快重传和快恢复
。
慢开始:先试探一下网络的负荷,由小到大逐渐增大发送窗口,也就是说,由小到达逐渐增大拥塞窗口值。指数增长。设立慢启动门限 ssthresh(slow start threshold)初始值。
拥塞避免:从指数增长变为线性增长。
TCP重传:超时重传和快重传
超时重传:网络拥塞,导致规定时间未收到ACK确认包,此时超时重传。时间设置为之前的2倍,2次超时就说明网络差,不适合频繁反复发送,重新慢启动。ssthresh=cwnd/2。cwnd 重置为初始值。
快重传:个别报文丢失,但是网络没有拥塞。此时接收方对上一个报文一直发送确认包,发送了3次重复的确认包,接收方立即重传丢失的报文。
快恢复:调整门限值为ssthresh/2,然后执行拥塞避免算法。
实例1(出现网络拥塞导致报文丢失):
1.TCP连接进行初始化的时候,cwnd=1,ssthresh=16。
2.慢启动算法开始:cwnd初始值是1,每次发送方收到一个ACK拥塞窗口按照指数增长,2的指数倍。如下图1-2-4-8-16。
3.当ssthresh=cwnd时,启动拥塞控制算法,拥塞窗口按照规律线性增长,每收到一个确认包,cwnd加1。
4.当cwnd=24时,假设网络出现超时,发送方收不到确认ACK,网络拥塞了。此时设置ssthresh=12,(cwnd/2)
5.设置cwnd=1,开始慢启动算法,当cwnd=ssthresh=12,慢启动算法变为拥塞控制算法。
实例2(非网络拥塞产生的丢包):
1.接收方成功的接受了发送方发送来的M1、M2并且分别给发送了ACK。
2.接收方没有收到M3,而接收到了M4,显然,M4是失序报文段,接收方不能确认M4。
3.实行快重传算法,收到M4、M5等报文段时,不断重复的向发送方发送M2的ACK。
4.接收方收到3个重复的ACK,那么发送方不等重传计时器到期,由发送方尽早重传未被确认的报文段。
网络未拥塞,但个别报文在网络中丢失,发送方迟迟收不到确认,就会超时。误认为拥塞。重新满开始算法,拥塞窗口设为1,降低传输效率。