差错控制

TCP使用差错控制来提供可靠性。差错控制包括以下的一些机制:

  1. 检测和重传受到损伤的报文段、

  2. 重传丢失的报文段、

  3. 丢弃重传的报文段并重传该报文段的ACK

  4. 保证接收缓冲区的报文段按序交给接收端的应用程序。

TCP通过三个简单的工具来完成其差错控制:检验和、确认以及重传。

检验和

每个报文都包含了一个检验和字段,用来检查报文段是否收到损伤。

TCP接收端在收到报文段后,在报文段的首部加上伪首部后,连同数据部分一块计算检验和,如果计算结果为全1,说明数据没有受到损伤。

如果某个报文段被检查出受到损伤,就由终点TCP将其丢弃,并被认为是丢失了。

确认

控制报文段不携带数据,但需要消耗一个序号,它也需要被确认,而ACK报文段永远不需要确认,ACK报文段不消耗序号,也不需要被确认。在以前,TCP只使用一种类型的确认:积累确认。目前有一些TCP实现还采用了选择确认。

  1. 积累确认(ACK)

    接收方通告它期望接收的下一个字节的序号,跳过所有失序到达并被保存的报文段。有时这被称为肯定积累确认或ACK。在TCP首部的32位ACK字段用于积累确认,而它的值仅在ACK标志为1时才有效。

  2. 选择确认(SACK)

    选择确认(selective acknowledgment)或SACK。SACK并没有取代ACK,而是向发送方报告了更多的信息。SACK要报告失序的数据块以及重复的报文段块。SACK是作为TCP首部末尾的选项来实现的。

  3. 产生确认的情况

    1. 当接收方收到发送方发来的按序到达的报文段时,就发送过一个ACK报文段;如果接收方也要向对方发送数据,可以将ACK报文捎带在所发的数据报文段中。

    2. 当收到的报文段的序号比期望的报文段的序号大时(期望的报文段丢失),接收方立即发送丢失的报文段的序号(即还是之前那个期望的序号);这将导致对丢失报文段的快重传。

    3. 当一个丢失的报文段到达时,接收方要发送ACK报文段,并宣布下一个所期望的序号。

    TCP并不会丢弃失序到达的报文段,而是将这些失序达到的报文段临时存放在接收缓冲区,并把它们标志位失序报文段,直到确实的报文段到齐。一定要记住:TCP永远都不会将失序的报文段交给接收进程。

    1. 接收方收到一个重复的报文段时,丢弃该报文段,并立即向发送端发送该报文段的ACK。

重传

差错控制机制的核心就是报文段的重传。在一个报文段发送时,它会被保存到一个队列中,直至被确认为止。当重传计时器超时,或者发送方收到该队列中第一个报文段的三个重复的ACK时,该报文段被重传。

  1. RTO重传(超时重传)

    发送方TCP的计时器时间到,TCP发送队列中最前面的报文段(即序列号最小的报文段),并重启计时器。在TCP中RTO的值是动态的,它根据报文段的往返时间(RTT)更新。TCP整个连接期间只有一个RTO计时器

  2. 三个重复的ACK报文段(快重传)

    三个重复ACK则立即重传丢失的报文段的规则。这一特性称为快重传(fast retransmission),如果针对某个报文段有三个重复的确认(即原始的ACK再加上三个完全一样的副本)到达,那么将立即重传,并重启RTO计时器,而不用等待计时器超时。

滑动窗口

TCP的滑动窗口主要有两个作用,一是提供TCP的可靠性,二是提供TCP的流控特性。同时滑动窗口机制还体现了TCP面向字节流的设计思路。

TCP是双工的协议,会话的双方都可以同时接收、发送数据。TCP会话的双方都各自维护一个“发送窗口”和一个“接收窗口”。其中各自的“接收窗口”大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的“发送窗口”则要求取决于对端通告的“接收窗口”,要求相同。

滑动窗口实现面向流的可靠性

最基本的传输可靠性来源于“确认重传”机制。

TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。

  1. 发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。

  2. 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。

与差错控制相关的攻击

有一类DoS攻击称为低速率DoS攻击。在这类攻击中,攻击者向网关或主机发送大量数据,使得受害系统持续处于重传超时的状态。由于攻击者可预知受害TCP何时启动重传,并在每次重传时生成并发送大量数据。因此,受害TCP总能感知到拥塞的存在,根据Karn算法不断减小发送速率并退避发送,导致无法正常使用网络带宽。

针对此类攻击的的预防方法是随机选择RTO(重传超时),使得攻击者无法预知确切的重传时间。