为 TCP 的重新传输实现更低的计时器粒度

来源:互联网 发布:星光是什么直播软件 编辑:程序博客网 时间:2024/06/06 00:09

2007 年 10 月 22 日

使用实现重新传输计时器的计时器轮算法来减少每个计时单元 (tick) 处理的开销。AIX® 传输控制协议(Transmission Control Protocol,TCP)共有七个计时器(每个连接),并使用全局计时器函数和两种粒度来实现这些计时器。在本文中,将研究如何通过使用 AIX TCP 快速计时器使重新传输计时器实现更低的粒度,并了解使用更低的计时器粒度的其他优点。

引言

AIX® 传输控制协议(Transmission Control Protocol,TCP)为每个连接维护七个计时器:

  • 连接建立 (Connection establishment)
  • 重新传输 (Retransmission)
  • 延迟确认(Delayed acknowledgment,ACK)
  • 持续 (Persist)
  • 保持连接 (Keepalive)
  • FIN_WAIT_2
  • TIME_WAIT

为了实现这些每个连接都包含的计时器,TCP 使用了一些全局计时器函数,它们提供了两种粒度:

  • tcp_fasttimo:每 200 毫秒调用它一次,并实现了快速计时器。
  • tcp_slowtimo:每 500 毫秒调用它一次,并实现了慢速计时器。

在 TCP 的重新传输计时器实现中,将重新传输超时存储于 TCP 控制块的计时单元中,其中一个计时单元 = 500 毫秒。当 TCP 的慢速计时器每隔 500 毫秒计时到期的时候,将调用 tcp_slowtimo。这个例程将遍历 TCP 控制块表,并且对每个连接的超时(以计时单元为单位进行指定)进行递减操作,即每次减一。当计时器的计时单元数达到零时,它将调用超时处理程序例程为该连接处理相应的超时。这个实现要求 TCP 计时器的下限为 500 毫秒。

正如您所知道的,TCP 根据所测量的往返时间,动态地计算超时。目前,TCP 重新传输超时的最小时间为 3 秒。然而,对于一些高速网络,如千兆位的以太网和万兆位的以太网,预期的往返时间(因此重新传输超时)要低得多。如果不进行传输,那么每秒钟将损失掉 120MB 的吞吐量。因此,我们需要一种更好的方法来处理高速的和低延迟的网络。

使用重新传输计时器来实现更低粒度的一种方式是,使用 TCP 的快速计时器(200 毫秒),可以将其缺省值设置为 50 毫秒,取代了原来的 200 毫秒。这种方法所带来的缺点是,处理以更高的速率扫描所有协议控制块 (PCB) 的开销。PCB 是为连接保存控制信息的一种内部结构。本文说明了基于计时器轮算法实现 TCP 的重新传输计时器的一种备选方法。

计时器轮算法

一个计时轮包含 N 个槽位。一个槽位代表一个时间单元,如 si(槽位时间间隔)。每经过一个时间单元,计时轮中的指针移动一个位置,就像时钟中的秒针一样。当指针移动到一个槽位时,例如 cs(当前槽),这表示在这个槽位中的计时器列表(如果存在的话)立即计时到期,或者当指针在后续周期中到达相同槽位时计时到期。

在将具有某个计时间隔的新的计时器,如 ti(时间间隔),添加到这个计时器轮时,将计算出这个新计时器的槽位 ts(计时器槽位),具体如下所示:

ts = ( cs + (ti / si)) % N

假定所有计时器的最大计时时间间隔都不超过某个上限(tmax)。如果 N 足够大,能够在从当前指针位置开始的一周之内容纳 tmax,那么当指针移动到一个特定的槽位时,该槽位中的所有计时器立即同时计时到期(而不是后继周期)。这样可以避免遍历该列表以检查现在哪些计时器计时到期,以及在后继周期中哪些计时器将计时到期。

例如,在下面的图 1 所示的计时轮中,共有 8 个槽位,编号从 0 到 7。您可以观察以槽位 1、3、5、4 和 6 为中心的计时器条目。目前,指针处于槽位 1。以该槽位为中心的三个计时器将立即计时到期、或者在后继周期中当指针达到相同槽处时计时到期。


图 1. 计时轮

使用计时器轮算法的 RTO 实现

这个部分说明了在 AIX 中使用计时器轮算法的重新传输超时 (RTO) 实现。在 AIX 中,将计时器轮中的槽位数目选择为 N=7000。该计时器轮实现的槽位时间间隔 (si) 可以使用 no 选项和 timer_wheel_tick 来进行配置。timer_wheel_tick 的取值范围从 0 到 100 个计时单元,其中每个计时单元 = 10 毫秒。因此,如果将 timer_wheel_tick 设置为 1,例如 10 毫秒,那么该计时器每个周期的计时时长是 N x si = 70 秒。因为 AIX TCP RTO 的最大值 (tmax) 是 64 秒,所以这个值足够大,可以确保在一个槽位中所有的重新传输计时器同时计时到期,而不需要等到后继的周期。

可以使用 no 选项和 tcp_low_rto 来配置 RTO 值。tcp_low_rto 的取值范围从 0 到 3000 毫秒。如果配置了该值,那么会将这个 RTO 值设置为该系统中所有 TCP 连接的初始重新传输超时。

即使配置了 tcp_low_rto,也只有在出现丢包的情况下,该算法才会对连接生效,如下面的图 2 所示。否则,使用这个算法是无效的。在重新传输计时器实现(用于未出现丢包情况的连接)的传统方法中,您所需要做的是,在 TCP 的控制块中设置计时单元数以启动重新传输计时器。当确认信息到达的时候,通过将该值设置为 0 来停止重新传输计时器。在重新传输计时器不可能计时到期的情况下,使用这一方法来进行启动或者停止是最有效的。

您可以继续使用重新传输计时器实现的传统方法,直到出现下面的任何一种情形为止:

  • 重新传输计时器计时到期
  • 对于某个连接,打开了快速重新传输阶段
本文转自:IBM developerWorks 中国
请点击此处查看全文 
原创粉丝点击