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. 计时轮
这个部分说明了在 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 来停止重新传输计时器。在重新传输计时器不可能计时到期的情况下,使用这一方法来进行启动或者停止是最有效的。
您可以继续使用重新传输计时器实现的传统方法,直到出现下面的任何一种情形为止:
- 重新传输计时器计时到期
- 对于某个连接,打开了快速重新传输阶段
请 点击此处查看全文