一、TCP的可靠性
- 为了保证数据包的可靠性,发送方必须把已发送的数据包保留在缓冲区;
- 并为每个已发送的数据包启动一个超时定时器;
- 如在定时器超时之前收到了对方发来的应答信息(可能是对本包的应答,也可以是对本包后续包的应答),则释放该数据包占用的缓冲区;
- 否则,重传该数据包,直到收到应答或重传次数超过规定的最大次数为止;
- 接收方收到数据包后,先进行CRC检验,如果正确则把数据与交给上层协议,然后给发送方发送一个累计应答包,表明该数据已收到,如果接收方正好也有数据要发给发送方,应答包也可放在数据包中捎带过去。
二、拥塞的标志
- 重传计时器超时
- 接收到三个重复
三、慢开始与拥塞避免
慢开始
- 慢开始不是指cwnd(拥塞窗口)的增长速度慢(指数增长),而是指TCP发送设置cwnd=1
- 思路:不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小
- 为了防止cwnd增长过大引起网络拥塞,设置一个慢开始门限(ssthresh状态变量)
- 当cwnd<ssthresh,使用慢开始算法:拥塞窗口的两倍进行增长;
- 当cwnd=ssthresh,既可使用慢开始算法,也可以使用拥塞避免算法:拥塞窗口的基础上加一进行增长;
- 当cwnd>ssthresh,使用拥塞避免算法:拥塞窗口的基础上加一进行增长
拥塞避免(按线性规律增长)
- 拥塞避免并非完全能够避免拥塞,是说在拥塞避免阶段将拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞;
- 思路:让拥塞窗口cwnd缓慢地增大,即每经过一个往返时间RTT就把发送方的拥塞控制窗口加一;
- 出现网络拥塞后,更新门限值(ssthresh)为发生拥塞时拥塞窗口的0.5倍,并将拥塞窗口置为1,重新执行慢开始算法。
四、快重传于快恢复
快重传
- 快重传要求接收方在收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时捎带确认。
- 快重传算法规定:发送方只要一连收到三个重复确认,就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。
- 由于不需要等待设置的重传计时器到期,能尽早重传未被确认的报文段,能提高整个网络的吞吐量。
快恢复(与快重传配合使用)
- 采用快恢复算法时,慢开始只在TCP连接建立时和网络出现超时时才使用;
- 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半。但是接下去并不执行慢开始算法。
- 考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方现在认为网络可能没有出现拥塞。所以此时不执行慢开始算法,而是将cwnd设置为ssthresh的大小,然后执行拥塞避免算法。