UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Проследим шаги, которые проходит пакет от отправителя до получателей.
■ Пакеты многоадресной передачи рассылаются отправителем в левой верхней локальной сети. Получатель H1 получает их (так как он присоединился к группе), как и MR1 (поскольку маршрутизатор многоадресной передачи должен получать все пакеты многоадресного вещания).
■ MR1 передает пакет многоадресной передачи дальше маршрутизатору MR2, поскольку протокол маршрутизации многоадресной передачи сообщил MR1, что MR2 должен получить пакеты, предназначенные для этой группы.
■ MR2 передает этот пакет присоединенной локальной сети, поскольку узлы H2 и H3 входят в группу. Он также создает копию пакета и отправляет ее MR3.
Создание копии пакета маршрутизатором свойственно только многоадресной передаче. Пакет направленной передачи никогда не дублируется при передаче маршрутизаторами.
■ MR3 с отправляет пакет многоадресной передачи маршрутизатору MR4, но не передает копию в свою локальную сеть, потому что ни один из узлов в этой сети не присоединился к группе.
■ MR4 передает пакет на присоединенную локальную сеть, поскольку узлы H4 и H5 входят в группу. Он не создает копии пакета и не отправляет пакет маршрутизатору MR, поскольку ни один из узлов присоединенной к MR локальной сети не входит в группу, и MR4 знает об этом из информации о маршрутизации многоадресной передачи, которой он обменялся с MR.
Две менее желательные альтернативы многоадресной передаче в глобальной сети — лавинная адресация (broadcast flooding) и отправка индивидуальных копий каждому получателю. В первом случае отправитель будет передавать широковещательные пакеты, а каждый маршрутизатор будет передавать пакет с каждого из своих интерфейсов, кроме принимающего. Ясно, что это увеличит число незаинтересованных узлов и маршрутизаторов, которым придется получать этот пакет.
Во втором случае отправитель должен знать IP-адреса всех получателей и отослать каждому по копии пакета. В случае с пятью пакетами, который представлен на рис. 21.6, это потребует пяти пакетов в локальной сети отправителя, четырех пакетов, идущих от MR1 к MR2, и двух пакетов, идущих от MR2 к MR3 и к MR4. А если получателей будет миллион?!
21.5. Многоадресная передача от отправителя
Внедрение многоадресной передачи в глобальные сети было затруднено несколькими обстоятельствами. Главная проблема заключается в том, что протокол маршрутизации MRP, описанный в разделе 21.4, должен обеспечивать доставку данных от всех отправителей (которые могут располагаться в сети совершенно произвольным образом) всем получателям (которые также могут быть размещены произвольно). Еще одна проблема связана с выделением адресов: адресов многоадресной передачи IPv4 недостаточно для того, чтобы можно было статически назначать их всем, кому они нужны, как это делается с адресами направленной передачи. Чтобы передавать многоадресные сообщения в глобальной сети, не конфликтуя с другими отправителями, нужно иметь уникальный адрес, однако механизма глобального выделения адресов еще не существует.
Многоадресная передача от отправителя (source-specific multicast, SSM) [47] представляет собой эффективное решение этих проблем. Она состоит в соединении адреса группы с адресом отправителя.
■ При подключении к группе получатели предоставляют маршрутизаторам не только адрес группы, но и адрес отправителя. Это устраняет проблему поиска, потому что теперь маршрутизатор точно знает, где находится отправитель. Однако при этом сохраняется удобство масштабирования приложений, потому что отправителю все так же не нужно знать адреса всех своих получателей. Такое решение очень сильно упрощает протоколы маршрутизации многоадресной передачи.
■ Идентификатор группы перестает быть групповым адресом и становится комбинацией адреса отправителя (адреса направленной передачи) и адреса группы (адреса многоадресной передачи). Такая комбинация называется в SSM каналом (channel). Благодаря этому отправитель может выбрать любой адрес многоадресной передачи, так как уникальность канала обеспечивается уже уникальностью адреса отправителя. Сеанс SSM представляет собой комбинацию адреса отправителя, адреса группы и порта.
SSM обеспечивает некоторую защиту от подмены адреса, потому что отправителю 2 становится значительно труднее передавать сообщения по каналу отправителя 1, так как идентификатор этого канала включает в себя адрес отправителя 1. Подмена все еще остается возможной, однако серьезно усложняется.
21.6. Параметры сокетов многоадресной передачи
Для поддержки многоадресной передачи программным интерфейсом приложений (API) требуется только пять новых параметров сокетов. Поддержка фильтрации отправителей, необходимая для SSM, требует еще четырех параметров. В табл. 21.2 показаны три параметра, не имеющих отношения к членству в группах, а также тип данных аргумента, который предполагается использовать в вызове функций
getsockopt
setsockopt
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 | Отсоединение от группы источника |