停止等待协议

“停止等待”就是发送方在发送完一个分组后停止发送,等待接收方的确认后再继续发送。

超时重传

发送方在等待一定时间后如果还没有收到接收方的确认,此时发送方将认定分组没有送达,从而重新发送分组。

TCP通过以下的方式实现超时重传:

  • 超时计时器:每发送完一个分组后,tcp都会设置一个超时计时器。超时计时器的超时时间往往要大于报文的平均往返时间。
  • 分组副本:发送分组后,tcp会保留分组的副本,只有收到分组的确认后才会清除
  • 分组编号:TCP会对每一个分组编号,确认分组和发送的分组编号对应。

连续ARQ协议

如果TCP每发送一个分组就要等待的话,势必会浪费大量的时间,使得网络利用率降低。所以TCP采用了连续ARQ的方式,也就是每次发送多个分组,然后使用累积确认的方式确认。

  • 累积确认:接收方只对按序到达的最后一个分组发送确认。

假如发送方一次性发送了[1,2,3,4,5]五个分组,接收方只接受到了[1,2,4,5]四个分组。按照按序最后一个的规则,接收方只会发送 2 号分组的确认。发送方将收不到后面三个分组的确认,所以会重传3,4,5。

累积确认使用了滑动窗口实现,它的优点是不需要对每个分组发送确认,从而减少了网络开销。缺点是不能向发送方真实反映收到分组的信息,比如上面例子里,发送方认为 3 号分组以后的都没有收到,但是接收方其实是收到了4,5号分组的。

以字节为单位的滑动窗口

TCP可靠传输原理_计算机网络

发送方和接收方分别维护 发送窗口接收窗口 两个滑动窗口。

发送窗口维护了三个指针p1、p2、p3,它们划分了发送窗口的区域:

  • [p1, p2):等待确认区域,记录已发送但没收到确认的分组。
  • [p2, p3] :可用窗口,允许发送但是还未发送的分组。

既然是滑动窗口,那么它的左右边界应该是能够移动的,下面来分析发送窗口的左右边界的移动。

p2前移

p2指针指向的是第一个允许发送但还未发送的分组,所以p2的前移是发送方发送了新的分组。

p1前移

p1指针只有在收到确认后才会移动到被确认分组的下一个分组。

因为采用的累积确认的方式,接收方只会发送按序到达最后一个分组的确认,所以p1的前移可能不止一个分组。

比如向上图的情况,假如接收方收到了31,32,33三个分组,它只会发送按序到达最后分组的确认,也就是33号分组的确认。此时发送方的p1指针将会直接从31号位置移动到34号位置,也就是收到确认分组的下一个。

p3前移

p3的前移是收到接收方发送的确认报文窗口字段控制的。

窗口值表示从确认分组号开始到p3的分组数量。比如确认分组号为101,窗口值为200,那么p3就会移动到301的位置。

接收方通过窗口值来控制发送窗口的大小也叫做流量控制,这里不过多介绍。

TCP缓存

TCP既然能够保留未确认的分组以及按序发送确认,它肯定需要一个内存空间作为缓存,而不是直接用应用进程的内存。

TCP可靠传输原理_数据_02

如图所示,接收方和发送方各自维护了一个缓存,发送窗口和接收窗口都在这个缓存中。首先TCP缓存有以下特点:

  • 因为缓存空间和序号有限,TCP缓存是循环使用的,是一个环形的结构。
  • 滑动窗口只是缓存的一部分,已经确认的数据会被删除。

发送缓存和接收缓存结构相同但是作用不同。

发送缓存

  • 缓存应用程序让TCP发送的数据
  • 暂存已经发送但未收到确认的数据

接收缓存

  • 暂存未按序到达的数据
  • 缓存按序到达但没有被应用程序读取的数据

总结

  1. TCP可靠传输的原理是超时重传和连续ARQ
  2. 超时重传时间大于分组平均往返时间
  3. 连续ARQ采用了累积确认的方式发送确认
  4. TCP通过发送窗口和接收窗口实现可靠传输
  5. 发送窗口大小受到接收方的窗口值控制
  6. 滑动窗口是TCP缓存的一部分,TCP缓存是一个环形结构,还负责缓存应用程序数据