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).