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上。在该瞬间或当光标在随后的循环中到达相同的插槽时,枢转到该插槽的三个计时器将终止。
本节说明在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控制块中的滴答数,以启动重传计时器。 确认到达时,通过将该值设置为零来停止重传计时器。 此方法最适合重传计时器永不过期的开始或停止情况。
您可以继续使用传统的重传计时器实现方法,直到出现以下任何一种情况:
重传计时器到期 快速重发阶段已打开以进行连接使用计时器轮方法,启动和停止计时器变得昂贵。 如果将插槽中的计时器实现为链接列表,则必须使用插槽链锁同步在列表中添加计时器或从中删除计时器。
另一方面,使用计时器轮算法来实现重发计时器提供了减少每笔交易处理开销的优点。 使用计时器轮时,插槽中只有那些计时器会在光标到达该计时器时到期。 您无需扫描所有PCB即可检查为每个连接设置了哪个计时器。
较低的计时器粒度实现使管理员可以将RTO值配置为低至10ms。 这对于运行在高速和低延迟网络(例如千兆位和10千兆位以太网)上的偶尔遇到丢包的TCP连接特别有用。
翻译自: https://www.ibm.com/developerworks/aix/library/au-lowertime/index.html
相关资源:高粒度模块化的前端开发