TCP流量控制和拥塞控制

一、TCP流量控制

1.为什么需要流量控制?什么是流量控制?

答:
发送方给接收方发送数据时,需要考虑接收方接收数据的处理能力,不能无脑发送,否则会因为对方无法及时处理数据而触发重传机制,从而造成网络流量的浪费。

流量控制:让发送⽅根据接收⽅的实际接收能⼒,控制发送的数据量。

2. 如何进行流量控制?

答:
发送方有一个发送窗口,控制每次发送的最大数据量。接收方有一个接收窗口,表示此时接收方最大的数据接收处理能力。
流量控制,就是接收方每次告诉发送方当前的窗口大小,从而进行数据发送控制。

3.流量控制过程中两个问题?

答:
窗口关闭:发送方窗口大小为0,发送方不再发送数据。
窗口关闭产生的死锁问题:当接收方处理完数据,接收窗口变大时,会发送ACK报文给发送方。如果这个ACK报文丢失,那么发送方因
为收不到非0窗口通知而一直等待,接收方也会一直等待发送方数据,造成死锁问题。
解决死锁:发送方收到接收方的0窗口通知时,就启动持续计时器。如果计时器超时,发送方会主动发送窗口探测报文,接收方收到这个
探测报文后,就会给出自己的接收窗口大小。

糊涂窗口综合症:接收方的接收窗口不断变小,使得发送方每次能发送的数据也越来越小。而由于TCP+IP头就有40个字节,导致每次传
输的有效数据很少。
解决糊涂窗口综合症:让接收方不再通告小窗口给发送方,或者发送方避免发送小数据。

二、TCP拥塞控制

1. 为什么需要拥塞控制?什么是拥塞控制?如何判断网络拥塞?

答:
流量控制避免了发送方的数据填满接收方的缓存。

但是实际传输时,可能由于网络过于拥堵,而导致发送方迟迟收不到接收方的确认应答号,从而发送方触发重传机制,重复发送先前的数据包,那么会导致网络更加拥堵。因此,TCP需要检测当前时刻的网络状态,来调整数据发送量。这就是为什么需要TCP拥塞控制的原因。

拥塞控制:避免发送方的数据填满整个网络。

拥塞窗口cwnd:控制发送方的发送数据量,根据网络拥堵程度动态变化。网络好,cwnd大,网络差,cwnd小。
发送窗口值swnd = min(cwnd,rwnd),rwnd是接收窗口的值。

拥塞判断:当发送方没有在规定时间内收到ACK应答报文,发送重传机制,就认为网络出现拥塞。

2. 如何避免网络拥塞?

答:
第一阶段:刚开始发送数据时,需要慢慢提高数据发送量。具体是慢启动技术,每当发送方收到一个ACK应答报文,拥塞窗口cwnd就加
1。

第二阶段:通过第一阶段,慢启动使得拥塞窗口值cwnd超过阈值ssthresh,这时使用拥塞避免算法,每收到一个ACK报文,cwnd的值增
加1/cwnd。

第三阶段:通过第二阶段,cwnd的值会一直增大,到一定程度肯定会发生网络拥堵,发生拥堵就会进行数据包重传,分为超时重传和快速重
传。在两种重传机制中,会通过降低cwnd的值来消除拥塞。
超时重传:一旦发生超时重传,阈值设置为cwnd/2,cwnd变为1。一下子回到第一阶段,重新进入慢启动过程。
快速重传:当接收方发现丢了一个数据包,发送三次前一个包的ACK,于是发送方就会快速重传,而不必超时重传。
此时先将cwnd变为原来一半,阈值ssthresh设置为cwnd,回到第二阶段。然后,进入快速恢复算法

快速恢复算法如下:

		1. 拥塞窗⼝ cwnd = ssthresh + 3 ( 3 的意思是确认有 3 个数据包被收到了);
		2. 重传丢失的数据包;
		3. 如果再收到重复的 ACK,那么 cwnd 增加 1; 如果收到新数据的 ACK 后,把 cwnd 设置为第二阶段中的 ssthresh 的值。
		
		(原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进⼊拥塞避免状态)

你可能感兴趣的:(tcp/ip,网络,网络协议)