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