TCP延迟确认定时器:
TCP延迟确认定时器是指在一个TCP连接中,当一方收到另一端的数据之后,并不是立马返回ACK进行确认。而是等待200ms(在linux-2.6.38内核实现中应该是40ms),如果这段时间内有新的数据要发往对方,本地将ACK和数据封装在一个数据包中一起发送,称作捎带确认机制。超时后即使没有新数据的话也要将ACK发给对方。
tcp_delack_timer延迟确认定时器处理流程如下:
TCP延迟确认定时器是指在一个TCP连接中,当一方收到另一端的数据之后,并不是立马返回ACK进行确认。而是等待200ms(在linux-2.6.38内核实现中应该是40ms),如果这段时间内有新的数据要发往对方,本地将ACK和数据封装在一个数据包中一起发送,称作捎带确认机制。超时后即使没有新数据的话也要将ACK发给对方。
这样做的好处是减少了一次数据传输带来的消耗,但是在另一方面增加了延迟。可以通过设置快速确认模式关闭该定时器。
sock结构在初始化时将tcp_delack_timer注册为延迟确认定时器的处理函数。tcp_send_delayed_ack函数会启动延时确认定时器发送延迟ACK,主要的代码如下:
/* Stay within the limit we were given */
timeout = jiffies + ato; //超时时间根据ato设置
/* ...... */
icsk->icsk_ack.pending |= ICSK_ACK_SCHED | ICSK_ACK_TIMER; //设置ICSK_ACK_SCHED和ICSK_ACK_TIMER标志位
icsk->icsk_ack.timeout = timeout;
sk_reset_timer(sk, &icsk->icsk_delack_timer, timeout); //重设延迟确认定时器
tcp_delack_timer延迟确认定时器处理流程如下: