Стабильный выпуск | 5.9.1 (17 октября 2020 г.; 0 дней назад (2020-10-17)) |
---|---|
Предварительный выпуск | 5.9-rc8 (4 октября 2020 г.; 13 дней назад (2020-10-04)) |
Операционная система | Linux |
Платформа | ядро Linux |
Тип | Интерфейс прикладного программирования |
Лицензия | Стандартная общественная лицензия GNU |
Веб-сайт | wiki.linuxfoundation.org / network / generic _netlink _howto |
Семейство Netlinksocket - это интерфейс ядра Linux, используемый для межпроцессного взаимодействия (IPC) между обоими ядра и пользовательского пространства, а также между различными процессами пользовательского пространства, аналогично сокетам домена Unix. Аналогично сокетам домена Unix и в отличие от сокетов INET, связь Netlink не может пересекать границы хоста. Однако, в то время как сокеты домена Unix используют пространство имен файловой системы, процессы Netlink обычно адресуются с помощью идентификаторов процессов (PID).
Netlink разработан и используется для передачи различная сетевая информация между пространством ядра и процессами пользовательского пространства. Сетевые утилиты, такие как семейство iproute2 и утилиты, используемые для настройки драйверов беспроводной сети на основе mac80211, используют Netlink для связи с ядром Linux из пользовательского пространства. Netlink предоставляет стандартный интерфейс на основе socket для процессов пользовательского пространства и API на стороне ядра для внутреннего использования модулями ядра. Первоначально Netlink использовал семейство сокетов AF_NETLINK
.
Netlink разработан как более гибкий преемник ioctl ; RFC 3549 подробно описывает протокол.
Netlink был создан Алексеем Кузнецовым как более гибкая альтернатива сложному, но неудобному методу связи ioctl
, используемому для настройки и получения варианты внешних розеток. Ядро Linux продолжает поддерживать ioctl
для обратной совместимости.
Netlink впервые был реализован в ядре Linux серии 2.0 и реализован как символьное устройство . К 2013 году этот интерфейс устарел, но все еще представляет собой метод связи ioctl ; сравните использование rtnetlink
. Интерфейс сокета Netlink появился в серии 2.2 ядра Linux.
Битовое смещение | 0–15 | 16–31 | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | Длина сообщения | |||||||||||||||||||||||||||||||
32 | Тип | Флаги | ||||||||||||||||||||||||||||||
64 | Порядковый номер | |||||||||||||||||||||||||||||||
96 | PID | |||||||||||||||||||||||||||||||
128+ | Данные |
В отличие от сокетов BSD, использующих Интернет такие протоколы, как TCP, в которых заголовки сообщений генерируются автоматически, вызывающий должен подготовить заголовок сообщения Netlink (доступный как struct nlmsghdr
). Сокет Netlink обычно работает в режиме, подобном SOCK_RAW
, даже если для его создания использовался SOCK_DGRAM
.
Затем часть данных содержит специфичное для подсистемы сообщение, которое может быть дополнительно вложено.
Семейство AF_NETLINK
предлагает несколько подмножеств протоколов. Каждый из них взаимодействует с другим компонентом ядра и имеет различное подмножество обмена сообщениями. На подмножество ссылается поле протокола в вызове сокета:
int socket (AF_NETLINK, SOCK_DGRAM или SOCK_RAW, протокол)
Отсутствие стандарта, SOCK_DGRAM
и SOCK_RAW
не гарантируется, что он будет реализован в данной версии Linux (или другой ОС). Некоторые источники заявляют, что оба варианта допустимы, а ссылка ниже из Red Hat утверждает, что SOCK_RAW
всегда является параметром. Однако iproute2 использует оба варианта взаимозаменяемо.
Ниже приводится неполный список поддерживаемых записей протокола:
NETLINK_ROUTE
предоставляет информацию о маршрутизации и канале связи. Эта информация используется в первую очередь для демонов маршрутизации в пространстве пользователя. Linux реализует большой набор сообщений:
NETLINK_FIREWALL
предоставляет интерфейс для приложения пользовательского пространства для приема пакетов от межсетевого экрана.
Одним из недостатков протокола Netlink является то, что количество семейств протоколов ограничено 32 ( Пользователи могут добавлять обработчик Netlink в свои собственные процедуры ядра. Это позволяет разрабатывать дополнительные протоколы Netlink для работы с новыми модулями ядра.используемый интерфейс NETLINK_NFLOG
NETLINK_NFLOG
общаться между Netfilter и iptables.
NETLINK_ARPD
предоставляет интерфейс для управления таблицей ARP из пространства пользователя.NETLINK_AUDIT
предоставляет интерфейс к подсистеме аудита, присутствующей в ядре Linux версии 2.6.6 и выше.NETLINK_IP6_FW
предоставляет интерфейс для транспортировки пакетов из netfilter в пространство пользователя.NETLINK_XFRM
предоставляет интерфейс для управления ассоциацией безопасности IPsec и безопасностью базы данных политик - в основном используются демонами диспетчера ключей, использующими протокол Internet Key Exchange.NETLINK_KOBJECT_UEVENT
предоставляет интерфейс, в котором ядро транслирует uevents, обычно потребляемые udev.MAX_LINKS
). Это одна из основных причин, по которой было создано общее семейство Netlink - для поддержки добавления большего числа семейств. Он действует как мультиплексор Netlink и работает с одним семейством Netlink NETLINK_GENERIC
. Общий протокол Netlink основан на протоколе Netlink и использует его API.Пользовательский протокол Netlink