Какой метод вы предлагаете для чтения многоадресного потока в Linux? - PullRequest
1 голос
/ 22 января 2020

Я написал программу на Linux с использованием C / C ++, которая читает многоадресные пакеты и пытается понять, что указанное событие c произошло или не так быстро, как это возможно. Задержка является ключевым моментом здесь.

В протоколе первые два байта представляют тип сообщения. В моей текущей реализации я читаю первые два байта и решаю, сколько байтов мне следует прочитать для полезной нагрузки в соответствии с типом сообщения. А именно я выполняю 2 операции чтения для 1 пакета. Одна из операций чтения предназначена для длины пакета, а другая - для полезной нагрузки. Итак, есть 2 операции ввода / вывода.

В качестве альтернативы, я мог бы сделать это, я прочитал столько, сколько смогу, проверить первые 2 байта, скажем, это N, go для N байтов и сформировать package1 и package2. Если после считывания package1 и package2 остаются оставшиеся байты, прочитайте дополнительные байты и снова обработайте байтовый буфер, как описано выше. В этом методе я делаю 1 ввод / вывод, но требуется пройти в байтовом буфере.

Какой из них теоретически быстрее? Я знаю, что должен реализовать и измерить оба, но я просто хотел услышать ваши предложения.

Спасибо

1 Ответ

1 голос
/ 22 января 2020

Самый быстрый метод, который я знаю:

  • Открыть необработанный пакет сокет (AF_PACKET)
  • Реализация фильтра BPF, который фильтрует пакеты, которые вы нужно как можно точнее указать c
  • Переключиться на кольцевой буфер с отображением в памяти (PACKET_MMAP / PACKET_RX_RING)
  • Чтение пакетов непосредственно из памяти вместо использования recv(). Это может быть сделано с использованием poll() или, альтернативно, путем зацикливания метаданных пакета в памяти, чтобы избежать системного вызова poll().
  • Обработка пакета непосредственно в кольцевом буфере (ноль) -copy)
  • Пометить буфер как «свободный для повторного использования»

Таким образом, никаких системных вызовов вообще не требуется, путь через ядро ​​короткий и задержка должна быть минимальной.

Для получения дополнительной информации см. документацию ядра пакета mmap

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...