内核 TCP/IP 实现 - 关于接受队列

内核 TCP/IP 实现 - 关于接受队列

我最近正在学习 Linux 内核(版本 4.4)中的 TCP/IP 实现,并且对接受队列感到非常困惑。我知道有一个队列,struct inet_connection_sock其中称为接受队列:

struct inet_connection_sock {
    ...
    /* @icsk_accept_queue:     FIFO of established children */
    struct request_sock_queue icsk_accept_queue;
    ...
}

而且里面有一个qlenmember,我想它是用来表示队列长度的。

当 LISTEN 套接字收到 SYN 数据包时,在函数中tcp_conn_request,inet_csk_reqsk_queue_hash_add调用将新创建的 NEW_SYN_RECV sock 放入 ehash 表中(不是icsk_accept_queue)。但在inet_csk_reqsk_queue_hash_addinet_csk_reqsk_queue_added被称为增量icsk_accept_queue.len.我的问题是,qlen既然没有插入任何内容,为什么要增加icsk_accept_queue

更重要的是,tcp_conn_request也叫inet_csk_reqsk_queue_add添加一个快速打开的袜子(如果启用)icsk_accept_queue,但这个函数最终递增sk.sk_ack_backlog(通过调用sk_acceptq_added)而不是icsk_accept_queue.qlen......我错过了什么?

相关内容