Como os filtros de captura no Wireshark funcionam internamente?

1

Eu estou querendo saber exatamente o que acontece internamente no TShark quando eu uso um filtro de captura. Especificamente, digamos que eu tenha o seguinte filtro para capturar dados multicast:

host 224.0.26.3 && port 12345

faz wireshark:

  1. Peça ao sistema operacional para copiar todos os pacotes na interface para seu buffer local
  2. Aplicar o filtro de captura
  3. Registre os dados

ou

  1. Peça ao sistema operacional que copie todos os pacotes da interface do host 224.0.26.1 e da porta 12345 para o buffer local. . .
  2. Registre os dados

ou algo totalmente diferente?

    
por Chuu 26.09.2014 / 18:39

2 respostas

2

Na maioria dos sistemas operacionais, é

  1. Peça ao sistema operacional que copie todos os pacotes na interface do host 224.0.26.1 e da porta 12345 para o buffer local e, em seguida. . .

  2. Registre os dados

embora o que Wireshark e TShark façam é executar o dumpcap (parte do Wireshark) com a (s) interface (s) na qual capturar e o filtro para usar como linha de comando arguments, e dumpcap pede ao libpcap para pedir ao SO (ou, no Windows, ao driver WinPcap) para copiar todos os pacotes que correspondem ao filtro para o seu buffer local.

Em alguns sistemas operacionais (por exemplo, Solaris antes do Solaris 11, HP-UX e IRIX), o sistema operacional não pode fazer a filtragem no kernel, portanto a libpcap solicita que o sistema operacional forneça todos os pacotes para ele; ele (libpcap) executa o próprio filtro e apenas fornece pacotes que correspondem ao filtro para seu chamador - dumpcap, no caso do Wireshark e TShark.

    
por 26.09.2014 / 23:28
1

O Wireshark possui dois tipos de filtros: exibir filtros e capturar filtros.

Os filtros de exibição são mais flexíveis do que os filtros de captura (há algumas coisas que os filtros de captura não podem fazer) porque os filtros de exibição examinam os dados após já terem sido copiados para o log de pacotes da wireshark.

Os filtros de captura podem ser um grande benefício para o desempenho se você tiver muitos fluxos separados de dados passando pela sua interface de rede, mas desejar capturar apenas uma pequena quantidade deles. Os dados nunca são copiados para o wireshark se ele não corresponder aos filtros de captura.

Você pode realmente tentar isso e sentir a diferença de desempenho na interface do usuário (e observar a diferença de desempenho no uso da CPU) fazendo algo assim:

  1. Inicie um servidor da web rápido no host local.
  2. Inicie um enorme download do arquivo HTTP (gigabytes de dados).
  3. Capture na interface da rede localhost com um filtro de captura que ignora a porta em que o download enorme está ocorrendo.
  4. Limpe o filtro de captura completamente e compare o desempenho e o uso da CPU na Etapa 3 para definir o mesmo tipo de filtro no lado do filtro de exibição.

IIRC, o Wireshark descarta seus limites de pacote para o disco (portanto, não é OOM), então provavelmente o gargalo que ocorre com filtros de captura "muito largos" é com o subsistema de disco tendo que registrar tudo na sua interface de rede .

É por isso que, se você estiver usando um servidor muito ocupado apenas para observar um fluxo ou processo específico, é essencial estabelecer filtros de captura razoáveis. Caso contrário, a wireshark introduzirá uma carga significativa da CPU e uma taxa de transferência de E / S.

No Windows, a implementação da captura de pacotes ocorre principalmente no lado do kernel. O Wireshark usa uma ferramenta chamada WinPcap , um módulo do kernel, que na verdade compila seus filtros de captura em código nativo em tempo de execução para criar um teste extremamente otimizado para saber se o filtro de captura está correspondendo ou não. Se o filtro não corresponder, o pacote nunca será copiado para o espaço de processo da wireshark.

A implementação do backend do lado do kernel do pcap pode variar entre as plataformas e, assim, o desempenho e a eficiência do mesmo.

    
por 26.09.2014 / 18:48