xTCP数据传输过程

发送端和接受端经过三次握手建立一个TCP连接后,便开始进行数据传输,然后再经过四次挥手断开连接。

TCP重传机制

TCP号称传输过程数据是完整的,可靠的,这就需要对网络中各种丢数据的情况进行处理,其中包括网络延迟,阻塞等造成的数据包丢失等情况。

TCP超时重传机制

造成超时重传的原因:

  1. 我发送给你的数据,由于某种原因丢失了。
  2. 我发送给你的数据,你收到后,没有返回ACK。
  3. 我发送给你的数据,你收到后并返回了ACK,但是ACK丢了。

相关概念:

  1. RTT(Round Trip Time) : 往返时间,简单理解为:发生端发送TCP数据到接受端返回ACK之间用的时间。
  2. RTO(Retransmission Time Out) : 超时重传时间,指发送端发送数据后,重传数据前等待接收方收到该报文的ACK时间。其工作方式为:> 当TCP实体发送一个段时,他同时启动一个重传计时器,如果该计时器在超时之前该段被确认,则计时器被停止。另一方面,如果在确认到来之前计时器超时,则段被重传(并且该计时器被重新启动)。
  3. 指数退避:检查连续重传之间不同的时间差,它们取整后分别是1、3、6、12、24、48和多个64秒,其中第一次发送后设置的超时时间设置为1.5秒。(2的N次方*1.5秒)

RTO和RTT的关系:RTO大小由RTT计算得出,至于RTT和RTO具体计算方法比较复杂,这里给出简单计算公式,感兴趣可以参考<<TCP/IP详解>>。

  1. 平滑的RTT估计器:R=alpha*R+(1-alpha)*M,其中alpha=0.9, M是ACK测量到的RTT。
  2. 最初RTO=R*beta, beta=2,但该方法在RTT变化很大时会引起不必要的重传。

重传的多义性问题(Karn算法):

假如发送一个分组,当发生超时,RTO指数退避,重传该分组,然后收到ACK。此时但并不能确定这个ACK是针对第一个分组还是重传分组,这就是重传多义性问题。 当一个超时和重传发生时,在重传数据的最后确认到达之前,不能更新RTT估计器,因为我们并不知道ACK对应哪次传输。并且由于数据被重传,RTO得到一个指数退避,我们在下一次传输时,使用这个退避后的RTO。对于一个没有被重传的数据而言,除非收到一个确认,否则不要重新计算新的RTO。