Нетлинк
Netlink — это семейство сокетов, используемое для межпроцессного взаимодействия (IPC) между процессами ядра и пользовательского пространства , а также между различными процессами пользовательского пространства, аналогично сокетам домена Unix , доступным в некоторых Unix-подобных операционных системах , включая его исходное воплощение. как интерфейс ядра Linux , а также в виде более поздней реализации во FreeBSD . [2] Подобно сокетам домена Unix и в отличие от сокетов INET , связь Netlink не может пересекать границы хоста. Однако, хотя сокеты домена Unix используют пространство имен файловой системы , сокеты Netlink обычно обращаются с помощью идентификаторов процессов (PID). [3]
Netlink разработан и используется для передачи различной сетевой информации между пространством ядра и процессами пользовательского пространства. Сетевые утилиты, такие как семейство iproute2 и утилиты, используемые для настройки драйверов беспроводной сети на базе mac80211 , используют Netlink для связи с ядром Linux из пользовательского пространства. Netlink предоставляет стандартный интерфейс на основе сокетов для процессов пользовательского пространства и API на стороне ядра для внутреннего использования модулями ядра . Первоначально Netlink использовал AF_NETLINK
семейство розеток.
Netlink разработан как более гибкий преемник ioctl ; RFC 3549 подробно описывает протокол.
История
[ редактировать ]Netlink создал Алексей Кузнецов. [4] как более гибкая альтернатива сложным, но неуклюжим ioctl
метод связи, используемый для настройки и получения параметров внешнего сокета. Ядро Linux продолжает поддерживать ioctl
для обратной совместимости.
Netlink впервые был представлен в ядре Linux серии 2.0, реализованном как символьное устройство . К 2013 году этот интерфейс устарел, но все еще представляет собой ioctl метод связи ; сравнить использование rtnetlink
. [5] Интерфейс сокета Netlink появился в версии ядра Linux 2.2.
В 2022 году во FreeBSD была добавлена экспериментальная поддержка протокола Netlink. Первоначально поддерживается только подмножество семейства NETLINK_ROUTE и NETLINK_GENERIC. [2]
Структура пакета
[ редактировать ]Битовое смещение | 0–15 | 16–31 | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Длина сообщения | |||||||||||||||||||||||||||||||
32 | Тип | Флаги | ||||||||||||||||||||||||||||||
64 | Порядковый номер | |||||||||||||||||||||||||||||||
96 | ПИД | |||||||||||||||||||||||||||||||
128+ | Данные |
В отличие от сокетов BSD, использующих Интернет-протоколы, такие как TCP , где заголовки сообщений генерируются автоматически, заголовок сообщения Netlink (доступный как struct nlmsghdr
) должен быть подготовлен вызывающим абонентом. Сокет Netlink обычно работает в SOCK_RAW
-подобный режим, даже если SOCK_DGRAM
был использован для его создания.
Часть данных затем содержит сообщение, специфичное для подсистемы, которое может быть дополнительно вложено.
Семейства сокетов Netlink
[ редактировать ]The AF_NETLINK
семейство предлагает несколько подмножеств протоколов. Каждый из них взаимодействует с разными компонентами ядра и имеет разное подмножество обмена сообщениями. На подмножество ссылается поле протокола в вызове сокета:
int socket(AF_NETLINK, SOCK_DGRAM or SOCK_RAW, protocol)
Не имея стандарта, SOCK_DGRAM
и SOCK_RAW
не гарантированно будут реализованы в данной версии Linux (или другой ОС). Некоторые источники утверждают, что оба варианта являются законными, а в приведенной ниже ссылке от Red Hat говорится, что SOCK_RAW
всегда является параметром. Однако iproute2 использует оба варианта взаимозаменяемо.
Протоколы сетевых ссылок
[ редактировать ]Ниже приводится неисчерпывающий список поддерживаемых записей протокола :
- NETLINK_ROUTE
NETLINK_ROUTE
предоставляет информацию о маршрутизации и канале. Эта информация используется главным образом для демонов маршрутизации в пользовательском пространстве. Linux реализует большое подмножество сообщений:
- Канальный уровень: RTM_NEWLINK , RTM_DELLINK , RTM_GETLINK , RTM_SETLINK.
- Настройки адреса: RTM_NEWADDR , RTM_DELADDR , RTM_GETADDR.
- Таблицы маршрутизации: RTM_NEWROUTE , RTM_DELROUTE , RTM_GETROUTE.
- Соседний кеш: RTM_NEWNEIGH , RTM_DELNEIGH , RTM_GETNEIGH.
- Правила маршрутизации: RTM_NEWRULE , RTM_DELRULE , RTM_GETRULE.
- Настройки дисциплины очередей: RTM_NEWQDISC , RTM_DELQDISC , RTM_GETQDISC.
- Классы трафика, используемые с очередями: RTM_NEWTCLASS , RTM_DELTCLASS , RTM_GETTCLASS.
- Фильтры трафика: RTM_NEWTFILTER , RTM_DELTFILTER , RTM_GETTFILTER.
- Другие: RTM_NEWACTION , RTM_DELACTION , RTM_GETACTION , RTM_NEWPREFIX , RTM_GETPREFIX , RTM_GETMULTICAST , RTM_GETANYCAST , RTM_NEWNEIGHTBL , RTM_GETNEIGHTBL , RTM_SETNEIGHTBL
- NETLINK_FIREWALL
NETLINK_FIREWALL
предоставляет интерфейс пользовательскому приложению для получения пакетов от брандмауэра .
- NETLINK_NFLOG
NETLINK_NFLOG
предоставляет интерфейс, используемый для связи между Netfilter и iptables .
- NETLINK_ARPD
NETLINK_ARPD
предоставляет интерфейс для управления таблицей ARP из пользовательского пространства.
- NETLINK_AUDIT
NETLINK_AUDIT
предоставляет интерфейс к подсистеме аудита, присутствующей в ядре Linux версии 2.6.6 и более поздних версий.
- NETLINK_IP6_FW
NETLINK_IP6_FW
предоставляет интерфейс для транспортировки пакетов из сетевого фильтра в пользовательское пространство.
- NETLINK_ROUTE6
- NETLINK_TAPBASE
- NETLINK_NETFILTER
- NETLINK_TCPDIAG
- NETLINK_XFRM
NETLINK_XFRM
предоставляет интерфейс для управления IPsec ассоциациями безопасности и базами данных политик безопасности - в основном используется демонами диспетчера ключей с использованием протокола обмена ключами через Интернет .
- NETLINK_KOBJECT_UEVENT
NETLINK_KOBJECT_UEVENT
предоставляет интерфейс, в котором ядро транслирует события, обычно используемые udev .
- NETLINK_GENERIC
Одним из недостатков протокола Netlink является то, что количество семейств протоколов ограничено 32 ( MAX_LINKS
). Это одна из основных причин создания общего семейства Netlink — обеспечить поддержку добавления большего числа семейств. Он действует как мультиплексор Netlink и работает с одним семейством Netlink. NETLINK_GENERIC
. Общий протокол Netlink основан на протоколе Netlink и использует его API.
Пользовательский протокол Netlink
[ редактировать ]Пользователи могут добавить обработчик Netlink в свои собственные процедуры ядра. Это позволяет разрабатывать дополнительные протоколы Netlink для работы с новыми модулями ядра. [6]
См. также
[ редактировать ]- Сравнение драйверов беспроводной сети с открытым исходным кодом : драйверы на базе mac80211 используют Netlink в качестве API для пользовательского пространства.
- ПОСИКС
Ссылки
[ редактировать ]- ^ Грег Кроа-Хартман (27 июля 2024 г.). «Линукс 6.10.2» . Проверено 27 июля 2024 г.
- ^ Jump up to: а б «netlink: добавить поддержку сетевых ссылок» .
- ^ «netlink(7) — страница руководства Linux» . man7.org .
- ^ «kernel/git/torvalds/linux.git: root/net/core/rtnetlink.c» . Дерево исходного кода ядра Linux . ядро.орг . Проверено 27 мая 2014 г.
- ^ Кроукрофт, Джон ; Филлипс, Иэн, ред. (2002). Реализация протоколов TCP/IP и Linux: системный код для Интернета под Linux . Серия «Сетевой совет Wiley». Уайли . п. 624. ИСБН 9780471408826 . Проверено 21 мая 2013 г.
Все сообщения rtnetlink состоят из заголовка сообщения netlink и добавленных атрибутов.
- ^ «Kernel Korner — зачем и как использовать сокет Netlink | Linux Journal» . www.linuxjournal.com .
Внешние ссылки
[ редактировать ]- Пабло Нейра Аюсо, Рафаэль М. Гаска, Лоран Лефевр. Связь между ядром и пользовательским пространством в Linux с использованием сокетов Netlink. Программное обеспечение: практика и опыт, 40(9):797-810, август 2010 г.
- Зачем и как использовать сокеты Netlink
- RFC 3549
- Домашняя страница проекта netfilter/iptables — проект netfilter.org «libmnl» — минималистская библиотека для Netlink — библиотека пользовательского пространства для создания и анализа сообщений Netlink.
- libnl - Netlink Protocol Library Suite – Netlink Protocol Library Suite – полнофункциональная библиотека, охватывающая практически все аспекты работы с сокетами Netlink.
- Управление сетевой средой с помощью RTNETLINK
- Сокеты Netlink – обзор
- Пакет библиотеки протоколов Netlink
- «Сеть ядра Linux», Рами Розен, Apress 2013: Глава 2, Сокеты Netlink