knetstat ist ein einfaches Linux-Kernelmodul, das vier neue Dateien zu /proc/net
hinzufügt: tcpstat
, tcp6stat
, udpstat
und udp6stat
. Der Inhalt dieser Dateien entspricht in etwa der Ausgabe von netstat
mit den Optionen -t4an
, -t6an
, -u4an
und -u6an
, dh sie liefern Informationen über TCP- und UDP-Sockets in für Menschen lesbarer Form. Der Unterschied zur entsprechenden netstat
Ausgabe besteht darin, dass sie über eine zusätzliche Spalte verfügt, die (eine Teilmenge) der Socket-Optionen anzeigt. Dies war die Hauptmotivation für das Schreiben des Knetstat-Kernelmoduls: Derzeit gibt es unter Linux für einen Administrator keine Möglichkeit, die Optionen zu überprüfen, die für einen Socket festgelegt wurden, der von einem Prozess erstellt wurde (außer der Verwendung strace
oder einem gleichwertigen Tool für diesen Prozess bei der Socket-Erstellung). /Konfigurationszeit), da diese Informationen nicht über das /proc
Dateisystem verfügbar gemacht werden.
knetstat verwendet intern die Infrastruktur wieder, die vom Kernel verwendet wird, um den Inhalt der Dateien /proc/net/tcp
, /proc/net/tcp6
, /proc/net/udp
und /proc/net/udp6
zu generieren. Dies bedeutet, dass zwischen den Einträgen in diesen Dateien und den Einträgen in den von knetstat generierten Dateien eine Eins-zu-eins-Entsprechung besteht. Lediglich die Formatierung und der Informationsgehalt unterscheiden sich zwischen beiden.
Hier ist eine Beispielausgabe:
$ 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
In der Spalte „Diag“ können folgende Diagnoseindikatoren angezeigt werden:
Indikator | Bedeutung |
---|---|
>| | Das Absenderfenster (dh das vom Remote-Endpunkt angekündigte Fenster) ist 0. Es können keine Daten an den Peer gesendet werden. |
|< | Das Empfängerfenster (dh das vom lokalen Endpunkt angekündigte Fenster) ist 0. Vom Peer können keine Daten empfangen werden. |
># | Es liegen unbestätigte Pakete vor und die letzte Bestätigung wurde vor mehr als einer Sekunde empfangen. Dies kann ein Hinweis darauf sein, dass Netzwerkprobleme vorliegen oder der Peer abgestürzt ist. |
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 und TCP_KEEPINTVL entsprechen den in tcp(7) und den jeweiligen Sysctls beschriebenen Werten tcp_keepalive_time, tcp_keepalive_probes und tcp_keepalive_intvl. Wenn diese Werte auf Socket-Ebene überschrieben werden (indem sie auf einen anderen Wert als Null gesetzt werden), werden sie von knetstat gedruckt. Andernfalls verwendet der Kernel sysctls und das Modul ignoriert sie beim Drucken der Ausgabe.
Der aktuelle Knetstat-Code wurde erfolgreich mit den Kernel-Versionen 3.13, 3.18, 4.4, 4.8, 4.9 und 4.15 getestet. Möglicherweise funktioniert es auch mit anderen Versionen.
Stellen Sie zum Erstellen des Moduls sicher, dass Sie über die Header für den aktuell ausgeführten Kernel sowie über die grundlegenden Build-Tools wie make und GCC verfügen. ZB auf Ubuntu:
# apt-get install linux-headers-$(uname -r) make gcc
Schauen Sie sich dann den Knetstat-Quellcode an und führen Sie make
aus. Dadurch sollte knetstat.ko
erstellt werden, das mit insmod
geladen werden kann.
Die folgende Tabelle zeigt die Entsprechung zwischen den von knetstat gemeldeten Socket-Optionen und den von der Klasse java.net.Socket
definierten Setter-Methoden. Diese Informationen können verwendet werden, um basierend auf der Ausgabe von knetstat die Konfiguration abzuleiten, die ein Java-Prozess auf eine java.net.Socket
-Instanz angewendet hat. Die Zuordnung ist bis auf setSoTimeout
unkompliziert.
Java-Methode | Von knetstat gemeldete Socket-Option |
---|---|
setKeepAlive | SO_KEEPALIVE |
setReceiveBufferSize | SO_RCVBUF |
setReuseAddress | SO_REUSEADDR |
setSendBufferSize | SO_SNDBUF |
setSoLinger | SO_LINGER |
setSoTimeout | keine [*] |
setTcpNoDelay | TCP_NODELAY |
[*] Im Gegensatz zu dem, was im Javadoc vorgeschlagen wird, legt die setSoTimeout
Methode unter Linux eigentlich keine Socket-Option fest. Standardmäßig werden java.net.Socket
Instanzen von java.net.SocksSocketImpl
unterstützt (auch wenn kein SOCKS-Proxy konfiguriert ist). Diese Klasse erweitert java.net.AbstractPlainSocketImpl
, das das Timeout intern für die spätere Verwendung durch die Lesemethoden in java.net.SocketInputStream
speichert. Sie geben das Timeout wiederum an einen Aufruf des poll
-Systemaufrufs weiter, der wartet, bis Daten zum Lesen verfügbar sind (oder ein Fehler auftritt).