¿Por qué el núcleo descarta paquetes?

50

Interrumpí tcpdumpcon Ctrl+ Cy obtuve este resumen total:

579204 packets captured
579346 packets received by filter
142 packets dropped by kernel

¿Qué son los "paquetes descartados por el núcleo"? ¿Por qué pasa eso?

rɑːdʒɑ
fuente
En mi caso, estaba usando la opción -s0, cambiarlo a -s1600 (justo encima de MTU) lo resolvió para mí.
LatinSuD

Respuestas:

50

Del manual de tcpdump:

paquetes `` descartados por el núcleo '' (este es el número de paquetes que fueron descartados, debido a la falta de espacio en el búfer, por el mecanismo de captura de paquetes en el sistema operativo en el que tcpdump se está ejecutando, si el sistema operativo informa esa información a las aplicaciones; si no, se informará como 0).

Un poco de explicación:

Los tcpdumpcaptura paquetes primas que pasan a través de una interfaz de red. Los paquetes deben analizarse y filtrarse de acuerdo con las reglas especificadas por usted en la línea de comando, y eso lleva algo de tiempo, por lo que los paquetes entrantes deben almacenarse (en cola) para su procesamiento. A veces hay demasiados paquetes, se guardan en un búfer, pero se guardan más rápido de lo procesado, por lo que finalmente el búfer se queda sin espacio, por lo que el núcleo descarta todos los paquetes adicionales hasta que queda algo de espacio libre en el búfer.

Puede aumentar el tamaño del búfer con la opción -B( --buffer-size) de esta manera:

tcpdump -B 4096 ....

Tenga en cuenta que el tamaño se especifica en kilobytes, por lo que la línea anterior establece el tamaño del búfer en 4 MB.

Dmitry Vasilyanov
fuente
1
También cambié intencionalmente kibi- / mebi- a kilo- / mega- y omití una palabra sobre libpcap para no confundir a las personas.
Dmitry Vasilyanov
44
Tenga en cuenta también que el soporte para "opciones largas" en tcpdump es relativamente nuevo; en versiones anteriores (a excepción de versiones mucho más antiguas, que no admiten la configuración del tamaño del búfer) puede hacerlo tcpdump -B 4096.
Otra nota, lleva tiempo configurar grandes buffers. Si establece los búferes en algo loco, puede perder paquetes (tcpdump los informa como "paquetes descartados por el núcleo") durante ese tiempo de inicialización.
dgreene
27

Una cosa más a tener en cuenta / probar es que tcpdumppuede pasar mucho tiempo haciendo consultas DNS para resolver las direcciones IP de los nombres de dominio. Si no los necesita, intente -ncolocar la bandera (sin búsquedas). p.ej:

tcpdump -n port 80
KJH
fuente
2
Este fue un salvador. ¡No me di cuenta de que tcpdump invirtió la resolución al volcar en un archivo! El uso -nn -B 4096me permitió llegar0 packets dropped by kernel
Blanka
11

De acuerdo a man tcpdump:

paquetes descartados por el núcleo (este es el número de paquetes que fueron descartados, debido a la falta de espacio en el búfer, por el mecanismo de captura de paquetes en el sistema operativo en el que tcpdump se está ejecutando, si el sistema operativo informa esa información a las aplicaciones; si no, será reportado como 0).

El núcleo coloca los paquetes capturados en un búfer de captura de tamaño fijo . Si tcpdumpno vacía ese búfer lo suficientemente rápido, el núcleo comenzará a sobrescribir los paquetes antiguos en el búfer e incrementará correspondientemente el contador descartado . El valor de ese contador es lo que ves como "eliminado por el núcleo".

Por cierto, puede cambiar el tamaño del búfer de captura : pase tcpdumpla -Bopción con un tamaño KiB.

Anko
fuente
2

Además de lo que dice la página del manual, parece haber alguna razón adicional por la cual el núcleo puede descartar los paquetes. Estaba experimentando una caída del paquete del 100% desde tcpdumpdonde el único tráfico en la red era un paquete de 512B de PRBS por segundo. Claramente, la explicación del espacio del búfer no tiene sentido aquí: creo que el núcleo puede manejar 0.5kiB / s.

Algo que vino junto con mi distribución (Ubuntu 14.04) puede haber estado haciendo algún tipo de filtrado inteligente en la capa de enlace que no le gustaba a mis paquetes de prueba. Mi solución fue crear un nuevo espacio de nombres de red de la siguiente manera:

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

En el netnsshell interno , los procesos del sistema operativo que antes causaban problemas están fuera de la imagen y tcpdumpme muestran todos los paquetes que espero ver.

Lombarda
fuente
1

Me resulta útil usar la tcpdump -copción. De esta manera, puede establecer el número de paquetes y luego detenerse y no puede completar el búfer.

Por ejemplo, este capturará las solicitudes tcp en localhost.

tcpdump -ni lo tcp -c 20
prosti
fuente