Crab213's Blog.

TCP/IP详解阅读笔记6:TCP超时与重发

2016/03/18

TCP重发机制

TCP协议在IP层之上实现了正确有序地发送数据。为了实现这个目的,每当TCP协议意识到有数据丢失时,他会重新发送数据。这种重发有两种不同的机制来实现。

基于超时的重发

TCP在发送数据的时候设置一个定时器,当定时器到时时,如果对面还没有发过来确认信息表明这个段被正确接收时,TCP就会重新发送这个段。这个定时器设定的时间被称作重发时限(RTO, retransmission timeout)。另一个重要的名词是往返时间(RTT, round-trip time)。每当TCP重发时限到了之后并且没有收到ACK后,TCP会重新发送这个段,并且把RTO设置成为原来的两倍,以此类推。实际上操作系统一般有两个预订的值,一个是超时重发的次数,另一个就是重发时限。

实际中的网络环境是相当复杂的。网络负载能力和最优路径以及PMTU是时刻发生变化的,这种情况下静态的RTO值已经不适用了,TCP需要动态决定RTO的值。可以根据动态的连接往返时间(RTT),就是一个段发出后到收到ACK的时间,来决定RTO在某一时刻的值。

快速重发

快速重发是一种使用接受方发送的反馈信息来判断是否需要重发的机制。很明显,这种机制更高效快速,不需要使用定时器。这个策略是根据收到的ACK来判断是否丢失了数据。ACK的值是当前接受方收到的最大的连续字节数+初始序列数(ISN)+1,说白了就是当前接收端想要收到的段的序号。显然,这个ACK的数值如果正常上涨,说明接收端收到这个数值以前所有的段,反之,如果这个数值没有变,说明接收端想要的这个字节没有收到。但是也很有可能是这个字节本身还在传输中,也许等一等可能对面就收到了,所以TCP会在三次收到重复的ACK之后重新发送这个数据。这就是TCP的快速重发机制(fast retransmit)。

接收方还可以通过TCP的SACK(selective acknowledgement)选项来告诉发送方它收到的ACK之后的字节。SACK是TCP头尾部可以附加的选项,接受方可以以此告知发送方它收到的字节有那些。在快速转发时,因为较少了额外的RTT, SACK可以有效减少额外的时间开销。

CATALOG
  1. 1. TCP重发机制
    1. 1.0.0.1. 基于超时的重发
    2. 1.0.0.2. 快速重发