Onde o Wireshark (libpcap) captura pacotes, no NIC ou no kernel?

0

O Wireshark (libpcap) captura pacotes quando eles ainda estão no NIC ou quando eles foram passados para o kernel?

Eu executo um programa de teste que aguarda uma mensagem de uma conexão TCP usando a função recv e, em seguida, respondo imediatamente usando a função send . Então eu meço a latência entre o pacote recebido e enviado, que é medido pelos timestamps mostrados no Wireshark. Eu encontrei essa latência varia muito quando eu uso diferentes placas de rede. Isso parece sugerir que o Wireshark captura os pacotes quando eles ainda estão no NIC, de modo que a velocidade com que o NIC processa o pacote é refletida na latência acima. Se a captura ocorrer no kernel, não posso explicar por que a latência é diferente ao usar diferentes NICs, pois todos eles usam a mesma pilha de rede do kernel.

No entanto, se a captura realmente acontecer na NIC, como isso é possível? Como a libpcap pode de alguma forma adicionar alguma funcionalidade da própria NIC?

    
por Qin Yixiao 02.11.2016 / 04:51

1 resposta

0

Você tem que assumir que essa captura não pode acontecer "na NIC".
Não há interface comum para cada NIC; é por isso que todo sistema operacional precisa usar drivers de dispositivo para abstrair a interface. Você especifica apenas a interface de rede (por exemplo, eth0) que deseja usar com o Wireshark. Você não especifica o fabricante / modelo do hardware ou o nome do driver de dispositivo.
Então, por lógica simples, uma de suas alternativas tem que estar errada.

Eu li sobre um método para receber os quadros Ethernet brutos antes que eles sejam processados pela pilha de protocolos. Mas o método apropriado para responder a sua pergunta é realmente examinar o código fonte da GPL.

If the capture happens at the kernel, I can't explain why the latency is different when using different NICs as they are all using the (same) kernel network stack.

(Você não está claro em relação ao que "latência" está calculando / medindo e como isso varia.)

Aparentemente, você não considerou que o método que o Wireshark usa para capturar quadros pode ser completamente separado do método que marca os quadros de data e hora.
O Linux suporta registros de data e hora gerados por hardware e software de quadros Ethernet. Os carimbos de data / hora do hardware seriam gerados pelo adaptador de rede. Os registros de data e hora do software seriam gerados pelo driver de dispositivo do Linux.
Detalhes são descritos em Documentation / networking / timestamping.txt

Resultado final
Wireshark é um aplicativo do espaço do usuário.
Ele só pode utilizar os recursos que o sistema operacional oferece por meio de APIs.
Como o registro de data e hora dos quadros é intrínseco ao subsistema de rede, o Wireshark não é obrigado a executar seu próprio registro de data e hora, mas sim utilizar os recursos existentes do sistema operacional. Consequentemente, o Wireshark pode "capturar" pacotes de rede brutos (com registros de data e hora) usando chamadas de sistema existentes.

    
por 02.11.2016 / 09:16