TCP提供可靠的运输层。它使用的方法之一就是确认从另一端收到的数据。但数据和确认都有可能会丢失。 TCP通过在发送时设置一个定时器来解决这种问题。如果当定时器溢出时还没有收到确认,它就重传该数据。
拥塞避免算法和慢启动算法
拥塞避免算法和慢启动算法需要对每个连接维持两个变量:一个拥塞窗口cwnd和一个慢启动门限ssthresh。其中的工作原理如下:
1)对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节
2)TCP输出不能超过cwnd和接收方的通告窗口的大小。拥塞避免是发送方使用的流量控制,而通告窗口是对接收方的流量控制。
拥塞避免是发送端感受到网络拥塞的估计,通告窗口是接收方在改连接上的可用缓存大小。
3)当拥塞发送时(超时或者受到重复确认),ssthresh被设置为当前窗口大小的一半即cwnd的一半)。如果是超时引起的拥塞,cwnd被设置成一个报文段。
4)当新的数据被对方确认,就增加cwnd,具体操作如下:
4.1)当cwnd<ssthresh,使用慢启动(每次受到确认,cwnd+1)
4.2)当cwnd>ssthresh,使用拥塞算法(每次受到确认,cwnd+=1/cwnd)
4.3)当cwnd=ssthresh,以上两种算法都可以
快速重传与快速恢复算法
TCP Reno算法
1)当收到第三个重复的ACK时,将ssthresh设置成当前拥塞窗口的一半(cwnd/2)。重传丢失报文段。设置cwnd为ssthresh加上3倍的报文段大小。
2)每次受到另外一个重复的ACK时,cwnd增加1个报文段大小并发送一个分组
3)当下一个确认新数据的ACK到达时,设置cwnd为ssthresh,进入拥塞避免阶段
这个算法存在问题,多个报文同时丢失的情况下会出现性能问题。因为会多次执行快速重传和快速恢复算法
TCP NEW Reno算法
当发送方这边收到3个重复,进入快速重传模式,开始重传丢失的包,如果只有一个包丢失,那么重传这个包后回来的ack就是发送方数据的ack。
否则就说明有多个包丢失,我们叫这个ACK为partial ACK。一旦发送方发现了partial ACK出现,那么发送方就继续推理出来有多个包丢失了,
于是继续重传丢失的包,知道不在出现partial ACK,整个过程结束。