Pourquoi le noyau abandonnerait-il les paquets?

50

J'ai interrompu tcpdumpavec Ctrl+ Cet 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?

rɑːdʒɑ
la source
Dans mon cas, j’utilisais l’option -s0, le changeant en -s1600 (juste au-dessus de MTU) l’a résolu pour moi.
LatinSuD

Réponses:

50

Du 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 communique ces informations aux applications; sinon, il sera signalé comme 0).

Un peu d'explication:

Les tcpdumppaquets bruts capturés transitant par une interface réseau. Les paquets doivent être analysés et filtrés selon les règles que vous avez spécifiées dans la ligne de commande, ce qui prend un certain temps. Par conséquent, les paquets entrants doivent être mis en mémoire tampon (en file d'attente) pour être traités. Parfois, il y a trop de paquets, ils sont sauvegardés dans un tampon, mais ils sont sauvegardés plus rapidement qu'ils ne sont traités, de sorte que le tampon finit par manquer d'espace. Le noyau supprime tous les paquets supplémentaires jusqu'à ce qu'il y ait un peu d'espace libre dans le tampon.

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

tcpdump -B 4096 ....

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

Dmitry Vasilyanov
la source
1
J'ai aussi intentionnellement changé kibi- / mebi- en kilo- / méga et omis un mot sur libpcap afin de ne pas dérouter les gens.
Dmitry Vasilyanov
4
Notez également que la prise en charge des "options longues" dans tcpdump est relativement nouvelle; vous pouvez le faire dans les versions plus anciennes (à l'exception des versions beaucoup plus anciennes, qui ne prennent pas en charge la définition de la taille du tampon) tcpdump -B 4096.
Autre remarque, il faut du temps pour configurer de grands tampons. Si vous définissez les tampons sur quelque chose de fou, vous risquez de rater des paquets (tcpdump les signale comme des "paquets lâchés par le noyau") au cours de cette période d'initialisation.
dgreene
27

Une autre chose à considérer / essayer est la tcpdumppossibilité de passer beaucoup de temps à 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 l' -nindicateur (pas de recherche). par exemple:

tcpdump -n port 80
KJH
la source
2
C'était un sauveur. Tcpdump n'a pas réalisé l'inverse de la résolution lors de la sauvegarde dans un fichier !! Utilisation -nn -B 4096m'a permis d'obtenir0 packets dropped by kernel
Blanka
11

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 du système d'exploitation sur lequel tcpdump s'exécute, si le système d'exploitation communique ces informations aux applications; sinon, sera signalé comme 0).

Le noyau place les paquets capturés dans un tampon de capture de taille fixe . S'il tcpdumpne vide pas assez rapidement le tampon, le noyau commence à écraser les anciens paquets dans le tampon et à incrémenter le compteur supprimé . La valeur de ce compteur correspond à ce que vous voyez comme "supprimé par le noyau".

Soit dit en passant, vous pouvez redimensionner le tampon de capture : Passez tcpdumpl’ -Boption avec une taille KiB.

Anko
la source
2

Outre ce que dit la page de manuel, il semble exister une raison supplémentaire pour laquelle des paquets peuvent être supprimés par le noyau. Je tcpdumpsubissais une perte de paquets de 100%, alors que le seul trafic sur le réseau consistait en un paquet de 512 Go de PRBS par seconde. Il est clair que 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 la netnscoque interne , tous les processus de système d'exploitation qui posaient problème auparavant sont absents et tcpdumpme montrent tous les paquets que je m'attends à voir.

Lombard
la source
1

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

Par exemple, celui-ci capturera les demandes TCP sur localhost.

tcpdump -ni lo tcp -c 20
prosti
la source