knetstat は、 4 つの新しいファイル ( tcpstat 、 tcp6stat 、 udpstat 、およびudp6statを/proc/netに追加する単純な 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 によって生成されたファイル内のエントリの間に 1 対 1 の対応関係があることを意味します。この 2 つでは、形式と情報の内容のみが異なります。
以下に出力例を示します。
$ 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) およびそれぞれの sysctl で説明されている tcp_keepalive_time、tcp_keepalive_probes、および tcp_keepalive_intvl の値に対応します。これらの値がソケット レベルで (ゼロ以外の値に設定することにより) オーバーライドされた場合、それらは knetstat によって出力されます。そうでない場合、カーネルは sysctls を使用し、モジュールは出力の出力中にそれらを無視します。
現在の knetstat コードは、カーネル バージョン 3.13、3.18、4.4、4.8、4.9、および 4.15 で正常にテストされています。他のバージョンでも動作する可能性があります。
モジュールをビルドするには、現在実行中のカーネルのヘッダーと、make や GCC などの基本的なビルド ツールがあることを確認してください。たとえば、Ubuntu の場合:
# 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を除いて、マッピングは簡単です。
| Javaメソッド | 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.AbstractPlainSocketImplを拡張し、後でjava.net.SocketInputStreamの読み取りメソッドで使用できるようにタイムアウトを内部的に保存します。次に、データが読み取り可能になる (またはエラーが発生する) まで待機するpollシステム コールの呼び出しにタイムアウトを渡します。