UNIX: разработка сетевых приложений
Шрифт:
SSM обеспечивает некоторую защиту от подмены адреса, потому что отправителю 2 становится значительно труднее передавать сообщения по каналу отправителя 1, так как идентификатор этого канала включает в себя адрес отправителя 1. Подмена все еще остается возможной, однако серьезно усложняется.
21.6. Параметры сокетов многоадресной передачи
Для поддержки многоадресной передачи программным интерфейсом приложений (API) требуется только пять новых параметров сокетов. Поддержка фильтрации отправителей, необходимая для SSM, требует еще четырех параметров. В табл. 21.2 показаны три параметра, не имеющих отношения к членству в группах, а также тип данных аргумента, который предполагается использовать в вызове функций
Таблица 21.2. Параметры сокетов многоадресной передачи
Параметр | Тип данных | Описание |
---|---|---|
IP_MULTICAST_IF | struct in_addr | Интерфейс по умолчанию для исходящих многоадресных пакетов |
IP_MULTICAST_TTL | u_char | TTL для исходящих многоадресных пакетов |
IP_MULTICAST_LOOP | u_char | Включение и отключение закольцовки для исходящих многоадресных пакетов |
IPV6_MULTICAST_IF | u_int | Интерфейс по умолчанию для исходящих многоадресных пакетов |
IPV6_MULTICAST_HOPS | int | Предел количества прыжков для и сходящих многоадресных пакетов |
IPV6_MULTICAST_LOOP | u_int | Включение и отключение закольцовки для исходящих многоадресных пакетов |
Таблица 21.3. Параметры сокета, определяющие членство в группах многоадресной передачи
Параметр | Тип данных | Описание |
---|---|---|
IP_ADD_MEMBERSHIP | struct ip_mreq | Присоединение к группе многоадресной передачи |
IP_DROP_MEMBERSHIP | struct ip_mreq | Отсоединение от группы многоадресной передачи |
IP_BLOCK_SOURCE | struct ip_mreq_source | Блокирование источника из группы, к которой выполнено присоединение |
IP_UNBLOCK_SOURCE | struct ip_mreq_source | Разблокирование ранее заблокированного источника |
IP_ADD_SOURCE_MEMBERSHIP | struct ip_mreq_source | Присоединение к группе источника |
IP_DROP_SOURCE_MEMBERSHIP | struct ip_mreq_source | Отсоединение от группы источника |
IPV6_JOIN_GROUP | struct ipv6_mreq | Присоединение к группе многоадресной передачи |
IPV6_LEAVE_GROUP | struct ipv6_mreq | Отсоединение от группы многоадресной передачи |
MCAST_JOIN_GROUP | struct group_req | Присоединение к группе многоадресной передачи |
MCAST_LEAVE_GROUP | struct group_req | Отсоединение от группы многоадресной передачи |
MCAST_BLOCK_SOURCE | struct group_source_req | Блокирование источника из группы, к которой выполнено присоединение |
MCAST_UNBLOCK_SOURCE | struct group_source_req | Разблокирование ранее заблокированного источника |
MCAST_JOIN_SOURCE_GROUP | struct group_source_req | Присоединение к группе источника |
MCAST_LEAVE_SOURCE_GROUP | struct group_source_req | Отсоединение от группы источника |
Параметры IPv4 TTL и закольцовки получают аргумент типа u_char, в то время как IPv6-параметры предела транзитных узлов и закольцовки получают аргументы соответственно типа int и u_int. Распространенная ошибка программирования с параметрами многоадресной передачи IPv4 — вызов функции setsockopt с аргументом типа int для задания TTL
или закольцовки (что не разрешается [128, с. 354–355]), поскольку большинство других параметров сокетов, представленных в табл. 7.1, имеют целочисленные аргументы. Изменения, внесенные в IPv6, должны уменьшить вероятность ошибок.Теперь мы опишем каждый из девяти параметров сокетов более подробно. Обратите внимание, что эти девять параметров концептуально идентичны в IPv4 и IPv6 — различаются только их названия и типы аргументов.
Если локальный интерфейс задается как универсальный адрес (
Мы говорим, что узел принадлежит к данной группе на данном интерфейсе, если один или более процессов в настоящий момент принадлежат к этой группе на этом интерфейсе.
Сокет может быть присоединен к нескольким группам, но к каждой группе должен быть присоединен уникальный адрес или уникальный интерфейс. Это свойство можно использовать на узле с несколькими сетевыми интерфейсами: создается один сокет, которому присваивается один адрес многоадресной передачи, но благодаря наличию разных интерфейсов этот сокет может быть присоединен к разным группам.
Вспомните из табл. 21.1, что частью адреса многоадресной передачи IPv6 является поле области действия. Как мы отмечали, адреса многоадресной передачи IPv6, отличающиеся только областью действия, являются различными. Следовательно, если реализация протокола синхронизации времени (network time protocol, NTP) хочет получать все пакеты NTP независимо от их области действия, она должна будет присоединиться к адресу
Независимый от версии IP параметр сокета (
В большинстве реализаций число присоединений, допустимых для одного сокета, ограничено. Предел определяется константой IP_MAX_MEMBERSHIPS (для Беркли-реализаций ее значение равно 20). В некоторых реализациях это ограничение снято, в других оно значительно превышает значение для Беркли-реализаций.
Когда интерфейс, на котором будет происходить присоединение, не задан, Беркли-ядра ищут адрес многоадресной передачи в обычной таблице маршрутизации IP и используют полученный в результате интерфейс [128, с. 357]. Некоторые системы для обработки этой ситуации устанавливают маршрут для всех адресов многоадресной передачи (то есть маршрут с адресом получателя 224.0.0.0/8 для IPv4) в процессе инициализации.
Для IPv6 сделано изменение — при задании интерфейса используется индекс, а не локальный адрес направленной передачи, как было в IPv4. Это позволяет выполнять присоединение на ненумерованных интерфейсах и конечных точках туннелей.
Изначально в API многоадресной передачи IPv6 использовалась константа IPV6_ADD_MEMBERSHIP, а не IPV6_JOIN_GROUP. Во всех остальных отношениях интерфейс программирования не изменился. Описанная далее функция mcast_join скрывает это отличие.