2 votes

Paquets abandonnés avec Libpcap en C sur un trafic de 1 Gig.

J'écris un analyseur de paquets en C en utilisant la bibliothèque libpcap. Voici le code simple

int main(int argc, char *argv[])
{
    pcap_t *pcap;
    const unsigned char *packet;
    char errbuf[PCAP_ERRBUF_SIZE];
    struct pcap_pkthdr header;
    clock_t begin = clock();

    // Type your interface name here 

    char *device = "ens33";
    char error_buffer[PCAP_ERRBUF_SIZE];

    pcap_t *handle;
    int timeout_limit = 10000; // milliseconds

    if (device == NULL)
    {
        printf("Error finding device: %s\n", error_buffer);
        return 1;
    }

    // For live packet capturing
    handle = pcap_open_live(
        device,
        BUFSIZ,
        0,
        timeout_limit,
        error_buffer);

    if (handle == NULL)
    {
        printf("Error getting handle%s\n", error_buffer);
        return 2;
    }

    pcap_loop(handle, 0, dump_UDP_packet, NULL);

    clock_t end = clock();
    double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

    printf("Program completed: total packets processed: %d (non UDP/Radius packets: %d) in %f seconds\n", count, non_packets, time_spent);
    return 0;
}

J'utilise tcpreplay pour lire le trafic en direct à partir d'un fichier pcap. Cependant, mon programme n'est capable de traiter/lire qu'environ 80 000 paquets d'un fichier de 240 000 paquets. Lorsque j'essaie de lire les mêmes paquets à partir de tcpdump, je n'obtiens aucune perte de paquets.

Cela est-il dû à la taille de la mémoire tampon ? Comment puis-je m'assurer que les paquets ne sont pas perdus ?

Le tcpreplay prend environ 1,5 à 2 secondes à haute vitesse (~500MB/sec).

Je l'utilise sur Ubuntu 18.04 (32 Go de RAM, processeur 24 cœurs).

2voto

user13951124 Points 136

Lorsque j'essaie de lire les mêmes paquets à partir de tcpdump, je n'obtiens aucune perte de paquets.

Est-ce dû à la taille de la mémoire tampon ?

À moins que vous n'utilisiez l'option -B tcpdump ne définit pas la taille du tampon du noyau (ce que vous ne faites pas non plus, puisque vous utilisez l'option de ligne de commande pcap_open_live() qui ne permet pas de la définir ; la longueur de l'instantané est de pas la taille du tampon), il utilise la même taille de tampon par défaut (2 MiB) que votre programme utilise, donc ce n'est probablement pas la taille du tampon.

Comment puis-je m'assurer que les paquets ne sont pas perdus ?

Essayez d'utiliser le délai d'attente de tcpdump de 1 seconde (1000 millisecondes) plutôt que 10 secondes (10000 millisecondes), ce qui est ce que vous utilisez actuellement.

En outre, assurez-vous que dump_UDP_packet() ne fait pas trop de travail (vous n'avez pas fourni la source pour nous permettre de savoir ce qu'il fait).

Je l'utilise sur Ubuntu 18.04 (32 Go de RAM, processeur 24 cœurs).

Et votre programme et tcpdump utilisent tous deux un noyau. (Après un changement de contexte, ils peuvent s'exécuter sur un cœur différent de celui sur lequel ils s'exécutaient avant le changement de contexte, mais il s'agit toujours d'un cœur à la fois ; aucun d'entre eux n'est multithreadé, à moins qu'il y ait un threading dans la partie de votre application que vous n'avez pas montrée).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X