Перенос широковещательных приложений в IPv6
В этом разделе описаны лучшие практики по переносу широковещательного приложения IPv6 на использование возможностей многоадресной рассылки, доступных с помощью сокетов Windows.
Сравнение IPv4 с IPv6
Наиболее заметным фактором при подготовке к переносу широковещательного приложения IPv4 в IPv6 является следующее: IPv6 не реализует концепцию широковещательной трансляции. Вместо этого IPv6 использует многоадресную рассылку.
Многоадресная рассылка для IPv6 может эмулировать традиционные способности вещания, присущие IPv4. Задание параметра сокета IPV6_ADD_MEMBERSHIP с IPv6-адресом, установленным как адрес всех узлов в локальной области (FF02::1), эквивалентно широковещательной передаче на IPv4-адресах с использованием параметра сокета SO_BROADCAST. Этот адрес иногда называется группы многоадресной рассылки. Для приложений, которые просто хотят эмуляции широковещательной передачи для IPv6, этот подход является операционным эквивалентом. Одно из заметных различий в IPv6 заключается в том, что многоадресные рассылки на адрес группы всех узлов по умолчанию не принимаются (в IPv4 широковещательные рассылки принимаются по умолчанию). Программисты приложений должны использовать параметр сокета IPV6_ADD_MEMBERSHIP для включения приема многоадресной рассылки из любого источника, включая адрес группы многоадресной рассылки всех узлов.
Заметка
В IPv6 выбор интерфейса указывается в структуре аргументов, переданной параметру сокета многоадресной рассылки или IOCTL.
Но для более богатой, более надежной, более селективной и более управляемой передачи данных на несколько хостов разработчикам приложений следует рассмотреть возможность перехода к многоадресной модели.
Переход на многоадресную рассылку
С помощью многоадресной рассылки программисты приложений могут выборочно выбирать определенную пару источник/группа, что позволяет реализовать модель выборочного приема. Обнаружение многоадресного прослушивателя (MLD) в IPv6 и протокол управления группами Интернета версии 3 (IGMPv3) в IPv4 поддерживают многоадресную передачу данных. Кроме того, многоадресная рассылка позволяет приложениям специально блокировать (или разблокировать) отправителей в группе, что обеспечивает дополнительную защиту приложений от недобросовестных отправителей. Эта возможность доступна для IPv4 (требует IGMPv3), а также для IPv6 (требуется MLDv2).
Существует два основных сценария для программистов приложений, использующих многоадресную рассылку: портирование приложений с широковещательной (или многоадресной) рассылкой IPv4 на IPv6 и создание новых приложений для многоадресной рассылки IPv6.
Для переноса существующих приложений существует два варианта перехода на многоадресную рассылку IPv6: использование параметров сокета и использование ioCTLs.
- Использование параметров сокета — это подход на основе изменений, который позволяет разработчикам изменять свойства сокета по мере необходимости (например, блокировать или разблокировать отправителя, добавлять новый источник и т. д.). Этот подход более интуитивен и рекомендован. Дополнительные сведения о подходе, основанном на изменениях, к многоадресному программированию см. в разделе MLD и IGMP с помощью сокетов Windows.
- Использование ioCTLs — это окончательный подход на основе состояния, так как он позволяет разработчикам предоставлять полностью настроенное состояние сокета, включая списки включения и исключения, с одним вызовом. Дополнительные сведения о подходе на основе конечного состояния см. в разделе Final-State-Based Многоадресное программирование.
Для тех, кто создает новые многоадресные приложения IPv6, рекомендуется использовать параметры сокета, а не использовать ioCTLs.
Существует еще один подход к созданию многоадресных приложений с помощью IPv6, и это влечет за собой использование функции WSAJoinLeaf. Хотя использование функции WSAJoinLeaf не является рекомендуемой практикой, существуют ситуации, которые могут диктовать его использование. Например, один из недостатков использования параметров сокета в Windows Server 2003 и более ранних версиях заключается в том, что они зависимы от версии IP. В этих старых версиях Windows разные параметры сокетов должны быть для IPv6 и IPv4. В Windows Vista и более поздних версиях поддерживаются новые параметры сокета, которые можно использовать как с IPv4, так и с IPv6. Функция WSAJoinLeaf, напротив, не зависит от версий IP и протоколов, поэтому это может быть полезным подходом для создания приложения, которое должно работать с несколькими версиями IP в Windows Server 2003 и более ранних версиях. Использование функции WSAJoinLeaf может быть более подходящим в определенных ситуациях, когда требуется независимость от протокола и версии IP.