web-dev-qa-db-fra.com

Pourquoi le noyau abandonnerait-il des paquets?

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

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

Quels sont les "paquets abandonnés par le noyau"? Pourquoi cela se produit-il?

51
rɑːdʒɑ

Depuis le manuel de tcpdump:

paquets `` abandonnés par le noyau '' (c'est le nombre de paquets qui ont été abandonnés, en raison d'un manque d'espace tampon, par le mécanisme de capture de paquets dans le système d'exploitation sur lequel tcpdump s'exécute, si le système d'exploitation signale ces informations aux applications; sinon, il sera signalé comme 0).

Un peu d'explication:

tcpdump capture les paquets bruts passant par une interface réseau. Les paquets doivent être analysés et filtrés selon les règles spécifiées par vous dans la ligne de commande, et cela prend un certain temps, de sorte que les paquets entrants doivent être mis en mémoire tampon (mis en file d'attente) pour le traitement. Parfois, il y a trop de paquets, ils sont enregistrés dans un tampon, mais ils sont enregistrés plus rapidement que traités, donc finalement le tampon manque d'espace, donc le noyau supprime tous les autres paquets jusqu'à ce qu'il y ait de l'espace libre dans le tampon.

Vous pouvez augmenter la taille du tampon avec le -B (--buffer-size) option 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.

51
Dmitry Vasilyanov

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

tcpdump -n port 80
28
KJH

Selon man tcpdump:

paquets abandonnés par le noyau (c'est le nombre de paquets qui ont été abandonnés, en raison d'un manque d'espace tampon, par le mécanisme de capture de paquets dans le système d'exploitation sur quel tcpdump est en cours d'exécution, si le système d'exploitation signale ces informations aux applications; sinon, il sera signalé comme 0).

Le noyau place les paquets capturés dans un tampon de capture de taille fixe . Si tcpdump ne vide pas ce tampon assez rapidement, le noyau commencera à écraser les anciens paquets dans le tampon et à incrémenter le compteur supprimé en conséquence . La valeur de ce compteur est ce que vous voyez comme "abandonné par le noyau".

Soit dit en passant, vous pouvez redimensionner le tampon de capture : passer tcpdump le -B option avec une taille KiB.

12
Anko

Outre ce que dit la page de manuel, il semble y avoir une raison supplémentaire pour laquelle les paquets peuvent être abandonnés par le noyau. Je connaissais une baisse de 100% des paquets de tcpdump où le seul trafic sur le réseau était un paquet de 512B de PRBS par seconde. De toute évidence, l'explication de l'espace tampon n'a pas de sens ici - je pense que le noyau peut gérer 0,5 ko/s.

Quelque chose qui est venu avec ma distribution (Ubuntu 14.04) a peut-être fait une sorte de filtrage intelligent au niveau de la couche liaison qui n'aimait pas mes paquets de test. Ma solution de contournement consistait à créer un nouvel espace de noms 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 le shell netns interne, tous les processus du système d'exploitation qui causaient des problèmes auparavant sont hors de vue et tcpdump me montre tous les paquets que je m'attends à voir.

2
Lombard

Je trouve utile d'utiliser le tcpdump -c option. De cette façon, vous pouvez définir le nombre de paquets, puis arrêter et vous ne pouvez pas remplir le tampon.

Par exemple, celui-ci capturera les requêtes TCP sur localhost.

tcpdump -ni lo tcp -c 20
2
prosti

J'ai trouvé que pour ne pas être "abandonné par le noyau", j'ai dû utiliser les trois choses que les autres ont recommandées ci-dessus:

tcpdump -c 10000 -n -B 10240
0
Wayne Walker