глава 12 широковещательная и групповая адресация в главе 1 мы упомянули, что существуют три типа ip адресов: персональный (unicast), широковещательный (broadcast) и групповой (multicast) . в этой главе мы обсудим широковещательные и групповые адреса более подробно. широковещательные и групповые запросы применимы только к udp, подобные типы запросов позволяют приложению послать одно сообщение нескольким получателям. tcp - протокол, ориентированный на соединение, с его помощью устанавливается соединение между двумя хостами (по указанному ip адресу) с использованием одного процесса на каждом хосте (который идентифицируется по номеру порта). представьте себе несколько хостов в ethernet сети. каждый ethernet фрейм содержит ethernet адрес источника и назначения (48 бит). и обычно каждый фрейм предназначается одному получателю. адрес назначения, указывающий на один интерфейс, - называется персональным (unicast). остальные хосты, присутствующие на кабеле, не участвуют в общении между двумя хостами (если не учитывать то, что все хосты находятся все-таки на одном кабеле). однако иногда возникает необходимость послать фрейм всем хостам, находящимся на кабеле, - это называется широковещательной рассылкой (broadcast). мы видели это, когда рассматривали arp и rarp. групповая адресация логически находится между персональной и широковещательной: фрейм должен быть доставлен определенному количеству хостов, которые принадлежат к группе. для того чтобы понять принцип широковещательной и групповой адресации, необходимо отметить, что на каждом хосте происходит фильтрация, каждый раз когда фрейм проходит по кабелю. на рисунке 12.1 показано как это происходит. во-первых, сетевая плата просматривает каждый фрейм, который передается по кабелю, и определяет, необходимо ли принять этот фрейм и доставить его в драйвер устройства. обычно сетевая плата принимает только те фреймы, адрес назначения которых совпадает с аппаратным адресом интерфейса или с широковещательным адресом. в дополнение, большинство интерфейсов могут находиться в смешанном режиме, когда она принимает копию каждого фрейма. этот режим используется, например, программой tcpdump. рисунок 12.1 фильтрация, которая осуществляется стеком протоколов, когда принимается фрейм.
в настоящее время большинство интерфейсов могут быть сконфигурированы таким образом, чтобы принимать фреймы, ip адрес которых является групповым адресом или групповым адресом какой-либо подгруппы. в групповом адресе ethernet младший бит старшего байта установлен в единицу. в шестнадцатиричном представлении этот бит выглядит следующим образом: 01:00:00:00:00:00. (мы можем считать, что широковещательный адрес ethernet ff:ff:ff:ff:ff:ff это особый случай группового адреса ethernet.) когда сетевая плата получает фрейм, она передает его в драйвер устройства. (сетевая плата может отбросить фрейм только в том случае, если не сошлась контрольная сумма ethernet.) дополнительная фильтрация осуществляется драйвером устройства. во-первых, тип фрейма должен принадлежать соответствующему протоколу (ip, arp и так далее). во-вторых, может быть осуществлена дополнительная групповая фильтрация, чтобы проверить, принадлежит ли хост к адресуемой группе. затем драйвер устройства передает фрейм следующему уровню, например, ip, если фрейм является ip датаграммой. ip также осуществляет фильтрацию, основанную на проверке ip адресов источника и назначения, и, в свою очередь, передает датаграмму следующему уровню (например tcp или udp, если все в порядке). каждый раз когда udp получает датаграмму от ip, он осуществляет фильтрацию, основанную на номере порта назначения, а иногда и на номере порта источника. если указанный порт не обслуживается в текущий момент каким-либо процессом, датаграмма отбрасывается, и генерируется icmp сообщение о недоступности порта. (tcp осуществляет подобную фильтрацию, основанную на своих номерах портов.) если в udp датаграмме обнаружена ошибка контрольной суммы, udp молча ее отбрасывает. проблема широковещательных запросов заключается в том, что хосты, которые совсем не заинтересованы в получении этих запросов, должны их обрабатывать. представьте себе приложение, которое должно обрабатывать широковещательные запросы udp. если на кабеле находится 50 хостов, но только из них 20 участвуют в работе этого приложения, в каждый момент времени один из 20 посылает широковещательный запрос udp, при этом остальные 30 хостов должны обработать этот запрос, который проходит весь путь по стеку протоколов до udp уровня, прежде чем датаграмма будет отброшена. udp датаграмма отбрасывается этими 30-ю хостами, потому что порта назначения не обслуживается каким-либо процессом. основная задача групповых запросов - уменьшить загрузку хостов, не учавствующих в работе определенного приложения. хост может принадлежать к одной или нескольким группам. если это возможно, сетевая плата сообщает, к какой группе принадлежит хост, после чего сетевой платой принимаются только фреймы определенной группы. на рисунке 3.9 показаны четыре различные формы широковещательных адресов ip. сейчас мы опишем их более подробно. ограниченный широковещательный запрос ограниченный широковещательный адрес (limited broadcast address) - это адрес 255.255.255.255. он может быть использован в качестве адреса назначения для ip датаграмм в процессе конфигурации хоста, когда хост может не знать собственной маски подсети и даже своего ip адреса. датаграмма, направляющаяся на ограниченный широковещательный адрес, никогда (ни при каких условиях) не будет перенаправлена маршрутизатором. она может существовать только на локальном кабеле. но тут возникает вопрос, на который практически невозможно дать ответ: если хост имеет несколько интерфейсов и процесс посылает датаграмму с ограниченным широковещательным адресом, должна ли датаграмма быть отправлена на каждый подсоединенный интерфейс, который поддерживает широковещательную адресацию? если нет, то приложение, которое хочет разослать широковещательный запрос на все интерфейсы, должно само определить все интерфейсы хоста, которые поддерживают широковещательную адресацию, и послать копию на каждый интерфейс. большинство bsd систем воспринимают 255.255.255.255 как адрес широковещательного адреса первого интерфейса, который был сконфигурирован, и не позволяют послать датаграмму на все подключенные интерфейсы, поддерживающие широковещательную адресацию. и действительно, два приложения, которые посылают udp датаграммы на каждый интерфейс, это routed (глава 10, раздел "демоны маршрутизации в unix") и rwhod (сервер bsd клиента rwho). оба этих приложения проходят через похожую процедуру запуска, чтобы определить все интерфейсы хоста и те, которые поддерживают широковещательную адресацию. широковещательный адрес сети, соответствующий этому интерфейсу затем используется как адрес назначения для датаграмм, которые посылаются в этот интерфейс. требования к хостам host requirements rfc не определяют, должен ли хост, имеющий несколько интерфейсов, посылать ограниченный broadcast на все свои интерфейсы.
широковещательный запрос в сеть в широковещательном адресе сети (net-directed broadcast) идентификатор хоста устанавливается во все единичные биты. широковещательный адрес для сети класса а, имеет вид netid.255.255.255, где netid это идентификатор сети класса а. маршрутизаторы должны перенаправлять широковещательные запросы, направляемые в сеть, однако должна присутствовать опция, позволяющая отключить это перенаправление. широковещательный запрос в подсеть широковещательный адрес подсети (subnet-directed broadcast address) имеет идентификатор хоста, установленный в единицы, однако определенный идентификатор подсети. для того, чтобы классифицировать адрес как широковещательный адрес подсети, необходимо знать маску подсети. например, если маршрутизатор получил датаграмму, с адресом назначения 128.1.2.255, можно считать, что это широковещательный запрос, направленный в подсеть, если сеть класса в 128.1 имеет маску подсети 255.255.255.0, однако это не широковещательный запрос, если маска подсети 255.255.254.0 (0xfffffe00). широковещательный запрос, направленный во все подсети широковещательный адрес всех подсетей (all-subnets-directed broadcast address), также требует знания маски подсети в сети назначения. только в этом случае можно определить различие между широковещательным адресом всех подсетей и широковещательным адресом сети. и идентификатор подсети, и идентификатор хоста, в данном случае, устанавливаются в единицы. например, если маска подсети назначения 255.255.255.0, то ip адрес 128.1.255.255 это широковещательный запрос, направленный во все подсети. однако, если сеть не разбита на подсети, это широковещательный запрос, направляемый в сеть. в настоящее время такой тип широковещательных запросов считается устаревшим [almquist 1993]. в настоящее время используются групповые запросы, а не широковещательные запросы, направленные во все подсети. [almquist 1993] отмечает, что в rfc 922 требуется, чтобы широковещательные запросы, направленные во все подсети, посылались во все подсети, однако не все маршрутизаторы это поддерживают. и это хорошо, так как неверно сконфигурированый хост, без собственной маски подсети, будет посылать эти "локальные" широковещательные запросы во все подсети. например, если хост с ip адресом 128.1.2.3 не имеет установленной маски подсети, его широковещательный адрес по умолчанию устанавливается в 128.1.255.255. однако, если маска подсети должна быть определена как 255.255.255.0, то широковещательные запросы от неправильно сконфигурированного хоста появятся во всех подсетях.
первая широкораспространенная реализация tcp/ip, в системе 4.2bsd (1983 год), использовала для широковещательных адресов идентификатор хоста, установленного во все нули. один из самых ранних примеров обращения к широковещательным ip адресам это ien 212 [gurwitz and hinden 1982], и именно здесь было определено использовать широковещательные ip адреса с идентификаторами хостов, установленными во все единицы. (ien это internet experiment notes, непосредственный предшественник rfc.) в rfc 894 [hornig 1984] говорится, что 4.2bsd использует нестандартный широковещательный адрес, однако в rfc 906 [finlayson 1984] замечается, что тогда не существовало стандарта internet для широковещательных адресов. при редакции rfc была сделана сноска на rfc 906, где говорилось об отсутствии стандарта на широковещательные адреса, однако очень рекомендовалось использовать широковещательные адреса с идентификаторами хоста, установленными во все единицы. к тому же, berkeley начал использовать все единичные биты для широковещательного адреса, начиная с 4.3bsd (1986 год), однако некоторые операционные системы (и что интересно, даже sunos 4.x) продолжали использовать нестандартные широковещательные адреса до начала 90-х. примеры широковещательных запросов как рассылаются широковещательные запросы и что делают маршрутизаторы и хосты с этими запросами? к сожалению, на этот вопрос очень сложно ответить, потому что это зависит от типа широковещательного адреса, приложения, реализации tcp/ip и возможной конфигурации. во-первых, приложение должно поддерживать широковещательные запросы. если мы запустим sun % ping 255.255.255.255 /usr/etc/ping: unknown host 255.255.255.255
то есть постараемся послать запрос на локальный кабель, это не сработает. однако проблема здесь заключена в самом приложении (ping). большинство приложений, которые воспринимают как цифровые ip адреса (в десятичном выражении), так и имена хостов, вызывают функцию inet_addr (3), чтобы конвертировать строку чисел в 32-битный двоичный ip адрес, и если это не удалось, воспринимают строку символов как имя хоста. эта библиотечная функция возвращает код ошибки -1 если в строке обнаружен символ, отличный от цифры или десятичной точки, в случае ограниченного широковещательного адреса (255.255.255.255) также выдается код -1. большинство программ, которые воспринимают символьную строку как имя хоста, обрабатывают его с использованием dns (глава 14) и ограничиваются выводом ошибки, такой как "неизвестный хост" (unknown host). даже если мы исправим эту ошибку в программе ping, результаты будут все равно не такими как хотелось бы. из шести протестированных систем, только одна генерировала широковещательные пакеты в локальный кабель. большинство ищут ip адрес 255.255.255.255 в таблице маршрутизации, в конце концов находят маршрут по умолчанию и посылают персональный пакет на маршрутизатор по умолчанию. естественно, такой пакет уничтожается. в подобном случае необходимо использовать широковещательные запросы, направленные в подсеть. и действительно, в разделе "icmp запрос и отклик маски адреса" главы 6 мы посылали датаграммы на ip адрес 140.252.13.63 для нижнего ethernet в нашей тестовой сети и получали отклики от всех хостов ethernet. широковещательный адрес, направленный в подсеть, соответствует каждому интерфейсу, именно этот адрес используется командой ifconfig (глава 3, раздел "команда ifconfig"). если мы пошлем ping на этот адрес, результат будет таким, как мы хотели:
sun % arp -a
arp
кэш пуст
ip определяет, что адрес назначения (140.252.13.63) - это широковещательный адрес, направленный в подсеть, и посылает датаграммы на широковещательный адрес канального уровня. мы упоминали в разделе "icmp запрос и отклик маски адреса" главы 6, что этот тип широковещательных запросов означает обращение ко всем хостам локальной сети, включая отправителя. из примера видно, что мы получили отклик от отправляющего хоста sun и от всех остальных хостов, находящихся на кабеле. в этом примере показан arp кэш перед и после того, как был запущен ping на широковещательный адрес. это сделано для того, чтобы показать взаимосвязь между рассылкой широковещательных запросов и состоянием arp. arp кэш пуст перед запуском ping, и заполнен по окончании. (в кэше находится по одной записи на каждый хост, находящийся на кабеле и ответивший на эхо запрос.) как заполнился кэш, раз мы сказали, что ethernet фрейм посылается на широковещательный адрес канального уровня 0xffffffff? отправка этих фреймов хостом sun не требует arp. если мы посмотрим работу ping с использованием tcpdump, то увидим, что получатели широковещательных фреймов генерируют arp запрос на sun, перед тем как отправить отклик. причем, надо отметить, что каждый отклик персональный. мы говорили в разделе "примеры arp" главы 4, что получатель arp запроса (sun в данном примере) обычно добавляет ip адрес и аппаратный адрес запрашивающего в свой arp кэш, и отправляет arp отклик. это делается из предположения, что если запрашивающий послал нам пакет, мы, возможно, в будущем захотим послать что-нибудь и ему. использование ping - это особый случай, потому что подобный тип программного интерфейса, (который в большинстве unix реализаций называется "символьный сокет" (raw socket)), всегда позволяет послать датаграмму на широковещательный адрес. что если мы воспользуемся приложением, которое не поддерживает широковещательные запросы, как, например, tftp? (мы опишем tftp более подробно в главе 15.)
здесь мы получаем ошибку мгновенно, при этом в кабель ничего не посылается. это объясняется тем, что сокеты api не позволяют процессу отправлять udp датаграммы на широковещательный адрес, если процесс специально не заявил, что он планирует использовать широковещательные запросы. это сделано для того, чтобы предотвратить ошибочное указание широковещательного адреса пользователем (именно так, как поступили мы в данном случае), тогда как приложение не предназначено для рассылки широковещательных запросов. для сокет api, приложение должно установить опцию сокет so_broadcast перед отправкой udp датаграммы на широковещательный адрес. однако, не все системы применяют это ограничение. некоторые реализации позволяют любому процессу отправлять udp датаграммы широковещательным образом, причем не требуют от процесса, чтобы он объявлял об этом. другие имеют более строгие ограничения и требуют, чтобы процесс имел привилегии суперпользователя, чтобы использовать широковещательную рассылку.
следующий вопрос заключается в том, перенаправляются ли широковещательные пакеты. некоторые ядра и маршрутизаторы имеют опцию, которая позволяет включить или выключить эту характеристику. (см. приложение е.) если мы включим характеристику перенаправления широковещательных пакетов на маршрутизаторе bsdi и запустим ping с хоста slip, то увидим, что bsdi перенаправляет широковещательные запросы, направленные в подсеть. перенаправление направленных широковещательных запросов означает, что маршрутизатор воспринимает входящие датаграммы как персональные, определяет, что адрес назначения это направленный широковещательный адрес одного из его интерфейсов, и затем перенаправляет датаграммы в соответствующую сеть, используя широковещательный адрес канального уровня.
мы видим, что это работает. также мы видим, что программа ping в bsd проверяет отслеживает повторные номера последовательности и помечает их как dup!. это обычно означает, что пакет был каким-либо образом продублирован, однако здесь именно это и должно было произойти, так как запросы были отправлены на широковещательный адрес. этот тест можно запустить с более удаленного хоста (от той сети, к которой направляется широковещательный запрос). мы запустили ping с хоста vangogh.cs.berkeley.edu (который находится на расстоянии 14 пересылок от нашей сети), и это также будет работать, если маршрутизатор sun сконфигурирован таким образом, чтобы перенаправлять направленные широковещательные запросы. в данном случае ip датаграммы (переносящие icmp эхо запросы) перенаправляются каждым маршрутизатором, встречающимся им на пути, как обычные датаграммы. никто из них не знает, что в действительности это направленные широковещательные запросы. и последний маршрутизатор, netb, думает, что пакеты предназначены хосту с идентификатором равным 63, и перенаправляет их на sun. в этом месте sun определяет, что ip адрес назначения в действительности это широковещательный адрес подключенного интерфейса, и передает датаграммы в виде широковещательных запросов канального уровня для этой сети. рассылка широковещательных запросов это характеристика, которую необходимо использовать с очень большой осторожностью. в большинстве случаев групповая адресация ip предоставляет лучшее решение практически всех проблем. рассылка групповых сообщений ip предоставляет приложениям два сервиса.
в этом разделе мы рассмотрим групповые адреса, а в следующей главе рассмотрим протоколы, которые используют групповую адресацию хостов и маршрутизаторов (igmp). на рисунке 12.2 показан формат ip адреса класса d. рисунок 12.2 формат ip адреса класса d.
в отличие от трех других классов ip адресов (a,b и c), форматы которых приведены на рисунке 1.5, 28 бит, отведенные под групповой идентификатор, не подвергаются дальнейшему делению. групповой адрес (multicast group address) состоит из четырех старших бит, установленных в 1110, и идентификатора группы. в десятичном виде групповые адреса находятся в диапазоне от 224.0.0.0 до 239.255.255.255. некоторое количество хостов, просматривающих определенный групповой ip адрес, называется группой хостов (host group). группа хостов может объединять хосты в разных сетях. членство в группе динамическое - хост может вступать в группу и выходить из группы по собственному желанию. не существует ограничений на количество хостов в группе, и хост не должен принадлежать к группе, чтобы послать сообщение в эту группу. некоторые адреса групп назначаются как заранее известные адреса от iana (internet assigned numbers authority). в этом случае группа считается постоянной группой хостов (permanent host group). заранее известные групповые адреса приведены в последних rfc назначенных номеров (assigned numbers rfc). обратите внимание на то, что постоянным в данном случае является групповой адрес, а не членство в группе. например, 224.0.0.1 означает "все системы в этой подсети", а 224.0.0.2 означает "все маршрутизаторы в этой подсети". групповой адрес 224.0.1.1 предназначен для сетевого протокола времени (ntp - network time protocol), 224.0.0.9 для rip-2 (глава 10, раздел "rip version 2") и 224.0.1.2 для sgi (silicon graphics) dogfight приложений. преобразование групповых адресов в адреса ethernet iana владеет блоком ethernet адресов, которые в шестнадцатиричном представлении выглядят как 00:00:5e. это старшие 24 бита ethernet адреса, означающие, что блок включает адреса в диапазоне от 00:00:5e:00:00:00 до 00:00:5e:ff:ff:ff. iana отвела половину этого блока для групповых адресов. установлено правило, что первый байт ethernet адреса равный 01 указывает на групповой адрес. это означает, что ethernet адреса, соответствующие групповым адресам ip, должны находиться в диапазоне от 01:00:5e:00:00:00 до 01:00:5e:7f:ff:ff. приведенные здесь выражения используют стандартную последовательность битов для internet, для сетей csma/cd или token bus, а именно такую, как биты располагаются в памяти. это как раз то, с чем сталкивается большинство программистов и системных администраторов. ieee документация использует порядок бит, который используется при передаче. assigned numbers rfc предоставляет дополнительные подробности о различиях между этими представлениями.
подобное расположение позволяет 23 битам в ethernet адресе соответствовать идентификатору группы ip. в процессе преобразования адресов 23 младших бита идентификатора группы помещаются в 23 бита ethernet адреса. (см. рисунок 12.3.) старшие 5 бит в идентификаторе группы игнорируются, так как они не уникальны. каждому ethernet адресу соответствует 32 различных идентификатора группы. например, групповой адрес 224.128.64.32 (в шестнадцатиричном представлении e0.80.40.20) и 224.0.64.32 (в шестнадцатиричном представлении e0.00.40.20) оба будут трансформированы в ethernet адрес 01:00:5e:00:40:20. так как подобное сопоставление не уникально, предполагается, что драйвер устройства или ip модуль на рисунке 12.1 должен осуществить фильтрацию, так как сетевая плата может получить групповой фрейм, который хосту не предназначен. если сетевая плата не осуществляет адекватную фильтрацию групповых фреймов, драйвер устройства, вполне возможно, должен будет получать все групповые фреймы и сам осуществлять фильтрацию. рисунок 12.3 соответствие между ip адресами класса d и групповыми адресами ethernet. существует два варианта реализации групповой адресации в сетевых платах, использующиеся в локальных сетях. одни осуществляют групповую фильтрацию, основанную на значении аппаратного группового адреса, что означает, что некоторые нежелательные фреймы могут пройти. в другом случае имеется небольшое фиксированное количество групповых адресов, принимаемых платой, при этом, если хосту необходимо принять больше групповых адресов, чем поддерживается, интерфейс должен быть помещен в режим "разных групп" (multicast promiscuous). однако, оба типа интерфейсов все еще требуют, чтобы драйвер устройства осуществлял проверку на предмет того, необходимо ли дальше обрабатывать принятый фрейм. даже если интерфейс осуществляет идеальную групповую фильтрацию (основанную на 48-битном аппаратном адресе) фильтрация все еще необходима, так как сопоставление ip адресов класса d и 48-битных аппаратных адресов осуществляется не один к одному. однако, если абстрагироваться от несовершенства преобразования адресов и аппаратной фильтрации, групповая адресация все же лучше, чем широковещательная.
осуществить групповой запрос в единственную физическую сеть довольно просто. отправляющий процесс указывает ip адрес назначения, который является групповым адресом, драйвер устройства конвертирует это в соответствующий ethernet адрес и отправляет. принимающие процессы должены указать своим ip модулям, что они хочет получать датаграммы, предназначенные определенному групповому адресу, и драйвера устройств должен каким-либо образом получать эти групповые фреймы. все это называется "вступлением в группу". (причина, по которой мы использовали выражение "принимающие процессы" во множественном числе, объясняется тем, что обычно существует несколько получателей, которым предназначено групповое сообщение, либо на одном, либо на разных хостах.) когда групповая датаграмма получена хостом, копия доставляется всем процессам, которые принадлежат к группе. это отличается от udp, где единственный процесс получает входящую персональную udp датаграмму. несколько процессов на одном хосте могут принадлежать к одной группе. однако сложности растут как снежный ком, когда группа распространяется на несколько сетей, и групповые пакеты должны проходить через маршрутизаторы. маршрутизаторам необходимо знать, принадлежат ли какие-либо хосты в данной физической сети к определенной группе. для определения этого, существует протокол, называемый протоколом группового управления internet (igmp - internet group management protocol). этому протоколу полностью посвящена следующая глава. широковещательные запросы в сетях fddi и token ring сети fddi используют ту же схему преобразования между ip адресами класса d и 48-битными fddi адресами [katz 1990]. сети token ring обычно используют отличную систему сопоставления из-за ограничений, которые накладываются на большинство управляющих устройств token ring [pusateri 1993]. широковещательная рассылка используется при отправке пакетов всем хостам в сети (обычно это локально подключенная сеть), а групповые сообщения используются для отправки пакетов определенному количеству хостов в сети. в этих концепциях используются различные типы фильтрации, которая осуществляется, когда принятый фрейм проходит по стеку протоколов. каждый уровень может отбросить принятый пакет по различным причинам. существуют четыре типа широковещательных адресов: ограниченный, широковещательный адрес сети, широковещательный адрес подсети и широковещательный адрес всех подсетей. наиболее распространенный - широковещательный адрес подсети. ограниченный широковещательный адрес обычно используется системой только в случае загрузки из сети. проблемы возникают, когда делается попытка послать широковещательный запрос через маршрутизаторы, чаще всего из-за того, что маршрутизатор не знает маску подсети в сети назначения. результат зависит от того, какого типа широковещательный адрес, от параметров конфигурации и так далее. ip адреса класса d называются групповыми адресами. они преобразовываются в адреса ethernet путем помещения их 23 младших битов в фиксированный ethernet адрес. подобное сопоставление не является уникальным, поэтому требуется дополнительная фильтрация одним из протоколов. упражнения sun %
ping 140.252.13.63 1472 это работает, однако увеличение размера пакета на 1 байт приведет к следующей ошибке: sun % ping 140.252.13.63 1473 что произошло?
|