Mengapa kernel menjatuhkan paket?


50

Saya menginterupsi tcpdumpdengan 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?


Dalam kasus saya, saya menggunakan opsi -s0, mengubahnya ke -s1600 (tepat di atas MTU) menyelesaikannya untuk saya.
LatinSuD

Jawaban:


50

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 tcpdumpmenangkap 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.


1
Juga saya dengan sengaja mengubah kibi- / mebi- menjadi kilo- / mega- dan menghapus kata tentang libpcap agar tidak membingungkan orang.
Dmitry Vasilyanov

4
Perhatikan juga bahwa dukungan untuk "opsi panjang" di tcpdump relatif baru; dalam versi yang lebih lama (kecuali untuk versi yang jauh lebih tua, yang tidak mendukung pengaturan ukuran buffer) yang dapat Anda lakukan tcpdump -B 4096.

Catatan lain, perlu waktu untuk menyiapkan buffer besar. Jika Anda mengatur buffer menjadi sesuatu yang gila, Anda mungkin kehilangan paket (tcpdump melaporkannya sebagai "paket yang dijatuhkan oleh kernel") selama waktu inisialisasi itu.
dgreene

27

Satu hal lagi yang perlu dipertimbangkan / coba adalah bahwa tcpdumpmungkin menghabiskan banyak waktu melakukan permintaan DNS untuk menyelesaikan IP ke nama domain. Jika Anda tidak membutuhkannya, cobalah melempar -nbendera (tanpa pencarian). misalnya:

tcpdump -n port 80

2
Ini adalah penyelamat. Tidak menyadari bahwa tcpdump melakukan resolusi terbalik ketika membuang ke file !! Menggunakan -nn -B 4096memungkinkan saya untuk mendapatkan0 packets dropped by kernel
Blanka

11

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 tcpdumptidak 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 tcpdumpyang -Bpilihan dengan ukuran KiB.


2

Selain apa yang dikatakan halaman manual, tampaknya ada beberapa alasan tambahan mengapa paket-paket dapat dibuang oleh kernel. Saya mengalami penurunan paket 100% dari tcpdumpmana 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 netnsshell, apa pun proses OS yang menyebabkan masalah sebelum keluar dari gambar dan tcpdumpmenunjukkan kepada saya semua paket yang saya harapkan untuk dilihat.


1

Saya menemukan berguna menggunakan tcpdump -copsi. Dengan cara ini Anda dapat mengatur jumlah paket dan kemudian berhenti dan Anda tidak dapat mengisi buffer.

Misalnya yang ini akan menangkap permintaan tcp di localhost.

tcpdump -ni lo tcp -c 20
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.