私は最近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
、キューの長さを表すのに使われるようです。
LISTENソケットがSYNパケットを受信すると、関数内tcp_conn_request
、inet_csk_reqsk_queue_hash_add
この呼び出しは、新しく作成されたNEW_SYN_RECVソックスを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
…私が何を見逃しているのでしょうか?