Pourquoi le kernel supprimerait-il les packages?

J'ai interrompu tcpdump avec Ctrl + C et j'ai obtenu ce résumé total:

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

Quels sont les "packages lâchés par le kernel"? Pourquoi cela arrive-t-il?

Du manuel de tcpdump:

les packages “ drop by kernel '' (nombre de packages supprimés en raison d'un manque d'espace tampon par le mécanisme de capture de packages dans le operating system sur lequel tcpdump s'exécute si le operating system signale ces informations aux applications; sinon, il sera signalé comme 0).

Un peu d'explication:

Le tcpdump capture les packages bruts passant par une interface réseau. Les packages doivent être analysés et filtrés selon les règles que vous avez spécifiées dans la command line, ce qui prend du time, de sorte que les packages entrants doivent être mis en memory tampon (en queue) pour le traitement. Parfois, il y a trop de packages, ils sont sauvegardés dans un tampon, mais ils sont sauvegardés plus vite que le traitement, donc le tampon manque d'espace, donc le kernel laisse tomber tous les autres packages jusqu'à ce qu'il y ait de l'espace libre dans le buffer.

Vous pouvez augmenter la taille de la memory tampon avec l'option -B ( --buffer-size ) comme ceci:

 tcpdump -B 4096 .... 

Notez que la taille est spécifiée en kilo-octets, donc la ligne ci-dessus définit la taille du tampon à 4 Mo.

Une autre chose à considérer / essayer est que tcpdump passe beaucoup de time à faire des requêtes DNS pour résoudre les adresses IP en noms de domaine. Si vous n'en avez pas besoin, essayez de lancer le drapeau -n (pas de search). par exemple:

 tcpdump -n port 80 

Selon l' man tcpdump :

packages perdus par le kernel (c'est-à-dire le nombre de packages supprimés en raison d'un manque d'espace tampon, par le mécanisme de capture de packages dans le operating system sur lequel tcpdump s'exécute, si le operating system signale ces informations aux applications; sera signalé comme 0).

Le kernel met les packages capturés dans un tampon de capture de taille fixe. Si tcpdump ne vide pas suffisamment ce tampon, le kernel commence à écraser les anciens packages dans le tampon et à incrémenter le countur supprimé . La valeur de ce countur est ce que vous voyez comme "abandonné par le kernel".

Par ailleurs, vous pouvez resize le tampon de capture : Passez tcpdump l'option -B avec une taille KiB.

Outre ce que dit la page man, il semble y avoir une raison supplémentaire pour laquelle les packages peuvent être lâchés par le kernel. Je connaissais 100% de packages en provenance de tcpdump où le seul trafic sur le réseau était un package de 512 PRBS par seconde. De toute évidence, l'explication de l'espace tampon n'a pas de sens ici – je pense que le kernel peut gérer 0.5kiB / s.

Quelque chose qui est venu avec ma distro (Ubuntu 14.04) peut avoir fait une sorte de filtrage intelligent à la couche de lien qui n'a pas aimé mes packages de test. Ma solution de contournement était de créer un nouvel espace de noms de réseau comme suit:

 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 

Dans la coquille interne de netns , tous les process de operating system qui causaient des problèmes avant sont hors de l'image et tcpdump me montre tous les packages que j'attends voir.