超时与重传
对于每个连接,TCP管理4个定时器:
- 重传定时器
- 坚持(persist)定时器
- 保活(keepalive)定时器
- 2MSL定时器
指数退避:同一分组的重传时间间隔成指数增长(1.5、3、6、12、24、48、64、...秒)
RTO(Retransmission TimeOut 重传超时时间):进行下一次重传的等待时间
RTO的值根据RTT历史值和最新测量值来动态更新(公式省略)
重传多义性问题:如果某分组重传多次,返回的ACK是对哪次的确认?这种情况下无法确定起始时间,也就无法计算RTT,按照Karn算法不更新RTO值,除非没被重传的分组收到确认;
RTT是如何计算的?
TCP设定固定时长(500ms)的定时器,并不断累计定时次数(因此RTT的值是500ms的倍数)
上图中的报文段4、7、9不能被计时,因为定时器已经被使用
拥塞避免
拥塞处理
按照上图,发生拥塞后分组45丢失,但是后续分组仍继续发送;因失序,46~59被保存至接收方的缓存中,接收到重传分组63后,将所有内存数据一起重组后提交给应用程序;
当分组45丢失后,回复重复确认(ack 6657),直到接收到丢失分组后才更新(ack 8961);
拥塞避免算法
拥塞避免算法是一种处理丢失分组的方法
如何知道丢失分组?发生超时或接收到重复确认
现在除了拥塞窗口,还需要增加一个慢启动门限(ssthresh)的指标;刚开始传输时进入慢启动状态,如果超时,cwnd=1且ssthresh=当前窗口/2(>=2),重新开始慢启动(cwnd呈指数增加),但当cwnd>ssthresh时,进入拥塞避免(cwnd+=1/cwnd);
快速重传
当收到3个或以上重复ACK时,立即重传丢失报文,不用等待超时定时器的溢出;这时会进入拥塞避免状态;
ICMP差错
TCP最常收到的ICMP差错及处理:
- 源站抑制:cwnd被置1发起慢启动(ssthresh不变)
- 主机不可达/网络不可达:忽略
重新分组
TCP超时并重传,不一定重传同样的报文;TCP允许重新分组而发送一个较大的报文,提高性能;
上图中“hello there\0”(12字节)发送后收到确认,但发送“line number 2\0”(14字节)时掉线,引起不断重发,但当键入第三行“and 3\0”(6字节)后,被重新分组(20字节)一起发送;