Y a-t-il un moyen de voir la longueur de la file d'attente sur la prise d'écoute sous Linux, de la même manière que la commande netstat -L
le fait pour FreeBSD ? C'est-à-dire que vous pouvez voir X/Y/Z dans la sortie de netstat -L
, mais netstat sous Linux ne prend pas en charge le drapeau -L
.
Réponses
Trop de publicités?Jetons un coup d'œil au code source, car c'est la meilleure documentation dans le monde de l'open source.
net/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;
}
La même chose que l'on peut voir dans les sockets de domaine 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);
}
Donc.
Si la socket est établie, Recv-Q et Send-Q signifient des octets comme décrit dans la documentation.
Si la socket est en écoute, Recv-Q signifie la taille actuelle de la file d'attente, et Send-Q signifie le backlog configuré.
Aller plus loin dans les mans nous donne ce qui suit dans sock_diag(7):
UDIAG_SHOW_RQLEN
L'attribut rapporté en réponse à cette demande est
UNIX_DIAG_RQLEN. La charge associée à cet attribut est représentée dans la structure suivante :
struct unix_diag_rqlen {
__u32 udiag_rqueue;
__u32 udiag_wqueue;
};
Les champs de cette structure sont les suivants :
udiag_rqueue
Pour les sockets en écoute : le nombre de connexions en attente. La longueur du tableau associé à l'attribut de réponse UNIX_DIAG_ICONS est
égal à cette valeur.
Pour les sockets établies : la quantité de données dans la file d'attente entrante.
udiag_wqueue
Pour les sockets en écoute : la longueur de la file d'attente qui
est égale à la valeur passée comme deuxième argument à listen(2).
Pour les sockets établies : la quantité de mémoire
disponible pour l'envoi.
En d'autres termes, ss -ln
est la seule commande dont vous avez besoin
Je ne connais pas de moyen simple de voir cela sur Linux. Recv-Q et Send-Q ne sont pas des files d'attente d'écoute. Ils représentent le nombre d'octets non copiés par le programme utilisateur connecté au socket et non encore accusés par l'hôte distant (voir man netstat). Ils concernent donc les connexions établies. La file d'écoute (acceptation) est l'endroit où le noyau stocke les nouvelles connexions entrantes jusqu'à ce que votre application appelle la fonction accept().
awk
peut vous aider :
netstat -ntp | awk '{ if ($6 == "ESTABLISHED" && $7 == "-") arrQueue[$4] += 1; } END { for (service in arrQueue) print service" "arrQueue[service] }'
Source : http://mysyslog.ru/posts/633
En plus de ss (iproute classique), il y a ss2 (pyroute) pour le faire.