Разъемы netlink
Я работал с сетевым программированием раньше. Но это мой первый набег в сокеты netlink.
Я выбрал тип разъема netlink для подключения. Как и в случае с любым другим компонентом ядра, он также имеет аналог пользователя. Ядро linux имеет пример программы под названием ucon.c, который можно использовать для сборки программ пользовательского пространства на основе вышеупомянутых сокетов netlink-коннекторов.
Поэтому здесь я хочу указать части программы, для которых я хочу подтвердить свое понимание, и части программы, в которых я не следую логике. Хватит болтать. Вот так. Пожалуйста, поправьте меня, куда бы я ни сбился.
Насколько я понял, сокеты netlink - это метод IPC, используемый для соединения процессов на одном компьютере, и, следовательно, идентификатор процесса используется в качестве идентификатора. А поскольку сообщения netlink могут быть в идеале многоадресными, другим идентификатором, который необходим сокету netlink, является группа сообщений. Все компоненты, которые связаны с одной и той же группой сообщений, фактически связаны между собой. Таким образом, хотя в случае IPv4 мы используем sockaddr_in вместо sockaddr, здесь мы используем sockaddr_nl, который содержит вышеупомянутые идентификаторы.
Теперь, поскольку мы не собираемся использовать стек TCP/IP ядра, в случае сообщений netlink пакеты netlink можно считать необработанными (пожалуйста, исправьте меня здесь, если я ошибаюсь). Следовательно, единственная инкапсуляция, через которую проходит пакет netlink, - это заголовок сообщения netlink, определенный как nlmsghdr.
Теперь перейдем к нашей программе ucon, main()
сначала создает сокет семейства NETLINK с протоколом соединителя. Затем он заполняет вышеупомянутую структуру сокет-адреса netlink соответствующей информацией. Для того, чтобы немного поэкспериментировать, я добавил запись в файл connector.h. Теперь вот мой первый вопрос.
Сообщение соединителя имеет определенный тип, определенный в соединителе. Теперь эта структура сообщений соединителя является чем-то полностью внутренним для netlink, верно? Что касается netlink, это все, кроме полезной нагрузки. Правильно?
Далее, что именно означает поле nl-group в структуре заголовка сообщения netlink? Определение на самом деле не содержит элемент этого имени. Итак, используем ли мы методы наложения для заполнения определенных полей заголовка сообщения netlink? И если да, то что именно соответствует? Я не могу найти это нигде.
Таким образом, после привязки адреса сокета к сокету, он отправляет 10000 уникальных фрагментов данных на основе соединителя, что для netlink является чистой полезной нагрузкой. Но что странно в отношении этих сообщений, так это то, что все они имеют одинаковый порядковый номер.
Двигаясь дальше, мы попадаем в подпрограмму netlink_send для отправки этих пакетов через сокет, к которому мы привязаны выше. Эта подпрограмма использует различные вспомогательные макросы netlink для манипулирования данными для отправки. Как мы говорим выше, main()
Функция отправляет 10000 фрагментов данных, каждая из которых имеет нулевую длину и не требует подтверждения, поскольку поле подтверждения равно 0 (пожалуйста, исправьте меня, если я здесь не прав). Таким образом, каждый "пакет" - это не что иное, как заголовок сообщения соединителя, в котором ничего нет. Правильно?
Что удивительно, так это то, что функция netlink_Send использует тот же порядковый номер, что и main(), поскольку она является глобальной переменной. Однако после пост-приращения в main () теперь оно равно '1'. Таким образом, в основном наш разговор по netlink начинается с порядкового номера "1". Это нормально?
Рассматривая некоторые из вспомогательных макросов, определенных в linux/netlink.h, я попытаюсь обобщить свое понимание тех, которые прямо или косвенно используются в этой программе.
#define NLMSG_LENGTH(len) ((len)+NLMSG_ALIGN(NLMSG_HDRLEN))
Таким образом, этот макрос сначала выровняет длину заголовка сообщения netlink, а затем добавит к нему длину полезной нагрузки. В нашем случае полезная нагрузка netlink является заголовком соединителя без какой-либо собственной полезной нагрузки. В нашем случае этот микро используется так
nlh->nlmsg_len = NLMSG_LENGTH(size - sizeof(*nlh));
Здесь я не понимаю фактическую полезную нагрузку сообщения netlink. В приведенном выше случае это размер заголовка сообщения соединителя (поскольку само сообщение соединителя не содержит собственной полезной нагрузки) за вычетом указателя (который указывает на первый байт сообщения netlink и, следовательно, заголовок сообщения netlink). И этот указатель (как и любая другая переменная указателя) равен размеру машинного слова, который в моем случае составляет 4 байта. Почему мы вычитаем это из заголовка сообщения соединителя?
После этого мы отправляем сообщение через этот сокет netlink, как и любой другой сокет IPv4. надеюсь услышать от вас, ребята, в отношении вышеупомянутых вопросов. Включение некоторых предложений до того, как фактический вопрос поможет, так как мой пост довольно длинный. Но я надеюсь, что это будет полезно для людей больше, чем только я.
С уважением.