我最近正在学习 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;
...
}
而且里面有一个qlen
member,我想它是用来表示队列长度的。
当 LISTEN 套接字收到 SYN 数据包时,在函数中tcp_conn_request
,inet_csk_reqsk_queue_hash_add
调用将新创建的 NEW_SYN_RECV sock 放入 ehash 表中(不是icsk_accept_queue
)。但在inet_csk_reqsk_queue_hash_add
,inet_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
......我错过了什么?