gpt4 book ai didi

c - 在 Linux 中使用 TCP 时,listen 的积压数量是否包括 SYN 接收的连接计数?

转载 作者:太空狗 更新时间:2023-10-29 17:12:09 24 4
gpt4 key购买 nike

我阅读了一些帖子并检查了 Linux 内核代码,如 inet_listen()-> inet_csk_listen_start()并且 listen() 系统调用的 backlog 参数似乎只影响接受队列,但不影响 SYN 接收队列:

sk->sk_max_ack_backlog = backlog;

即象征性地 accept-queue + syn-received-queue != backlog。我不知道发生了什么。 This article状态:

The maximum allowed length of both the Accept and SYN Queues is taken from the backlog parameter passed to the listen(2) syscall by the application.

但是MAN page里面没有类似的东西.

同样在 Linux 的情况下:backlog 是否如提到的提示 here或者它真的限制了队列?

最佳答案

如果是 4.3 内核,您指定它类似于:

tcp_v4_do_rcv()->tcp_rcv_state_process()->tcp_v4_conn_request()->tcp_conn_request()->inet_csk_reqsk_queue_is_full()

Here我们可以看到关于队列的最重要的细节:

/* TW buckets are converted to open requests without
* limitations, they conserve resources and peer is
* evidently real one.
*/
if ((sysctl_tcp_syncookies == 2 ||
inet_csk_reqsk_queue_is_full(sk)) && !isn) {
want_cookie = tcp_syn_flood_action(sk, skb, rsk_ops->slab_name);
if (!want_cookie)
goto drop;
}

/* Accept backlog is full. If we have already queued enough
* of warm entries in syn queue, drop request. It is better than
* clogging syn queue with openreqs with exponentially increasing
* timeout.
*/
if (sk_acceptq_is_full(sk) && inet_csk_reqsk_queue_young(sk) > 1) {
NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS);
goto drop;
}

请注意 inet_csk_reqsk_queue_is_full():

static inline int inet_csk_reqsk_queue_is_full(const struct sock *sk)
{
return inet_csk_reqsk_queue_len(sk) >= sk->sk_max_ack_backlog;
}

最后,它将当前队列 icsk_accept_queue 与之前由 inet_csk_listen_start() 设置的 sk_max_ack_backlog 大小进行比较。所以是的,在当前情况下,backlog 会影响传入队列

可以看到sk_acceptq_is_full()inet_csk_reqsk_queue_is_full()都比较了同一个socket的sk_max_ack_backlog,这是通过设置的>听():

static inline bool sk_acceptq_is_full(const struct sock *sk)
{
return sk->sk_ack_backlog > sk->sk_max_ack_backlog;
}

有用的链接:1 , 2

关于c - 在 Linux 中使用 TCP 时,listen 的积压数量是否包括 SYN 接收的连接计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58183847/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com