有没有办法在 Linux 下查看监听套接字上的队列长度,就像 FreeBSD 的输出一样netstat -L
?也就是说,您可以在输出中看到 X/Y/Z netstat -L
,但 Linux 下的 netstat 不支持-L
标志。
答案1
让我们研究一下源代码,因为它是开源世界中最好的文档。
净/ipv4/tcp_diag.c:
if (sk->sk_state == TCP_LISTEN) {
r->idiag_rqueue = sk->sk_ack_backlog;
r->idiag_wqueue = sk->sk_max_ack_backlog;
} else {
r->idiag_rqueue = max_t(int, tp->rcv_nxt - tp->copied_seq, 0);
r->idiag_wqueue = tp->write_seq - tp->snd_una;
}
我们可以在unix域套接字net/unix/diag.c中看到同样的事情:
if (sk->sk_state == TCP_LISTEN) {
rql.udiag_rqueue = sk->sk_receive_queue.qlen;
rql.udiag_wqueue = sk->sk_max_ack_backlog;
} else {
rql.udiag_rqueue = (u32) unix_inq_len(sk);
rql.udiag_wqueue = (u32) unix_outq_len(sk);
}
所以。
如果套接字已建立,则 Recv-Q 和 Send-Q 表示字节,如文档中所述。
如果套接字正在监听,则 Recv-Q 表示当前队列大小,而 Send-Q 表示配置的积压。
更深入地了解人类,让我们跟随sock_diag(7):
UDIAG_SHOW_RQLEN
The attribute reported in answer to this request is
UNIX_DIAG_RQLEN. The payload associated with this
attribute is represented in the following structure:
struct unix_diag_rqlen {
__u32 udiag_rqueue;
__u32 udiag_wqueue;
};
The fields of this structure are as follows:
udiag_rqueue
For listening sockets: the number of pending
connections. The length of the array associated
with the UNIX_DIAG_ICONS response attribute is
equal to this value.
For established sockets: the amount of data in
incoming queue.
udiag_wqueue
For listening sockets: the backlog length which
equals to the value passed as the second argu‐
ment to listen(2).
For established sockets: the amount of memory
available for sending.
换句话说,ss -ln
这是您需要的唯一命令
答案2
ss -l
显示正确的 Recv-Q Send-Q。
答案3
据我所知,在 Linux 上没有简单的方法可以查看这一点。Recv-Q 和 Send-Q 不是监听队列。它们是连接到套接字的用户程序未复制且未被远程主机确认的字节数(请参阅 man netstat)。因此它们与已建立的连接有关。监听(接受)队列是内核保留新传入连接直到应用程序调用 accept() 的地方。
答案4
除了 ss(经典 iproute),还有ss2(吡咯烷酮)现在就可以这样做。