저는 최근 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
...내가 무엇을 놓치고 있는 걸까요?