本帖最后由 lmarsin 于 2010-05-07 15:21 编辑
struct {...} icsk_ack 延时确认控制数据块,以下是对各字段的简要描述。 __u8 pending 标识当前需发送确认的紧急程度和状态。在数据从内核空间复制到用户空间时会检测该状态,如果需要则立即发送确认;而在计算rcv_mss时,会根据情况调整此状态。由于pending是按位存储的,因此多个状态可以同时存在。
pending
| 描述
| ICSK_ACK_SCHED
| 有ACK需要发送,是立即发送还是延时发送,还需要看其他标志,也是能否发送确认的前提。在接收到有负荷的TCP段后,会设置该标志。 | ICSK_ACK_TIMER | 延时发送ACK定时器已经启动。 | ICSK_ACK_PUSHED | 只要有ACK需要发送,并且pingpong为0时,ACK可以立即发送。 | ICSK_ACK_PUSHED2 | 只要有ACK需要发送,都可以立即发送,不管是否在快速发送模式中。 |
__u8 quick 标识在快速发送确认模式中,可以快速发送ACK段的数量。与pingpong一同作为判断是否在快速发送确认模式下的条件,如果要延时发送确认,则必须要在延时发送确认模式下。 __u8 pingpong 标识启用或禁用快速确认模式。通过TCP_QUICKACK选项可以设置其值。
pingpong | 描述 | 0
| 不延时ACK段的发送,而是进行快速发送。 | 1 | 将会延时发送ACK。 |
在快速确认模式下,会立即发送ACK。整个TCP处理过程中,如果需要还会进入到正常模式运行,也就是说,这个标志的设置不是永久性的,而只是在当时启用/禁用快速确认模式,在这之后,根据如延时确认超时、数据传输因素等,有可能会再次进入或离开快速确认模式。 __u8 blocked 软中断和用户进程是不能同时占有锁定套接口的,因此如果套接口已被用户进程锁定,而此时延时ACK定时器被触发,在逻辑上说此时应该发送ACK,但由于套接口被用户进程锁定了不能访问,因此只能置blocked标志为1,表示“套接口被用户进程锁定了,现不能发送ACK,如果有机会立即发送ACK”,这些机会包括接收到数据之后和将数据复制到用户空间之后。 __u32 ato 用来计算延时确认的估值,在接收到TCP段时会根据本次与上次接收的时间间隔来调整该值,而在设置延时确认定时器时也会根据条件调整该值。 unsignedlong timeout 当前的延时确认时间,超时后会发送ACK。 __u32 lrcvtime 标识最近一次接收到数据包的时间。 __u16 last_seg_size 最后一个接收到的段的长度,用来计算rcv_mss。 __u16 rcv_mss 由最近接收到段计算出的MSS,主要用来确定是否执行延时确认。 |