knetstat는 /proc/net
에 tcpstat
, tcp6stat
, udpstat
및 udp6stat
4개의 새 파일을 추가하는 간단한 Linux 커널 모듈입니다. 이 파일의 내용은 각각 -t4an
, -t6an
, -u4an
및 -u6an
옵션이 있는 netstat
의 출력과 대략 동일합니다. 즉, 사람이 읽을 수 있는 형식으로 TCP 및 UDP 소켓에 대한 정보를 제공합니다. 해당 netstat
출력과의 차이점은 소켓 옵션(일부 집합)을 표시하는 추가 열이 있다는 것입니다. 이것이 knetstat 커널 모듈을 작성하게 된 주된 동기였습니다. 현재 Linux에서는 관리자가 일부 프로세스에서 생성된 소켓에 설정된 옵션을 검사할 수 있는 방법이 없습니다(소켓 생성 시 해당 프로세스에서 strace
또는 동등한 도구를 사용하는 것 외에는). /configuration time), 이 정보는 /proc
파일 시스템을 통해 노출되지 않기 때문입니다.
knetstat는 /proc/net/tcp
, /proc/net/tcp6
, /proc/net/udp
및 /proc/net/udp6
파일의 내용을 생성하기 위해 커널에서 사용하는 인프라를 내부적으로 재사용합니다. 이는 이러한 파일의 항목과 knetstat에 의해 생성된 파일의 항목 사이에 일대일 대응이 있음을 의미합니다. 형식과 정보 내용만 둘 사이에 다릅니다.
다음은 몇 가지 샘플 출력입니다.
$ 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
"진단" 열에는 다음 진단 표시기가 표시될 수 있습니다.
지시자 | 의미 |
---|---|
>| | 보낸 사람 창(즉, 원격 끝점이 광고하는 창)은 0입니다. 피어에게 데이터를 보낼 수 없습니다. |
|< | 수신자 창(즉, 로컬 엔드포인트가 광고하는 창)은 0입니다. 피어로부터 데이터를 수신할 수 없습니다. |
># | 승인되지 않은 패킷이 있고 마지막 ACK가 1초 이상 전에 수신되었습니다. 이는 네트워크 문제가 있거나 피어가 충돌했음을 나타낼 수 있습니다. |
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 및 TCP_KEEPINTVL은 tcp(7) 및 해당 sysctls에 설명된 tcp_keepalive_time, tcp_keepalive_probes 및 tcp_keepalive_intvl 값에 해당합니다. 해당 값이 소켓 수준에서 재정의되면(0이 아닌 다른 값으로 설정) knetstat에 의해 인쇄됩니다. 그렇지 않으면 커널은 sysctls를 사용하고 모듈은 출력을 인쇄하는 동안 해당 값을 무시합니다.
현재 knetstat 코드는 커널 버전 3.13, 3.18, 4.4, 4.8, 4.9 및 4.15에서 성공적으로 테스트되었습니다. 다른 버전에서도 작동할 수 있습니다.
모듈을 빌드하려면 현재 실행 중인 커널에 대한 헤더와 make 및 GCC와 같은 기본 빌드 도구가 있는지 확인하세요. 예를 들어 우분투에서는:
# apt-get install linux-headers-$(uname -r) make gcc
그런 다음 knetstat 소스 코드를 확인하고 make
실행하세요. 이것은 insmod
사용하여 로드할 수 있는 knetstat.ko
생성해야 합니다.
다음 표는 knetstat에 의해 보고된 소켓 옵션과 java.net.Socket
클래스에 의해 정의된 setter 메소드 간의 대응 관계를 보여줍니다. 이 정보는 knetstat의 출력을 기반으로 Java 프로세스가 java.net.Socket
인스턴스에 적용한 구성을 추론하는 데 사용될 수 있습니다. setSoTimeout
제외하고 매핑은 간단합니다.
자바 방식 | knetstat에서 보고한 소켓 옵션 |
---|---|
setKeepAlive | SO_KEEPALIVE |
setReceiveBufferSize | SO_RCVBUF |
setReuseAddress | SO_REUSEADDR |
setSendBufferSize | SO_SNDBUF |
setSoLinger | SO_LINGER |
setSoTimeout | 없음 [*] |
setTcpNoDelay | TCP_NODELAY |
[*] Javadoc에서 제안하는 것과 달리 setSoTimeout
메소드는 실제로 Linux에서 소켓 옵션을 설정하지 않습니다. 기본적으로 java.net.Socket
인스턴스는 java.net.SocksSocketImpl
에 의해 지원됩니다(SOCKS 프록시가 구성되지 않은 경우에도 마찬가지). 이 클래스는 나중에 java.net.SocketInputStream
의 읽기 메소드에서 사용하기 위해 내부적으로 시간 초과를 저장하는 java.net.AbstractPlainSocketImpl
을 확장합니다. 그런 다음 데이터를 읽을 수 있을 때까지(또는 오류가 발생할 때까지) 기다리는 poll
시스템 호출 호출에 시간 초과를 전달합니다.