原理:Client/Server发送某个数据以后就开启一个计时器,在一定时间内如果没有得到发送数据包的ACK报文,
那么就重新发送数据,知道发送成功为止
超时和重传要做到的几点:(拥塞窗口记做cwnd,慢启动门限记做ssthresh)
1.RTT 发包往返时间测量
首先TCP必须测量在发送一个带有特别序号的字节和接受到包含该字节的确认之间的时间
2.RTO 重传超时时间
RTO的初始化是由公式决定的,例如最初的公式,初始的值应该是1。而修正公式,初始RTO应该是A+4D。
当数据正常传输的情况下,就会用上面的公式来更新各个数据,并重开定时器,来保证下一个数据被顺利传输。
要注意的是:重传的情况下,RTO不用上面的公式计算,而采用一种叫做“指数退避”的方式。
例如:当RTO为1S的情况下,发生了数据重传,就用RTO=2S的定时器来重新传输数据,下一次用4S。
一直增加到64S为止。
3.拥塞窗口和拥塞避免算法
拥塞窗口即为:发送方初始化一个报文段,随后调整为最大报文段,而不会导致网络拥塞
接受方:通告窗口,接受数据包缓存
实现过程:
1.)对一个给定的连接,初始化cwnd(拥塞窗口)为1个报文段,通告窗口为65535个字节
2.)TCP输出数据的输出不能超过cwnd和通告窗口的大小,拥塞避免是发送方的流量控制,通告窗口是接受方缓存大小
3.)当拥塞发送时,ssthresh被设置为当前窗口大小的一半(cwnd和接受方通告窗口大小的最小值,最小为2个报文段)
如果是超时引起的拥塞,则cwnd被设置为1个报文段,执行慢启动
4.)当新的数据被对方确认时,就增加cwnd,当cwnd小于或等于ssthresh,则进行慢启动,否则进行拥塞避免
4.慢启动
发送发第一次发送1个报文段,等待接受ACK确认包,如果未超时,在发送2个报文段,继续等待ACK确认,第3次发送
4个报文段,第4次发送8个报文段,第5次发送16个报文段,此后每次线性增加1个报文段,依次类推,知道ACK确认
超时
5.快速重传和快速恢复算法
当发送报文丢失,我们就要重传丢失的数据文段,不用等待超时定时器的溢出,直接重传,即为快速重传
接下来执行的不是慢启动算法,而是拥塞避免算法,这就是快速恢复算法
6.ICMP的差错
源站抑制,主机不可达或网络不可达,造成ICMP出错
当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生这个差错。
注意限定词“可能”。即使一个系统已经没有缓存并丢弃数据报,也不要求它一定要发送源站抑制报文。