Главная страница
Навигация по странице:

  • Маршрутизируемая плоскость управления ^маршрутизируемая плоскость управления Рис. 1 1 - 1 . Маршрутизируемые и ^ м а р ш р у т и з и р у е м ы е плоскости управления

  • Г Л А В А 1 1 Многоадресная рассылкаI Т ПО!

  • Семантика многоадресной рассылки

  • ЧАСТЬ II Интерфейс прикладного программирования Wmsock

  • Маршрутизируемая плоскость данных ^маршрутизируемая плоскость данных Рис. 11-2. Маршрутизируемые и немаршрутизируемые плоскости данных

  • Свойства многоадресной рассылки

  • Многоадресная рассылка в сетях IP

  • 224.0.0.0

  • 224.0.0.9

  • Многоадресная рассылка в сетях ATM

  • Корневые узлы ATM 10l

  • Многоадресная рассылка с использованием Winsock

  • Рассылка средствами Winsock 1

  • SOCKET struct ipjnreq SOCKADDR_IN int s; ipmr; local; len = sizeof(ipmr); s = socket(AF_INET, SOCK_DGRAM, 0);

  • Программирование в сетях Windows. Э. Джонс, Д. Оланд


    Скачать 2.88 Mb.
    НазваниеЭ. Джонс, Д. Оланд
    АнкорПрограммирование в сетях Windows.pdf
    Дата12.10.2017
    Размер2.88 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование в сетях Windows.pdf
    ТипКнига
    #9346
    страница28 из 50
    1   ...   24   25   26   27   28   29   30   31   ...   50
    ГЛАВА 11 Многоадресная рассылка
    309
    ления есть особый участник многоадресной группы — корень c_root. Осталь- ные участники группы называются листами — c_leaf. В большинстве случа- ев корень (c_root) организует многоточечную группу, инициируя соедине- ния с любым количеством листов (c_leaf). Иногда лист запрашивает членство в данной многоточечной группе позже. При этом для данной группы может существовать только один корневой узел. Пример корневой плоскости уп- равления — протокол ATM.
    Равноправная плоскость управления позволяет соединяться с группой лю- бому участнику, то есть все участники группы являются листами (узлами c_leaf).
    Каждый участник вправе присоединиться к многоточечной группе. Вы може- те создать собственную схему членства в группе в рамках равноправной плос- кости управления (тогда один из узлов станет корнем — croot), разработав собственный протокол членства. Впрочем, ваша схема группового членства будет по-прежнему основана на равноправной плоскости управления. Пример такой равноправной плоскости управления — многоадресная 1Р-рассылка.
    На рис. 11-1 показаны различия между корневой и равноправной плоскостя- ми управления. В корневой плоскости управления (слева) корень (c_root) дол- жен явно опросить каждый лист (c_leaf) для присоединения к группе, в то вре- мя как в равноправной схеме (справа) к группе может присоединиться любой.
    \
    Маршрутизируемая плоскость управления
    ^маршрутизируемая плоскость управления
    Рис. 1 1 - 1 . Маршрутизируемые и ^ м а р ш р у т и з и р у е м ы е плоскости управления

    Г Л А В А 1 1
    Многоадресная рассылка
    I Т
    ПО!
    Многоадресная рассылка (multicasting) — сравнительно новая технология,
    позволяющая отправлять данные от одного участника сети, а затем тиражиро- вать множеству других, не создавая при этом большой нагрузки на сеть. Эта технология была разработана как альтернатива широковещанию (broadcasting),
    которое при активном использовании снижает пропускную способность сети. При многоадресной рассылке данные передаются в сеть, только если процессы, выполняемые на рабочих станциях в этой сети, запрашивают их.
    Не все протоколы поддерживают многоадресную рассылку. На платформах
    Win32 таких протоколов, доступных из Winsock, только два: IP и ATM.
    Мы обсудим технологию многоадресной рассылки в целом, а также по- ясним, как она реализована в этих двух протоколах. Первоначально рассмот- рим основы семантики многоточечных сетей, включая разные типы много- адресной рассылки, а так же основные характеристики IP и ATM. И наконец,
    опишем API-вызовы для многоадресной рассылки в Winsock 1 и Winsock 2.
    Ее поддержка для IP появилась в Winsock 1, а в Winsock 2 интерфейс много- адресной рассылки стал независимым от протокола.
    Многоадресная рассылка поддерживается в Windows СЕ 2.1,9х, NT 4 и 2000.
    Поддержка многоадресной рассылки по IP появилась в Windows СЕ лишь с версии 2.1. Все платформы, поддерживающие многоадресную рассылку, под- держивают ее по протоколу IP. Естественная поддержка ATM в Winsock появи- лась только в Windows 98 и 2000. Заметьте: это не мешает разрабатывать при- ложения многоадресной IP-рассылки для сетей ATM. Просто вы не сможете на- писать «родной» код многоадресной ATM-рассылки. Мы подробно рассмот- рим этот вопрос в разделе, посвященном многоадресной рассылке в IP-сетях.
    Есть еще одна проблема: некоторые устаревшие сетевые адаптеры не спо- собны принимать и отправлять информацию по адресам многоадресной IP- рассылки. Большинство сетевых адаптеров произведенных за последние несколько лет поддерживают многоадресную IP-рассылку, но есть и исклю- чения.
    Семантика многоадресной рассылки
    Многоадресная рассылка обладает двумя важными характеристиками: плос-
    костью управления (control plane) и плоскостью данных (data plane). Пер- вая определяет способ организации членства в группах, вторая — отражает способ распространения данных среди членов сети. Любая из этих плоско- стей может быть корневой или равноправной. В корневой плоскости управ-

    310
    ЧАСТЬ II Интерфейс прикладного программирования Wmsock
    Плоскость данных также может быть маршрутизируемой или немаршру- тизируемой. В маршрутизируемой плоскости данных есть участник, называ- емый drool Передача данных происходит только между d_root и всеми уча- стниками многоточечного сетевого соединения, называемыми djeaf. Тра- фик может быть и одно-, и двунаправленным. Но маршрутизируемая плос- кость данных подразумевает, что данные, передаваемые от одного d_leaf бу- дут приняты только d r o o t , в то время как данные передаваемые от d_root будут получены каждым d_leaf.
    Пример маршрутизируемой плоскости данных — ATM. Рис. 11-2 показы- вает различия между маршрутизируемой или немаршрутизируемой плоско- стью данных. В маршрутизируемой плоскости данных (слева) данные abc от d r o o t передаются каждому dleaf. Данные xyz, передаваемые от d_leaf, при- нимаются только d_root. В этом отличие от немаршрутизированной плос- кости (справа), где данные abc и xyz передаются каждому участнику сети вне зависимости от того, кто их отправил.
    Маршрутизируемая плоскость данных
    ^маршрутизируемая плоскость данных
    Рис. 11-2. Маршрутизируемые и немаршрутизируемые плоскости данных
    Наконец, в немаршрутизируемой плоскости данных все члены группы могут отправлять данные всем остальным членам группы, и все получатели вправе отправлять данные в обратном направлении. Нет ограничений на то,

    Г Л А В А 11 Многоадресная рассылка 311
    кто может получать или отправлять данные. Напомним, что многоадресная рассылка в сетях IP не маршрутизируется в плоскости данных.
    Как видно, многоадресная рассылка в сетях ATM маршрутизируется и в плоскости управления, и в плоскости данных, в то время как многоадресная рассылка в сетях IP не маршрутизируема ни в одной из плоскостей. Поми- мо этих двух комбинаций могут существовать и другие. Например, совмест- но с маршрутизируемой плоскостью управления, где один узел решает, кто вправе присоединиться к группе, может существовать немаршрутизируемая плоскость данных, где данные, отправленные одним участником, будут дос- тавлены остальными. Впрочем, ни один из поддерживаемых на сегодня про- токолов в Winsock не ведет себя таким образом.
    Свойства многоадресной рассылки
    В главе 5 мы обсудили, как перечислять записи протоколов и определять их свойства. Вся необходимая информация о протоколе также доступна в записи протокола в каталоге Поле divServiceFlagsl из структуры WSAPROTOCOLJNFO,
    возвращаемой WSAEnumProtocols, содержит несколько интересующих нас бит.
    Если задан бит ХР1 _SUPPORT_MULTIPO1NT, протокол поддерживает многоадрес- ную рассылку При заданном бите ХР1 _MULTIPOINT_CONTROL_PLANE протокол поддерживает маршрутизируемую плоскость управления, иначе — нет. Задан- ный бит ХР1 _MULT1POINT_DATA_PLANE сообщает, что протокол поддерживает маршрутизируемую плоскость данных, если бит равен 0 — нет.
    Многоадресная рассылка в сетях IP
    Многоадресная рассылка в сетях IP зависит от групповых адресов (multicast address). Например, если пять узлов хотят взаимодействовать путем многоад- ресной рассылки, они должны объединиться под неким групповым адресом.
    Затем любая информация, отправляемая одним узлом, будет передаваться каж- дому участнику группы, включая и тот узел, с которого была отправлена. Груп- повой адрес — IP-адрес класса D в диапазоне 224-0.0 0 — 239-255 255.255- Часть этих адресов зарезервирована для специальных целей, например, последние два — для использования протоколом IGMP, который мы вкратце рассмот- рим.
    Полный список зарезервированных адресов содержится в RFC 1700, где перечислены сетевые ресурсы особого назначения. Поддержкой этого спис- ка занимается агентство IANA. Вот некоторые зарезервированные адреса:
    И 224.0.0.0 — базовый адрес;
    И 224.0.0.1 — все системы в данной подсети, *
    В 224.0.0.2 — все маршрутизаторы в данной подсети;
    Ш 224.0.1.1 — протокол сетевого времени,
    И 224.0.0.9 — групповой адрес RIP версии 2;
    Ш 224.0.1.24 — групповой адрес WINS-сервера.
    Во времена разработки протокола TCP/IP о многоадресной рассылке еще не думали, поэтому, чтобы протокол IP поддерживал ее, требовались коррек-

    3 1 2 ЧАСТЬ II Интерфейс прикладного программирования Winsock тивы. Мы уже рассказали о требовании IP, чтобы назначенные специальные адреса применялись только для многоадресного трафика. Кроме того, был разработан специальный протокол для управления клиентами многоадрес- ной рассылки и их членством в группах. Представьте, что две рабочие стан- ции в отдельных подсетях хотят присоединиться к одной многоадресной группе. Как это осуществить средствами IP? Вы не можете направлять инфор- мацию на групповой адрес наобум: сеть переполнится многоадресными дан- ными. Для уведомления маршрутизаторов, что компьютер в сети хочет при- нимать данные, предназначенные группе, был разработан протокол IGMP.
    Протокол IGMP
    Узлы многоадресной рассылки используют IGMP для сообщения маршрути- заторам, что компьютер в маршрутизируемой подсети хочет присоединить- ся к определенной многоадресной группе. IGMP — основа реализации мно- гоадресной рассылки в IP, чтобы рассылка шла корректно, его должны под- держивать все маршрутизаторы между двумя узлами. Например, если ком- пьютеры А и В объединены в группу 224.1.2.3 и между ними три маршрути- затора, то все эти маршрутизаторы должны быть совместимы с IGMP. Любой другой маршрутизатор просто удалит полученные данные многоадресной рассылки. Когда приложение присоединяется к многоадресной группе, на адрес всех маршрутизаторов в подсети (224.0.0.2) отправляется IGMP-коман- да join. Эта команда уведомляет маршрутизатор о наличии клиентов, заин- тересованных в получении данных с определенного группового адреса. Ког- да маршрутизатор получит данные, предназначенные для этого адреса, он переправит их в подсеть заинтересованного клиента.
    Присоединяясь к группе, конечная точка указывает параметр время жиз-
    ни (time-to-live, TTL) — сколько маршрутизаторов может пересекать прило- жение на данной конечной точке при отправке и получении данных.
    Например, если вы пишете приложение многоадресной рассылки, кото- рое присоединяется к группе X с параметром TTL, равным 2, то группе мар- шрутизаторов в локальной подсети будет отправлена соответствующая ко- манда join. Маршрутизаторы этой подсети примут команду и начнут пере- сылать вещательные данные, предназначенные для указанного адреса. Затем каждый маршрутизатор уменьшит TTL на 1 и передаст команду присоединения в соседние сети. Маршрутизаторы этих сетей выполняют ту же операцию, снова уменьшая TTL В результате TTL станет равным 0, и команда дальше передаваться не будет. Так TTL ограничивает зону передачи вещательных данных.
    Зарегистрировав одну или несколько групп многоадресной рассылки,
    маршрутизатор начнет периодически отправлять сообщение группового опроса всем узлам (224.0.0.1) для каждого группового адреса, который был зарегистрирован командой join. Если клиенты этой сети все еще использу- ют групповой адрес, они ответят IGMP-сообщением, чтобы маршрутизатор продолжал перенаправлять данные, связанные с этим адресом. Даже если кли- ент явно покидает многоадресную группу, используя любой из соответствую- щих методов Winsock, фильтр на маршрутизаторе сбрасывается не сразу.

    ГЛАВА 11 Многоадресная рассылка 313
    К сожалению, это может привести к нежелательным последствиям: кли-»
    ент выйдет из группы А и немедленно присоединиться к группе В. Пока мар- шрутизатор не произведет опрос и не получит отрицательный ответ, он бу- дет пересылать в сеть информацию, предназначенную для обеих групп. Это особенно плохо, если суммарный размер передаваемой информации боль- ше пропускной способности сети. Вот здесь и проявляется преимущество
    IGMP, версии 2: она позволяет клиенту явно отправить маршрутизатору со- общение leave о выходе из группы, чтобы немедленно остановить переда- чу данных для этого адреса. Конечно, маршрутизатор поддерживает конт- рольный счетчик количества клиентов для каждого адреса, поэтому пока все клиенты подсети не откажутся от адреса, данные, предназначенные для него,
    будут распространяться.
    Windows 98 и Windows 2000 изначально поддерживают IGMP версии 2. Пос- ледняя версия обновления Windows 95 содержит IGMP 2. Для Windows NT 4
    поддержка IGMP 2 включена в Service Pack 4. Предыдущие версии пакетов об- новлений и базовая версия ОС поддерживают только IGMP 1. Подробную спе- цификацию IGMP 1 и 2 см. в RFC 1112 и RFC 2236, соответственно.
    Листовые узлы IP
    Процесс присоединения группы многоадресной рассылки в сетях IP прост,
    так как каждый узел является листовым (leaf) и поэтому выполняет одина- ковые шаги для присоединения к группе. Поскольку многоадресная рассылка в сетях IP доступна в Winsock 1 и 2, есть два механизма API-вызовов для вы- полнения одной и той же операции. Вот основные шаги для выполнения многоадресной рассылки средствами Winsock 1.
    1. С помощью функции socket создайте сокет семейства адресов AFJNET
    типа SOCKJDGRAM. Никаких особых флагов, указывающих на многоадрес- ный характер сокета, не требуется, поскольку функция socket не имеет флаговых параметров.
    2. Свяжите сокет с локальным портом, если хотите получать данные от группы.
    3. Вызовите функцию setsockopt с параметром IP_ADD_MEMBERSHIP и указа- нием адресной структуры для группы, к которой хотите присоединиться.
    Если вы используете Winsock 2, то шаги 1 и 2 — те же, а в шаге 3 вызови- те функцию WSAJoinLeaf для добавления своего адреса в группу. Эти две функ- ции и их различия подробно обсуждаются далее, в разделах, посвященных многоадресной рассылке средствами Winsock.
    Напомним: приложению не нужно присоединяться к группе, если оно только отправляет данные. При отправке данных в многоадресную группу применяется обычный UDP-пакет, только направляется он по групповому адресу. Если вам нужно принимать рассылку, тогда присоединитесь к груп- пе. За исключением требования членства в группе, IP-рассылка характери- зуется так же, как обычный протокол UDP: не требует логического соедине- ния, не надежна и т. д.

    3 1 4 ЧАСТЬ II Интерфейс прикладного программирования Winsock
    Реализация IP-рассылки
    IP-рассылка поддерживается всеми платформами Windows (кроме Windows
    СЕ до версии 2.1), но реализуется немного по-разному на каждой. Мы уже упоминали, что сетевой адаптер должен поддерживать многоадресную рас- сылку — уметь аппаратно добавлять многоадресные фильтры в интерфейс.
    Групповые IP-адреса используют специальный МАС-адрес, который содер- жит шифрованный IP-адрес. Поэтому сетевые адаптеры могут легко выяс- нить, является ли входящий пакет рассылкой и, изучив МАС-заголовок, по- нять, по какому групповому IP-адресу он отправлен. Механизм шифрования описан в RFC 1700. Мы не будем обсуждать его здесь, потому что он не име- ет отношения к Winsock.
    Впрочем, Windows 95 и Windows NT 4 выполняют многоадресную рас- сылку за счет перевода сетевого адаптера в смешанный режим. Тогда сете- вой адаптер извлекает все принимаемые пакеты, и сетевой драйвер изучает
    МАС-заголовки в поисках многоадресных данных, предназначенных груп- пе, членом которой является процесс, выполняющийся на рабочей станции.
    Так как эта фильтрация осуществляется программно, она не столь оптималь- на, как аппаратная.
    Windows 98 и Windows 2000 ведут себя иначе, поскольку знают о возмож- ности адаптеров добавлять аппаратные фильтры. Большинство сетевых адап- теров поддерживают 1б или 32 аппаратных фильтра. Единственное ограни- чение Windows 98: как только будут заняты все аппаратные фильтры, процесс на компьютере не сможет присоединиться к группе. Если аппаратный предел превышен, то операция присоединения завершится с ошибкой WSAENOBUFS.
    Windows 2000 более устойчива.- когда все аппаратные фильтры израсходова- ны, она переводит сетевой адаптер в смешанный режим и функционирует аналогично Windows 95 и Windows NT 4.
    Многоадресная рассылка в сетях ATM
    «Родной» ATM через Winsock тоже поддерживает многоадресную рассылку,
    предлагая куда большие возможности по сравнению с IP. Вспомните, что ATM
    поддерживает маршрутизируемые плоскости управления и данных. То есть когда многоадресный сервер (или c_root) существует, он контролирует со- став групп, а также маршруты передачи внутри группы.
    Важно также, что в АТМ-сетях IP-трафик может передаваться поверх ATM.
    Такая конфигурация позволяет ATM-сетям эмулировать IP-сеть путем сопо- ставления IP-адресов собственным ATM-адресам. IP поверх ATM позволяет выбрать: применять ли многоадресную рассылку в сетях IP, которая будет транслироваться на уровень ATM, или использовать собственные возмож- ности ATM для рассылки. Поведение IP-рассылки в ATM при использовании
    IP поверх ATM точно такое же, как в обычной IP-сети. Единственное исклю- чение: отсутствие IGMP, поскольку все многоадресные вызовы преобразуют- ся в «родные» команды ATM.
    Кроме того, можно сконфигурировать в ATM-сети одну или несколько эмулирующих локальных сетей (LANE). Цель LANE — сделать так, чтобы ATM-

    Г Л А В А 11 Многоадресная рассылка 315
    сеть выглядела как «обычная», где можно использовать разные протоколы:
    IPX/SPX, NetBEUI, TCP/IP, IGMP, ICMP и др. Тогда рассылка в IP-сети факти- чески выглядит как многоадресная рассылка в сети Ethernet, а значит, дос- тупен и протокол IGMP.
    Мы упоминали, что ATM поддерживает маршрутизируемые плоскости управления и данных: когда вы создаете многоадресную группу, образуется корневой узел, который приглашает листовые. В Windows 2000 сейчас под- держивается только соединение, инициированное корнем, то есть лист не может попросить о включении в группу. Корневой узел (в качестве маршру- тизируемой плоскости данных) отправляет данные только в одном направ- лении: от корня к листьям.
    Еще одно заметное отличие от IP — ATM не нуждается в особых адресах.
    Необходимо только, чтобы корень знал адреса всех листьев, которые он бу- дет приглашать. При этом только один корневой узел может присутствовать в многоадресной группе. Как только другая конечная точка АТМ-сети начинает приглашать другие листья, это объединение отделяется от первой группы.
    Листовые узлы ATM
    Создать листовой узел в многоадресной группе просто. В АТМ-сети лист дол- жен слушать приглашение от корня. Вот что необходимо сделать.
    1. Используя функцию WSASocket, создайте сокет семейства адресов AF_ATM
    с флагами WSAJMGJ^ULTIPOimjO_LEAFviWSAJJAG_MULTIPOINT_D_LEAF.
    2. Свяжите сокет с локальным ATM-адресом и портом функцией bind.
    3. Вызовите функцию listen.
    4. Дождитесь приглашения, используя функции accept или WSAAccept в зави- симости от применяемой модели ввода-вывода. (Более полное описание моделей ввода-вывода Winsock см. в главе 8.)
    Установив соединение, листовой узел может получать данные от корня.
    Помните, что при рассылке в ATM данные передаются в одном направлении:
    от корня к листьям.
    ПРИМЕЧАНИЕ В настоящее время Windows 98 и Windows 2000 спо- j
    8
    собны поддерживать только один листовой узел ATM одновременного?,
    то есть только один процесс во всей системе может быть листовым nl
    участником любого многоадресного сеанса ATM.
    Корневые узлы ATM
    10l
    Создать корневой узел еще легче, чем лист ATM.
    1. С помощью функции WSASocket создайте сокет адресного семейства
    AF_ATM с флагами WSA_FLAG_MULTIPOINT_C_ROOT и WSA_FLAGJiULTI-
    POINTJDJZOOT.
    2. Вызовите функцию WSAJoinLeafn передайте ей в качестве параметра АТМ- адрес каждой конечной точки, которую вы хотите пригласить.

    3 1 6 ЧАСТЬ II Интерфейс прикладного программирования Winsock
    Корневой узел может пригласить любое число конечных точек, но для каждой нужен отдельный вызов WSAJoinLeaf.
    Многоадресная рассылка с использованием
    Winsock
    Теперь рассмотрим соответствующие API-вызовы Winsock. Есть два метода организации многоадресной рассылки в IP-сетях, в зависимости от приме- няемой версии Winsock. Первый метод, доступный в Winsock 1, заключает- ся в использовании параметров сокета для присоединения к группе. Winsock 2
    вводит новую функцию присоединения — WSAJoinLeaf, которая не зависит от базового протокола.
    Метод с использованием Winsock 1 мы обсудим первым. Он широко рас- пространен, главным образом, потому что унаследован от сокетов Беркли.
    Рассылка средствами Winsock 1
    В Winsock 1 для присоединения и выхода из многоадресной группы приме- няется функция setsockopt с параметрами IP_ADD_MEMBERSHIP и IP DROP_
    MEMBERSHIP. При использовании любого из параметров вы должны передать структуру ipjnreq-.
    struct ipjnreq
    {
    ч struct in_addr imrjnultiaddr;
    £
    struct in_addr imr_interface;
    };
    Поле imrjnultiaddr задает группу, к которой нужно присоединиться, а
    imrjnterface — локальный интерфейс для отправки данных. Если указать
    INADDR_ANYдля imrjnterface, будет использован интерфейс по умолчанию.
    Либо если IP-адресов несколько, задайте адрес локального интерфейса явно.
    Следующий пример иллюстрирует присоединение к группе 234.5.6.7.
    SOCKET
    struct ipjnreq
    SOCKADDR_IN
    int
    s;
    ipmr;
    local;
    len = sizeof(ipmr);
    s = socket(AF_INET, SOCK_DGRAM, 0);
    local.sin_family = AF_INET;
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    local.sin_port = htons(10000);
    ipmr.imrjnultiaddr.s_addr = inet_addr("234.5.6.7");
    ipmr.imr_interface.sjiddr = htonl(INADDR_ANY);
    bind(s, (SOCKADDR *)&local, sizeof(local));

    1   ...   24   25   26   27   28   29   30   31   ...   50


    написать администратору сайта