Por que o kernel descartaria pacotes?

45

Eu interrompi tcpdump com Ctrl + C e obtive este resumo total:

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

Quais são os "pacotes descartados pelo kernel"? Por que isso acontece?

    
por rɑːdʒɑ 16.07.2014 / 11:59

5 respostas

44

Do manual do tcpdump:

packets ''dropped by kernel'' (this is the number of packets that were dropped, due to a lack of buffer space, by the packet capture mechanism in the OS on which tcpdump is running, if the OS reports that information to applications; if not, it will be reported as 0).

Um pouco de explicação:

O tcpdump captura pacotes brutos que passam por uma interface de rede. Os pacotes precisam ser analisados e filtrados de acordo com as regras especificadas por você na linha de comando, e isso leva algum tempo, portanto, os pacotes de entrada precisam ser armazenados em buffer (enfileirados) para processamento. Às vezes há muitos pacotes, eles são salvos em um buffer, mas eles são salvos mais rápido do que processados, então, eventualmente, o buffer fica sem espaço, então o kernel descarta todos os outros pacotes até que haja algum espaço livre no buffer. p>

Você pode aumentar o tamanho do buffer com a opção -B ( --buffer-size ) assim:

tcpdump -B 4096 ....

Observe que o tamanho é especificado em kilobytes, portanto, a linha acima define o tamanho do buffer como 4 MB.

    
por 16.07.2014 / 12:58
22

Só mais uma coisa a considerar / tentar é que tcpdump pode estar gastando muito tempo fazendo consultas DNS para resolver IPs para nomes de domínio. Se você não precisar delas, tente usar o sinalizador -n (nenhuma pesquisa). por exemplo:

tcpdump -n port 80
    
por 06.03.2015 / 17:17
10

De acordo com man tcpdump :

packets dropped by kernel (this is the number of packets that were dropped, due to a lack of buffer space, by the packet capture mechanism in the OS on which tcpdump is running, if the OS reports that information to applications; if not, it will be reported as 0).

O kernel coloca pacotes capturados em um buffer de captura de tamanho fixo . Se tcpdump não esvaziar esse buffer com rapidez suficiente, o kernel começará a sobrescrever os pacotes antigos no buffer e, de forma correspondente, incrementará o contador caiu . O valor desse contador é o que você vê como "descartado pelo kernel".

A propósito, você pode redimensionar o buffer de captura : passar tcpdump a opção -B com um tamanho KiB.

    
por 16.07.2014 / 12:51
2

Além do que a página man diz, parece haver algum motivo adicional pelo qual os pacotes podem ser descartados pelo kernel. Eu estava experimentando 100% de queda de pacotes de tcpdump , onde o único tráfego na rede era um pacote de 512B de PRBS por segundo. Claramente a explicação do espaço de buffer não faz sentido aqui - acho que o kernel pode lidar com 0.5kiB / s.

Algo que veio junto com minha distro (Ubuntu 14.04) pode ter feito algum tipo de filtragem inteligente na camada de link que não gostou dos meus pacotes de teste. Minha solução alternativa era criar um novo namespace de rede da seguinte forma:

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

No shell netns interno, quaisquer processos do sistema operacional que estavam causando problemas antes estão fora de cena e tcpdump mostra todos os pacotes que espero ver.

    
por 09.09.2016 / 00:19
0

Acho útil usar a opção tcpdump -c . Desta forma, você pode definir o número de pacotes e depois parar e você não pode preencher o buffer.

Por exemplo, este irá capturar as solicitações tcp no host local.

tcpdump -ni lo tcp -c 20
    
por 03.09.2018 / 20:40