knetstat adalah modul kernel Linux sederhana yang menambahkan empat file baru ke /proc/net
: tcpstat
, tcp6stat
, udpstat
dan udp6stat
. Isi file-file ini kira-kira setara dengan output netstat
dengan opsi -t4an
, -t6an
, -u4an
dan -u6an
masing-masing, yaitu memberikan informasi tentang soket TCP dan UDP dalam bentuk yang dapat dibaca manusia. Perbedaannya dengan output netstat
yang sesuai adalah mereka memiliki kolom tambahan yang menampilkan (bagian dari) opsi soket. Ini adalah motivasi utama untuk menulis modul kernel knetstat: saat ini, di Linux tidak ada cara bagi administrator untuk memeriksa opsi yang ditetapkan pada soket yang dibuat oleh beberapa proses (selain menggunakan strace
atau alat yang setara pada proses tersebut saat pembuatan soket /waktu konfigurasi), karena informasi ini tidak diekspos melalui sistem file /proc
.
knetstat secara internal menggunakan kembali infrastruktur yang digunakan oleh kernel untuk menghasilkan konten file /proc/net/tcp
, /proc/net/tcp6
, /proc/net/udp
dan /proc/net/udp6
. Ini berarti ada korespondensi satu-satu antara entri dalam file ini dan entri dalam file yang dihasilkan oleh knetstat. Hanya format dan isi informasinya yang berbeda antara keduanya.
Berikut ini beberapa contoh keluaran:
$ 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
Kolom "Diag" dapat menampilkan indikator diagnostik berikut:
Indikator | Arti |
---|---|
>| | Jendela pengirim (yaitu jendela yang diiklankan oleh titik akhir jarak jauh) adalah 0. Tidak ada data yang dapat dikirim ke rekan. |
|< | Jendela penerima (yaitu jendela yang diiklankan oleh titik akhir lokal) adalah 0. Tidak ada data yang dapat diterima dari rekan. |
># | Ada paket yang tidak diakui dan ACK terakhir diterima lebih dari satu detik yang lalu. Ini mungkin merupakan indikasi bahwa ada masalah jaringan atau peer mengalami gangguan. |
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 dan TCP_KEEPINTVL sesuai dengan nilai tcp_keepalive_time, tcp_keepalive_probes dan tcp_keepalive_intvl yang dijelaskan dalam tcp(7) dan sysctls masing-masing. Jika nilai-nilai tersebut ditimpa pada level soket (dengan mengaturnya ke nilai selain nol), maka nilai tersebut akan dicetak oleh knetstat, jika tidak, kernel akan menggunakan sysctls dan modul akan mengabaikannya saat mencetak hasilnya.
Kode knetstat saat ini telah berhasil diuji dengan kernel versi 3.13, 3.18, 4.4, 4.8, 4.9 dan 4.15. Ini mungkin juga berfungsi dengan versi lain.
Untuk membangun modul, pastikan Anda memiliki header untuk kernel yang sedang berjalan serta alat pembangunan dasar seperti make dan GCC. Misalnya di Ubuntu:
# apt-get install linux-headers-$(uname -r) make gcc
Kemudian periksa kode sumber knetstat dan jalankan make
. Ini akan membuat knetstat.ko
yang dapat dimuat menggunakan insmod
.
Tabel berikut menunjukkan korespondensi antara opsi soket yang dilaporkan oleh knetstat dan metode penyetel yang ditentukan oleh kelas java.net.Socket
. Informasi ini dapat digunakan untuk menyimpulkan konfigurasi yang diterapkan proses Java ke instance java.net.Socket
berdasarkan output knetstat. Pemetaannya mudah, kecuali setSoTimeout
.
metode Jawa | Opsi soket dilaporkan oleh knetstat |
---|---|
setKeepAlive | SO_KEEPALIVE |
setReceiveBufferSize | SO_RCVBUF |
setReuseAddress | SO_REUSEADDR |
setSendBufferSize | SO_SNDBUF |
setSoLinger | SO_LINGER |
setSoTimeout | tidak ada [*] |
setTcpNoDelay | TCP_NODELAY |
[*] Berbeda dengan yang disarankan Javadoc, metode setSoTimeout
sebenarnya tidak menyetel opsi soket apa pun di Linux. Secara default, instance java.net.Socket
didukung oleh java.net.SocksSocketImpl
(meskipun tidak ada proksi SOCKS yang dikonfigurasi). Kelas ini memperluas java.net.AbstractPlainSocketImpl
yang menyimpan batas waktu secara internal untuk digunakan nanti oleh metode baca di java.net.SocketInputStream
. Mereka pada gilirannya meneruskan waktu tunggu ke pemanggilan panggilan sistem poll
yang menunggu hingga data tersedia untuk dibaca (atau terjadi kesalahan).