Самый быстрый способ чтения необработанных данных из интерфейса C ++ - PullRequest
0 голосов
/ 16 ноября 2018

Вот главная проблема.

  1. У меня есть 10-гигабитный интерфейс Ethernet, и ток составляет 6-7 Гбит / с
  2. Мне нужно реализовать брандмауэр. Затем мне нужно перехватить необработанные пакеты для фильтрации некоторых пакетов.
  3. Просто я начал реализовывать в виде необработанного сокета необходимые коды ниже. Сокет привязан к определенному интерфейсу.

    socketfd=socket(AF_PACKET,SOCK_RAW,htons(ETH_P_ALL));
    strncpy(ifopts.ifr_name,interfaceName,IFNAMSIZ-1);
    ioctl(socketfd,SIOCGIFINDEX,&ifopts);
    sll.sll_family=AF_INET;
    sll.sll_ifindex=ifopts.ifr_ifindex;
    sll.sll_protocol=htons(ETH_PALL);
    bind(socketfd,&sll,sizeof(sll));
    
  4. Вот как я читаю, а размер mtu составляет 9000

    while(true)
    recvfrom(socketfd,buffer,9000,0,0,0);
    
  5. Без какого-либо процесса в пакете я получил ~ 150 Мбит / с.

Это проблема, которую мне нужно решить. Я понимаю, что ссылка nload или ip -s показывает фактическую скорость; но я не могу достичь этих цифр около 6-7 Гбит / с.

~ 150 Мбит / с - это очень смешная скорость для меня. Мне нужно увеличить производительность настолько, насколько я могу сделать, используя один процессор. Я постараюсь использовать PF_INET, если вы хотите, я могу поделиться результатом этого.

1 Ответ

0 голосов
/ 26 ноября 2018

Вот ответ.

  • Прежде всего, скорость захвата зависит не только от размера байтов на интерфейсе, но и от количества пакетов. Таким образом, программирование сокетов также ограничено количеством пакетов. Я измерял 200 пакетов в секунду (pps).
  • Использование лучшего сетевого драйвера - один из способов увеличения числа pps. PF_RING - это возможная библиотека и драйвер. Вы можете использовать пробную версию для тестирования. Я просто тестирую его в своей сети, и результат составляет 14 млн. Pps. Тогда эта скорость почти 10 Гбит / с. Это все, что я испытал.

Спасибо всем.

...