knetstat est un simple module du noyau Linux qui ajoute quatre nouveaux fichiers à /proc/net
: tcpstat
, tcp6stat
, udpstat
et udp6stat
. Le contenu de ces fichiers est à peu près équivalent à la sortie de netstat
avec les options -t4an
, -t6an
, -u4an
et -u6an
respectivement, c'est-à-dire qu'ils fournissent des informations sur les sockets TCP et UDP sous une forme lisible par l'homme. La différence avec la sortie netstat
correspondante est qu'ils ont une colonne supplémentaire qui affiche (un sous-ensemble de) les options de socket. C'était la principale motivation pour écrire le module du noyau knetstat : actuellement, sous Linux, il n'y a aucun moyen pour un administrateur d'inspecter les options définies sur un socket créé par un processus (autre que l'utilisation strace
ou d'un outil équivalent sur ce processus lors de la création du socket. /heure de configuration), car ces informations ne sont pas exposées via le système de fichiers /proc
.
knetstat réutilise en interne l'infrastructure utilisée par le noyau pour générer le contenu des fichiers /proc/net/tcp
, /proc/net/tcp6
, /proc/net/udp
et /proc/net/udp6
. Cela signifie qu'il existe une correspondance biunivoque entre les entrées de ces fichiers et les entrées des fichiers générés par knetstat. Seuls le formatage et le contenu des informations sont différents entre les deux.
Voici un exemple de résultat :
$ cat /proc/net/tcpstat
Recv-Q Send-Q Local Address Foreign Address Stat Diag Options
0 0 127.0.0.1:6010 0.0.0.0:* LSTN SO_REUSEADDR=1,SO_KEEPALIVE=0,TCP_NODELAY=0
0 0 0.0.0.0:22 0.0.0.0:* LSTN SO_REUSEADDR=1,SO_KEEPALIVE=0,TCP_NODELAY=0
0 0 192.168.1.18:22 192.168.1.6:49537 ESTB SO_REUSEADDR=1,SO_KEEPALIVE=1,TCP_NODELAY=1
0 0 127.0.0.1:6010 127.0.0.1:45462 ESTB SO_REUSEADDR=1,SO_KEEPALIVE=0,TCP_NODELAY=1
0 0 127.0.0.1:45462 127.0.0.1:6010 ESTB SO_REUSEADDR=0,SO_KEEPALIVE=1,TCP_NODELAY=1
La colonne « Diag » peut afficher les indicateurs de diagnostic suivants :
Indicateur | Signification |
---|---|
>| | La fenêtre de l'expéditeur (c'est-à-dire la fenêtre annoncée par le point de terminaison distant) est 0. Aucune donnée ne peut être envoyée au homologue. |
|< | La fenêtre du récepteur (c'est-à-dire la fenêtre annoncée par le point de terminaison local) est 0. Aucune donnée ne peut être reçue du homologue. |
># | Il y a des paquets non reconnus et le dernier ACK a été reçu il y a plus d'une seconde. Cela peut indiquer qu'il y a des problèmes de réseau ou que le homologue est tombé en panne. |
SO_REUSEADDR
, SO_REUSEPORT
, SO_KEEPALIVE
(TCP), TCP_KEEPIDLE
(TCP), TCP_KEEPCNT
(TCP), TCP_KEEPINTVL
(TCP), SO_RCVBUF
, SO_SNDBUF
, SO_RCVTIMEO
, SO_SNDTIMEO
, SO_LINGER
(TCP), TCP_NODELAY
, TCP_FASTOPEN
, TCP_DEFER_ACCEPT
, SO_BROADCAST
(UDP) TCP_KEEPIDLE, TCP_KEEPCNT et TCP_KEEPINTVL correspondent aux valeurs tcp_keepalive_time, tcp_keepalive_probes et tcp_keepalive_intvl décrites dans tcp(7) et les sysctls respectifs. Si ces valeurs sont remplacées au niveau du socket (en les définissant sur autre chose que zéro), elles seront imprimées par knetstat, sinon le noyau utilisera sysctls et le module les ignorera lors de l'impression de la sortie.
Le code actuel de knetstat a été testé avec succès avec les versions de noyau 3.13, 3.18, 4.4, 4.8, 4.9 et 4.15. Cela peut également fonctionner avec d’autres versions.
Pour construire le module, assurez-vous que vous disposez des en-têtes du noyau actuellement en cours d'exécution ainsi que des outils de construction de base tels que make et GCC. Par exemple sur Ubuntu :
# apt-get install linux-headers-$(uname -r) make gcc
Ensuite, consultez le code source de knetstat et exécutez make
. Cela devrait créer knetstat.ko
qui peut être chargé en utilisant insmod
.
Le tableau suivant montre la correspondance entre les options de socket signalées par knetstat et les méthodes setter définies par la classe java.net.Socket
. Ces informations peuvent être utilisées pour déduire la configuration qu'un processus Java a appliquée à une instance java.net.Socket
en fonction de la sortie de knetstat. Le mappage est simple, sauf pour setSoTimeout
.
Méthode Java | Option de socket rapportée par knetstat |
---|---|
setKeepAlive | SO_KEEPALIVE |
setReceiveBufferSize | SO_RCVBUF |
setReuseAddress | SO_REUSEADDR |
setSendBufferSize | SO_SNDBUF |
setSoLinger | SO_LINGER |
setSoTimeout | aucun [*] |
setTcpNoDelay | TCP_NODELAY |
[*] Contrairement à ce que suggère le Javadoc, la méthode setSoTimeout
ne définit aucune option de socket sous Linux. Par défaut, les instances java.net.Socket
sont sauvegardées par java.net.SocksSocketImpl
(même si aucun proxy SOCKS n'est configuré). Cette classe étend java.net.AbstractPlainSocketImpl
qui stocke le délai d'attente en interne pour une utilisation ultérieure par les méthodes de lecture dans java.net.SocketInputStream
. Ils transmettent à leur tour le délai d'attente à une invocation de l'appel système poll
qui attend que les données soient disponibles pour la lecture (ou qu'une erreur se produise).