Saya menginterupsi tcpdump
dengan Ctrl+ Cdan mendapatkan ringkasan total ini:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Apakah "paket-paket yang dijatuhkan oleh kernel"? Mengapa itu terjadi?
Saya menginterupsi tcpdump
dengan Ctrl+ Cdan mendapatkan ringkasan total ini:
579204 packets captured
579346 packets received by filter
142 packets dropped by kernel
Apakah "paket-paket yang dijatuhkan oleh kernel"? Mengapa itu terjadi?
Jawaban:
Dari manual tcpdump:
paket `` Drop by kernel '' (ini adalah jumlah paket yang dijatuhkan, karena kurangnya ruang buffer, oleh mekanisme paket capture di OS di mana tcpdump berjalan, jika OS melaporkan informasi itu ke aplikasi; jika tidak, itu akan dilaporkan sebagai 0).
Sedikit penjelasan:
The tcpdump
menangkap paket raw melewati antarmuka jaringan. Paket-paket harus diurai dan disaring sesuai dengan aturan yang ditentukan oleh Anda di baris perintah, dan itu membutuhkan waktu, sehingga paket yang masuk harus buffered (antri) untuk diproses. Kadang-kadang ada terlalu banyak paket, mereka disimpan ke buffer, tetapi mereka disimpan lebih cepat dari yang diproses, sehingga akhirnya buffer kehabisan ruang, sehingga kernel menjatuhkan semua paket lebih lanjut sampai ada beberapa ruang kosong di buffer.
Anda dapat menambah ukuran buffer dengan opsi -B
( --buffer-size
) seperti ini:
tcpdump -B 4096 ....
Perhatikan bahwa ukurannya ditentukan dalam kilobyte, jadi baris di atas menetapkan ukuran buffer menjadi 4MB.
tcpdump -B 4096
.
Satu hal lagi yang perlu dipertimbangkan / coba adalah bahwa tcpdump
mungkin menghabiskan banyak waktu melakukan permintaan DNS untuk menyelesaikan IP ke nama domain. Jika Anda tidak membutuhkannya, cobalah melempar -n
bendera (tanpa pencarian). misalnya:
tcpdump -n port 80
-nn -B 4096
memungkinkan saya untuk mendapatkan0 packets dropped by kernel
Menurut man tcpdump
:
paket yang dijatuhkan oleh kernel (ini adalah jumlah paket yang dijatuhkan, karena kurangnya ruang buffer, oleh mekanisme penangkapan paket di OS di mana tcpdump berjalan, jika OS melaporkan informasi itu ke aplikasi; jika tidak, itu akan dilaporkan sebagai 0).
Kernel menempatkan paket yang diambil dalam buffer tangkapan ukuran tetap . Jika tcpdump
tidak mengosongkan buffer itu dengan cukup cepat, kernel akan mulai menimpa paket-paket lama dalam buffer dan secara bersamaan menambah counter yang dijatuhkan . Nilai penghitung itu adalah apa yang Anda lihat sebagai "dijatuhkan oleh kernel".
By the way, Anda dapat mengubah ukuran capture penyangga : Pass tcpdump
yang -B
pilihan dengan ukuran KiB.
Selain apa yang dikatakan halaman manual, tampaknya ada beberapa alasan tambahan mengapa paket-paket dapat dibuang oleh kernel. Saya mengalami penurunan paket 100% dari tcpdump
mana satu-satunya lalu lintas di jaringan adalah satu paket PRB 512B per detik. Jelas penjelasan ruang buffer tidak masuk akal di sini - saya pikir kernel dapat menangani 0.5kiB / s.
Sesuatu yang menyertai distro saya (Ubuntu 14.04) mungkin telah melakukan semacam pemfilteran pintar pada lapisan tautan yang tidak menyukai paket pengujian saya. Solusi saya adalah membuat namespace jaringan baru sebagai berikut:
sudo -i
ip netns add debug
ip link set dev eth0 netns debug
ip netns exec debug bash
ifconfig eth0 1.2.3.4 up
Di bagian dalam netns
shell, apa pun proses OS yang menyebabkan masalah sebelum keluar dari gambar dan tcpdump
menunjukkan kepada saya semua paket yang saya harapkan untuk dilihat.