knetstat es un módulo simple del kernel de Linux que agrega cuatro archivos nuevos a /proc/net
: tcpstat
, tcp6stat
, udpstat
y udp6stat
. El contenido de estos archivos es aproximadamente equivalente a la salida de netstat
con las opciones -t4an
, -t6an
, -u4an
y -u6an
respectivamente, es decir, proporcionan información sobre sockets TCP y UDP en formato legible por humanos. La diferencia con la salida netstat
correspondiente es que tienen una columna adicional que muestra (un subconjunto de) las opciones del socket. Esta fue la motivación principal para escribir el módulo del kernel knetstat: actualmente, en Linux no hay forma de que un administrador inspeccione las opciones configuradas en un socket creado por algún proceso (aparte de usar strace
o una herramienta equivalente en ese proceso en el momento de la creación del socket). /hora de configuración), porque esta información no se expone a través del sistema de archivos /proc
.
knetstat reutiliza internamente la infraestructura que utiliza el kernel para generar el contenido de los archivos /proc/net/tcp
, /proc/net/tcp6
, /proc/net/udp
y /proc/net/udp6
. Esto significa que existe una correspondencia uno a uno entre las entradas de estos archivos y las entradas de los archivos generados por knetstat. Sólo el formato y el contenido de la información son diferentes entre los dos.
Aquí hay algunos resultados de muestra:
$ 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 columna "Diag" puede mostrar los siguientes indicadores de diagnóstico:
Indicador | Significado |
---|---|
>| | La ventana del remitente (es decir, la ventana anunciada por el punto final remoto) es 0. No se pueden enviar datos al igual. |
|< | La ventana del receptor (es decir, la ventana anunciada por el punto final local) es 0. No se pueden recibir datos del par. |
># | Hay paquetes no reconocidos y el último ACK se recibió hace más de un segundo. Esto puede ser una indicación de que hay problemas de red o de que el par falló. |
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 y TCP_KEEPINTVL corresponden a los valores tcp_keepalive_time, tcp_keepalive_probes y tcp_keepalive_intvl descritos en tcp(7) y los respectivos sysctls. Si esos valores se anulan a nivel de socket (estableciéndolos en un valor distinto de cero), knetstat los imprimirá; de lo contrario, el kernel usará sysctls y el módulo los ignorará mientras imprime la salida.
El código knetstat actual ha sido probado con éxito con las versiones del kernel 3.13, 3.18, 4.4, 4.8, 4.9 y 4.15. También puede funcionar con otras versiones.
Para compilar el módulo, asegúrese de tener los encabezados del kernel que se está ejecutando actualmente, así como las herramientas de compilación básicas, como make y GCC. Por ejemplo, en Ubuntu:
# apt-get install linux-headers-$(uname -r) make gcc
Luego consulte el código fuente de knetstat y ejecute make
. Esto debería crear knetstat.ko
que se puede cargar usando insmod
.
La siguiente tabla muestra la correspondencia entre las opciones de socket informadas por knetstat y los métodos setter definidos por la clase java.net.Socket
. Esta información se puede utilizar para inferir la configuración que un proceso Java aplicó a una instancia java.net.Socket
en función de la salida de knetstat. El mapeo es sencillo, excepto setSoTimeout
.
método java | Opción de socket reportada por knetstat |
---|---|
setKeepAlive | SO_KEEPALIVE |
setReceiveBufferSize | SO_RCVBUF |
setReuseAddress | SO_REUSEADDR |
setSendBufferSize | SO_SNDBUF |
setSoLinger | SO_LINGER |
setSoTimeout | ninguno [*] |
setTcpNoDelay | TCP_NODELAY |
[*] A diferencia de lo que sugiere el Javadoc, el método setSoTimeout
en realidad no establece ninguna opción de socket en Linux. De forma predeterminada, las instancias java.net.Socket
están respaldadas por java.net.SocksSocketImpl
(incluso si no hay ningún proxy SOCKS configurado). Esta clase extiende java.net.AbstractPlainSocketImpl
que almacena el tiempo de espera internamente para su uso posterior por parte de los métodos de lectura en java.net.SocketInputStream
. A su vez, pasan el tiempo de espera a una invocación de la llamada al sistema poll
que espera hasta que los datos estén disponibles para lectura (o se produzca un error).