Уильям Стивенс - UNIX: разработка сетевых приложений
- Название:UNIX: разработка сетевых приложений
- Автор:
- Жанр:
- Издательство:Питер
- Год:2007
- Город:Санкт-Петербург
- ISBN:5-94723-991-4
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Уильям Стивенс - UNIX: разработка сетевых приложений краткое содержание
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
UNIX: разработка сетевых приложений - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Многоадресная передача от отправителя ( source-specific multicast , SSM ) [47] представляет собой эффективное решение этих проблем. Она состоит в соединении адреса группы с адресом отправителя.
■ При подключении к группе получатели предоставляют маршрутизаторам не только адрес группы, но и адрес отправителя. Это устраняет проблему поиска, потому что теперь маршрутизатор точно знает, где находится отправитель. Однако при этом сохраняется удобство масштабирования приложений, потому что отправителю все так же не нужно знать адреса всех своих получателей. Такое решение очень сильно упрощает протоколы маршрутизации многоадресной передачи.
■ Идентификатор группы перестает быть групповым адресом и становится комбинацией адреса отправителя (адреса направленной передачи) и адреса группы (адреса многоадресной передачи). Такая комбинация называется в SSM каналом ( channel ). Благодаря этому отправитель может выбрать любой адрес многоадресной передачи, так как уникальность канала обеспечивается уже уникальностью адреса отправителя. Сеанс SSM представляет собой комбинацию адреса отправителя, адреса группы и порта.
SSM обеспечивает некоторую защиту от подмены адреса, потому что отправителю 2 становится значительно труднее передавать сообщения по каналу отправителя 1, так как идентификатор этого канала включает в себя адрес отправителя 1. Подмена все еще остается возможной, однако серьезно усложняется.
21.6. Параметры сокетов многоадресной передачи
Для поддержки многоадресной передачи программным интерфейсом приложений (API) требуется только пять новых параметров сокетов. Поддержка фильтрации отправителей, необходимая для SSM, требует еще четырех параметров. В табл. 21.2 показаны три параметра, не имеющих отношения к членству в группах, а также тип данных аргумента, который предполагается использовать в вызове функций getsockopt
или setsockopt
для IPv4 и IPv6. В табл. 21.3 представлены оставшиеся шесть параметров сокетов для IPv4, IPv6 и не зависящего от IP-версии API. Во втором столбце показан тип данных переменной, указатель на которую является четвертым аргументом функций getsockopt
и setsockopt
. Все девять параметров действительны с функцией setsockopt
, но шесть предназначенных для входа и выхода из группы не могут быть использованы в вызове функции getsockopt
.
Таблица 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 — различаются только их названия и типы аргументов.
■ IP_ADD_MEMBERSHIP
, IPV6_JOIN_GROUP
, MCAST_JOIN_GROUP
. Назначение этих параметров — присоединение к группе на заданном локальном интерфейсе. Мы задаем локальный интерфейс одним из его направленных адресов для IPv4 или индексом интерфейса для IPv6. Следующие три структуры используются при присоединении к группе или при отсоединении от нее:
struct ip_mreq {
struct in_addr imr_multiaddr; /* IPv4-адрес многоадресной
передачи класса D */
struct in_addr imr_interface; /* IPv4-адрес локального
интерфейса */
};
struct ipv6_mreq {
struct in6_addr ipv6mr_multiaddr; /* IPv6-адрес многоадресной
передачи */
unsigned int ipv6mr_interface; /* индекс интерфейса или 0 */
};
struct group_req {
unsigned int gr_interface; /* индекс интерфейса или 0 */
struct sockaddr_storage gr_group; /* адрес многоадресной передачи
IPv4 или IPv6 */
};
Если локальный интерфейс задается как универсальный адрес ( INADDR_ANY
для IPv4) или как нулевой индекс IPv6, то конкретный локальный интерфейс выбирается ядром.
Мы говорим, что узел принадлежит к данной группе на данном интерфейсе, если один или более процессов в настоящий момент принадлежат к этой группе на этом интерфейсе.
Сокет может быть присоединен к нескольким группам, но к каждой группе должен быть присоединен уникальный адрес или уникальный интерфейс. Это свойство можно использовать на узле с несколькими сетевыми интерфейсами: создается один сокет, которому присваивается один адрес многоадресной передачи, но благодаря наличию разных интерфейсов этот сокет может быть присоединен к разным группам.
Читать дальшеИнтервал:
Закладка: