TCP相关内容 | 青训营

68 阅读3分钟

TCP相关内容 | 青训营

继续总结一下TCP的内容,尝试理解拥塞控制和链接队列的内容。

网络作为传输数据的媒介,如果出现了拥堵情况,就可能导致数据包的延迟或者丢失,根据TCP的机制,会触发重传机制。又有大量的数据包加入到本就拥堵的网络环境,这反而大大增加了网络负担,如此恶性循环,就可能有严重后果,这就需要避免发送数据的一方无脑发送数据,要有计划节制的发送。就有了拥塞控制(cwnd)。

拥塞控制本质是一个发送方维护的状态变量,是动态变化的。他主要设计四个算法:慢启动、拥塞避免、拥塞发生、快速恢复。

慢起动:就是TCP刚刚建立连接后,发送得数据是一点点提高数量的,而不是一上来就火力全开,他的一个原则是发送方没收到一个ACK报文,拥塞窗口cwnd就会加一。比如刚刚建立链接,拥塞窗口cwnd为2,发送两个数据包,顺利收到两个ACK报文,那么此时拥塞窗口cwnd就变成4了,下次顺利收到4个ACK报文,拥塞窗口cwnd就变成8....可以发现是指数增长的形式。当然他不会一直上涨下去,当其大于等于慢启动门限 ssthresh 时(一般是65535字节),就不在使用慢起动算法,而是改为拥塞避免算法。

拥塞避免:它的规则是:每当收到一个 ACK 时,cwnd 增加 1/cwnd。比如到了100,当收到100个ACK报文,cwnd增加 100 * (1 / 100) = 1 个。增长不是指数了,变缓了许多。当然数据不会一直顺利的传输,一旦发生了网络拥塞,就会重传数据包,从而进入下一个算法机制:拥塞发生算法。

超时重传的拥塞发生算法:ssthresh 设为此时 cwnd/2 ,cwnd则回复到初始值。那么接下来就会启动慢启动机制,这之间有一个大的落差,并不是一个人最优方法。

快速重传的拥塞发生算法:用快速重传(收到了三个一样的ACK报文),发送方知道数据丢失的详细情况,一般是丢失一线部分数据,此时会把cwnd 设置为原来的一半,令 ssthresh = cwnd。随后启动快速回复算法。

快速回复算法过程如下:首先 ssthresh = cwnd/2,拥塞窗口 cwnd = ssthresh + 3 ( 3 的意思是确认有 快速重传的3 个数据包被收到了)、随后重传丢失的数据包,若顺利收到对应的ACK,那么cwnd += 1,如果收到新数据的ACK,就把cwnd 设置为第一步的 ssthresh ,到此恢复过程结束了