TCP拥塞控制是传输控制协议避免网络拥塞的算法,拥塞控制是防止过多的数据注入到网络中,可能使网络中的路由器或者链路过载,是一个全局性的过程。
拥塞的标志:重传计时器超时、接收到到三个重复确认
主要方式有慢启动、快重传、快恢复三个算法,
最初连接建立cwnd默认为一个报文段,ssthresh默认为65535个字节
慢启动:按线程控制窗口增长,每经过一个往返时间RTT就把发送方的拥塞控制窗口加一。
- 算法执行条件 cwnd <= ssthresh 探测网络的拥塞程度。
- 连接建立,进入慢启动 cwnd = 1
- 当网络流通时,慢启动算法是在传输还没有发生超时重传和ACK冗余时, cwnd = cwnd*2 窗口翻倍
- 当发生超时重传,则j将ssthresh设置为当前串口的一半,ssthresh = min(cwnd,rwnd) / 2,cwnd 重新设置为1
- 再次进入慢启动,当发生ACK冗余重传报文段的时候进入快重传、快恢复阶段。
拥塞避免算法:
- 当cwnd > ssthresh拥塞窗口大于慢启动门限的时候就会进入拥塞控制,拥塞窗口线性增长,即每次cwnd + 1。
- 当出现超时重传时处理方法与慢启动方法相同,即ssthresh = min(cwnd,rwnd) / 2,cwnd = 1,进入慢启动
- 当出现冗余ack的时候则进入快重传,快恢复算法。
快重传:
快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到自己发送数据时捎带确认。
快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网络的吞吐量
快恢复算法:
- 将慢启动门限设置为当前窗口的一半,即ssthresh = min(cwnd,rwnd)/2,并且cwnd = ssthresh。
- 当出现冗余ack而重传下一个报文段的时候严格上不算是拥塞导致的。所以直接进入拥塞避免。
超时重传和冗余ack处理比较:
相同:慢启动门限都要设置为当前发送窗口的一半
不同:超时重传还得将拥塞窗口大小设为1,重新进入慢启动,而冗余ack则是将拥塞窗口设为慢启动门限大小并且进入拥塞避免。