跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

这是您第一次登陆到 developerWorks,已经自动为您创建了您的概要文件。 选择您概要文件中可以公开的信息的信息(如姓名、国家/地区,以及公司),这些信息同时也会与您所发布的内容相关联。 您可以随时更新您的 IBM 账号。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

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

计时器轮算法如何减少开销

Venkat Venkatsubra (venkats@us.ibm.com), 软件开发人员, IBM
Photo of Venkat Venkatsubra
Venkat Venkatsubra 是 AIX I/O 开发领域的 IBM AIX Network(TCP/IP 协议和 STREAMS)团队的一名 TCEM 和开发人员。Venkat 从事 AIX 网络开发方面的工作已经有八年了。他是一位主要发明家,并且目前正在进行用于数据库集群的 Infiniband 技术的软件开发。Venkat 拥有印度 IIT Kharagpur 的计算机科学学士学位。您可以通过 venkats@us.ibm.com 与他联系。

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

发布日期: 2007 年 10 月 22 日
级别: 中级
访问情况 : 4639 次浏览
评论: 


引言

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 来停止重新传输计时器。在重新传输计时器不可能计时到期的情况下,使用这一方法来进行启动或者停止是最有效的。

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

  • 重新传输计时器计时到期
  • 对于某个连接,打开了快速重新传输阶段

图 2. 低粒度连接

A. 触发低 RTO 特性
连接的重新传输计时器首次计时到期,或者 打开了快速重新传输阶段。您为这个连接启用了更低粒度的重新传输计时器,并重新发送数据包。因为这是一次重新传输,所以您没必要为了响应时间跟踪 (RTT) 计算而对这个分段进行计时。通过将该计时器插入到计时器轮中合适的槽位来启动重新传输计时器。
B. 确认接收
接收到重新传输数据包的确认。删除重新传输计时器(从计时器轮中删除该计时器)。
C. 对分段进行计时
使用序列 'b' 发送一个分段,并且启动重新传输计时器。您可以通过存储时间戳对这个分段进行计时,以用于 RTT 计算。通过将该计时器插入到计时器轮中合适的槽位来启动重新传输计时器。
D. 处理计时分段接收到的 ACK
带有确认 'c' 的 ACK 比接收到的 'b' 更大。通过将计时器从计时器轮中删除,您可以停止重新传输计时器。当使用序列 'b' 发送该分段的时候,测量新的 RTT,使用当前时间减去存储的时间戳。所测量的 RTT 用于计算新的重新传输超时值。
E. 使用 RTO(作为每个低 RTO 特性进行计算)传输分段
将重新传输计时器插入到计时器轮中合适的槽位。
F. 重新传输计时器计时到期
一个使用计时器轮算法的连接的重新传输计时器计时到期。指针在计时器轮中移动到先前插入重新传输计时器的槽位。调用一个计时器处理例程以处理重新传输计时器的计时到期。

总结

使用计时器轮方法,在启动和停止计时器时将付出很大的代价。如果将槽位中的计时器实现为链表,那么在向该列表添加计时器或者从该列表删除计时器时,必须使用槽位链锁对其进行同步操作。

另一方面,使用计时器轮算法实现重新传输计时器,具有减少每个计时单元处理开销的优势。使用计时轮,当指针到达某个槽位时,只有该槽位中的计时器计时到期。您不需要扫描所有的 PCB,以检查为各个连接所设置的计时器。

更低粒度的计时器实现允许管理员配置低至 10 毫秒的 RTO 值。对于在高速的和低延迟的网络(如千兆位的和万兆位的以太网,可能会出现丢包的情况)中运行的 TCP 连接来说,这是特别有用的。


参考资料

学习

  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • AIX and UNIX 专区:developerWorks 的“AIX and UNIX 专区”提供了大量与 AIX 系统管理的所有方面相关的信息,您可以利用它们来扩展自己的 UNIX 技能。

  • AIX and UNIX 新手入门:访问“AIX and UNIX 新手入门”页面可了解更多关于 AIX 和 UNIX 的内容。

  • AIX 6 Wiki:发现 AIX 相关技术信息的协作环境。

  • Safari 书店:访问此电子参考资料库可查找特定的技术资源。

  • developerWorks 技术事件和网络广播:了解最新的 developerWorks 技术事件和网络广播。

  • Podcast:收听 Podcast 并与 IBM 技术专家保持同步。

获得产品和技术

  • IBM 试用软件:从 developerWorks 可直接下载这些试用软件,您可以利用它们开发您的下一个项目。

讨论

关于作者

Photo of Venkat Venkatsubra

Venkat Venkatsubra 是 AIX I/O 开发领域的 IBM AIX Network(TCP/IP 协议和 STREAMS)团队的一名 TCEM 和开发人员。Venkat 从事 AIX 网络开发方面的工作已经有八年了。他是一位主要发明家,并且目前正在进行用于数据库集群的 Infiniband 技术的软件开发。Venkat 拥有印度 IIT Kharagpur 的计算机科学学士学位。您可以通过 venkats@us.ibm.com 与他联系。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=AIX and UNIX
ArticleID=263655
ArticleTitle=为 TCP 的重新传输实现更低的计时器粒度
publish-date=10222007
author1-email=venkats@us.ibm.com
author1-email-cc=liuda@cn.ibm.com