是什么导致“SYN to LISTEN 套接字丢失”?

edl*_*erd 3 networking linux ubuntu netstat

一个非常繁忙的代理服务器有很多“SYNs to LISTEN sockets drops”。

我了解到一个原因可能是积压量太小。但在这种情况下,“套接字的监听队列溢出的次数”值应该相等(事实并非如此)。

那么这种行为的原因可能是什么?也许是坏的网卡?

我们有 5 个代理,其中两个数字不相等,所以这个问题似乎发生在那里。

这是 netstat 的输出:

$ netstat -s | grep -i list
238627 times the listen queue of a socket overflowed
8610307 SYNs to LISTEN sockets dropped
Run Code Online (Sandbox Code Playgroud)

服务器有 ipv4 和 ipv6 流量,也许有帮助?

bod*_*git 6

这些计数器最终来自内核并映射到LINUX_MIB_LISTENOVERFLOWSLINUX_MIB_LISTENDROPS计数器。您可以从net/ipv4/tcp_ipv4.c(tcp_v4_syn_recv_sock)的源代码#1392 附近看到,当LINUX_MIB_LISTENOVERFLOWS增加时,LINUX_MIB_LISTENDROPS也会增加,但有退出条件,只有后者可以增加,所以这不是他们不做的错误不匹配。

在同一个文件中,您可以看到以下代码:

1291 int tcp_v4_conn_request(struct sock *sk, struct sk_buff *skb)
1292 {
1293         /* Never answer to SYNs send to broadcast or multicast */
1294         if (skb_rtable(skb)->rt_flags & (RTCF_BROADCAST | RTCF_MULTICAST))
1295                 goto drop;
1296 
1297         return tcp_conn_request(&tcp_request_sock_ops,
1298                                 &tcp_request_sock_ipv4_ops, sk, skb);
1299 
1300 drop:
1301         NET_INC_STATS_BH(sock_net(sk), LINUX_MIB_LISTENDROPS);
1302         return 0;
1303 }
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到至少一个原因是广播或多播地址的 SYN。