AIX®传输控制协议(TCP)为每个连接维护七个计时器:
- 建立连接
- 重传
- 延迟确认(ACK)
- 坚持
- 活着
- FIN_WAIT_2
- 时间的等待
为了实现这些每连接计时器,TCP使用提供两种粒度的全局计时器功能:
-
tcp_fasttimo
:每tcp_fasttimo
调用一次,并实现快速计时器。 -
tcp_slowtimo
:每500毫秒调用一次,并实现慢速计时器。
使用TCP的重传计时器实现,重传超时以tick单位存储在TCP的控制块中,其中一个tick = 500ms。 当TCP的慢速计时器每500ms到期时,将调用tcp_slowtimo
。 该例程遍历TCP控制块表,并且对于每个连接,它将超时(以滴答为单位指定)减1。 当计时器的滴答数达到零时,它将调用超时处理程序例程以处理该连接的相应超时。 此实现对TCP计时器施加了500ms的下限。
如您所知,TCP根据TCP测量的往返时间动态计算超时。 当前,TCP重传超时至少需要三秒钟。 但是,对于高速网络(例如千兆以太网和10千兆以太网),往返时间(因此重传超时)预计会低得多。 您不传输的每秒每秒丢失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。 可以使用timer_wheel_tick
的no
选项来配置计时器轮实现的时间间隔( si
)。 timer_wheel_tick
的值范围是0到100个刻度,其中一个刻度= 10ms。 因此,如果将timer_wheel_tick
设置为1,例如10ms,则每个周期的定时器周期为N×si = 70秒。 由于AIX TCP RTO的最大值( tmax
)为64秒,因此该值足够大,可以确保插槽中的所有重传计时器在同一时间到期,而不会在随后的周期中到期。
可以使用tcp_low_rto
的no
选项配置RTO值。 tcp_low_rto
的值范围是0到3000毫秒。 如果已配置,则将RTO值设置为系统上所有TCP连接的初始重传超时。
即使已配置tcp_low_rto
,该算法也只有在遇到丢包情况时才对连接生效,如下图2所示。 否则,使用此算法效率不高。 在不经历丢包的连接的传统重传计时器实现方法中,您要做的就是设置TCP控制块中的滴答数,以启动重传计时器。 确认到达时,通过将该值设置为零来停止重传计时器。 此方法最适合重传计时器永不过期的开始或停止情况。
您可以继续使用传统的重传计时器实现方法,直到出现以下任何一种情况:
- 重传计时器到期
- 快速重发阶段已打开以进行连接
图2.低粒度连接
-
A.触发低RTO功能
- 重传计时器第一次过期,直到第一次连接或打开快速重传阶段。 您为此连接的重传计时器启用较低的粒度,然后重新发送数据包。 由于这是重传,因此您无需为此段计时,以进行响应时间跟踪(RTT)计算。 通过将计时器插入计时器轮中的适当插槽来启动重传计时器。 B.确认收据
- 接收到对重发数据包的确认。 取消重传计时器(从计时器轮上卸下计时器)。 时间段
-
发送带有序列
'b'
然后启动重传计时器。 您可以通过存储时间戳为RTT计算计时此段。 通过将计时器插入计时器轮中的适当插槽来启动重传计时器。
D.处理在一个定时段收到的ACK
-
接收到确认
'c'
大于'b'
的ACK。 您可以通过从计时器轮上卸下计时器来停止重传计时器。 您可以将新RTT度量为当前时间减去发送带有序列'b'
的段时的存储时间戳。 测得的RTT用于计算新的重传超时值。
E.传输具有根据低RTO功能计算的RTO的段
- 重传计时器插入计时器轮中的适当插槽中。 F.重传计时器到期
- 对于使用计时器轮算法的连接,重传计时器到期。 光标将移至计时器轮中先前已插入重传计时器的插槽。 调用计时器处理例程以处理重传计时器到期。
摘要
使用计时器轮方法,启动和停止计时器变得昂贵。 如果将插槽中的计时器实现为链接列表,则必须使用插槽链锁同步在列表中添加计时器或从中删除计时器。
另一方面,使用计时器轮算法来实现重发计时器提供了减少每笔交易处理开销的优点。 使用计时器轮时,插槽中只有那些计时器会在光标到达该计时器时到期。 您无需扫描所有PCB即可检查为每个连接设置了哪个计时器。
较低的计时器粒度实现使管理员可以将RTO值配置为低至10ms。 这对于运行在高速和低延迟网络(例如千兆位和10千兆位以太网)上的偶尔遇到丢包的TCP连接特别有用。
翻译自: https://www.ibm.com/developerworks/aix/library/au-lowertime/index.html