Как работает NIC с точки зрения ядра? - PullRequest
0 голосов
/ 04 января 2019

Не удалось правильно сформулировать мой вопрос, поэтому поиск в Google не помог мне.Может кто-нибудь объяснить, как работает NIC с точки зрения ядра.Чтобы ядро ​​могло общаться с устройством, вам потребуется либо модуль драйвера / ядра.Мои вопросы:

  1. Я понимаю, что устройства представлены в виде файлов в Linux.Если драйвер / модуль предоставляет API-интерфейсы пользовательского пространства для связи с устройством, означает ли это, что системные вызовы, такие как чтение / запись в файл устройства, являются избыточными?Я не говорю, что на самом деле нужно использовать системный вызов для чтения / записи в файл устройства, но только для аргументации.

  2. Как соотносятся имена устройств, такие как eth0во все это?

  3. Где именно tcpdump получает свои данные?Если я запускаю что-то вроде: tcpdump -vv -i eth0 tcpdump читает где-нибудь из файла устройства?Будет слишком сложно на самом деле проверить порт tx / rx сетевого адаптера на наличие битов, которые входят / выходят из него, так как tcpdump получает эту информацию?

Любая предоставленная информация значительнооценили.Не стесняйтесь давать ссылки на веб-сайт или книги, где я могу узнать больше об этом.

1 Ответ

0 голосов
/ 04 января 2019

"Если драйвер / модуль предоставляет API-интерфейсы пользовательского пространства для связи с устройством, означает ли это, что системные вызовы, такие как чтение / запись в файл устройства, являются избыточными?"

Что вы здесь указываетеочень похож на драйвер режима опроса, предоставляемый библиотекой DPDK.https://doc.dpdk.org/guides/prog_guide/poll_mode_drv.html Если драйвер предоставляет API-интерфейсы пользовательского пространства, системные вызовы read / write, send / recv станут избыточными.Вы должны использовать API, предоставленные драйвером, для чтения и записи на устройства NIC.Однако, если вы все еще хотите использовать системные вызовы Linux, такие как чтение / запись или отправка / запись, вы можете спроектировать свое приложение таким образом, чтобы после чтения необработанных данных из API драйвера вы «внедрили» необработанные данные в ядро ​​Linux,Вы можете добиться этого, записав необработанные данные в устройство tun / tap и попросив приложение прочитать данные с помощью системных вызовов linux с устройства tun / tap.

"Где именно tcpdump получает свои данные?"

Большинство приложений для отслеживания пакетов обнаруживают пакеты с помощью необработанных сокетов, открытых на уровне l2.https://www.unix.com/programming/229235-raw-socket-programming-efficient-packet-sniffer.html

Найден пост, связанный с tcpdump, который дает более подробное объяснение: https://unix.stackexchange.com/questions/23060/what-level-of-the-network-stack-does-tcpdump-get-its-info-from

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