Добрый день операции
В этой главе описываются операции Bonjour публикации службы, просмотра и разрешения, лежавшего в основе трех уровней API сетевой службы и самих уровней API. Необходимо считать эту главу, если Вы хотите записать приложение или инструмент, публикующий или обнаруживающий сетевые службы.
Обзор архитектуры
Архитектура сетевых служб в Добрый день включает простой в использовании механизм для публикации, обнаружения и использования УСЛУГ IP-ТЕЛЕФОНИИ. Добрый день поддержки три фундаментальных операции, каждая из которых является необходимой частью сетевых служб нулевой конфигурации:
Публикация (распространяющий службу)
Открытие (просматривающий для доступных служб)
Разрешение (переводящий экземпляр службы называет к адресам и номерам портов для использования),
Эти операции обсуждены подробно в следующих разделах.
Публикация
Для публикации службы приложение или устройство должны зарегистрировать службу в Многоадресной передаче респондент DNS, или через высокоуровневый API или путем передачи непосредственно с респондентом (mDNSResponder
). Добрый день также поддержки, хранящие записи на стандартных серверах DNS также, с помощью Динамического Обновления DNS.
Когда служба регистрируется, три связанных записи DNS создаются: служба (SRV) запись, указатель (PTR) запись и текст (TXT) запись. Запись TXT содержит дополнительные данные, должен был разрешить или использовать службу, несмотря на то, что это также часто пусто.
Служебные книжки
Запись SRV отображает имя экземпляра службы к информации, необходимой клиенту для фактического использования службы. Клиенты тогда хранят имя экземпляра службы как персистентный способ получить доступ к службе и выполнить запрос DNS для имени хоста и номера порта, когда пора соединиться. Этот дополнительный уровень абстракции предусматривает две важных функции. Во-первых, служба идентифицируется человекочитаемым именем вместо доменного имени и номера порта. Во-вторых, даже если ее номер порта, IP-адрес или изменения имени хоста, пока имя службы остаются тем же, клиенты могут получить доступ к службе.
Запись SRV содержит два данные для идентификации службы:
Имя хоста
Номер порта
Имя хоста является доменным именем, где может в настоящее время находиться служба. Причина, которую имя хоста дано вместо единственного IP-адреса, состоит в том, что это мог быть многосетевой узел больше чем с одним IP-адресом, или это могло иметь адреса IPv6, а также адреса IPv4 и т.д. Идентификация узла по имени позволяет всем этим случаям быть обработанными корректно.
Номер порта идентифицирует порт UDP или TCP для службы.
Записи SRV называют согласно следующему соглашению:
<Instance Name>.<Service Type>.<Domain>
<Instance Name>
, имя экземпляра службы, может быть любой UTF-8-encoded строкой Unicode и предназначается для человека.
<Service Type>
стандартное имя протокола IP, которому предшествует подчеркивание, сопровождаемое транспортным протоколом от узла к узлу (TCP или UDP), также предшествовавший подчеркиванием. Например, служба Trivial FTP, работающая на основе UDP, имела бы тип службы _tftp._udp
, и IPP печать службы, работающей на основе TCP, зарегистрировался бы под _ipp._tcp
тип службы. Список официальных имен протокола ведется IANA; см. Доменные Соглашения о присвоении имен для получения дополнительной информации.
<Domain>
стандартный домен DNS. Это может быть определенным доменом, такой как apple.com.
, или универсальный суффикс local.
для службы, доступной только на локальной ссылке.
Вот пример записи SRV (в стандартном формате записи DNS) для названного спулера печати PrintsAlot
работа порта TCP 515
:
PrintsAlot._printer._tcp.local. 120 IN SRV 0 0 515 blackhawk.local.
Эта запись была бы создана на Многоадресной передаче респондент DNS вызванного принтера blackhawk.local.
на локальной ссылке. Начальная буква 120
представляет значение времени жизни (TTL), использующееся для кэширования. Эти два нуля являются весом и приоритетными значениями, используемыми в традиционном DNS при выборе между многократными записями, соответствующими имя; для многоадресной передачи цели DNS проигнорированы эти значения.
Для получения дополнительной информации о домене, служба и имена экземпляра, видят Доменные Соглашения о присвоении имен.
Записи указателя
Записи PTR включают открытие службы путем отображения типа службы к списку имен определенных экземпляров того типа службы. Эта запись добавляет еще один уровень косвенности, таким образом, службы могут быть найдены только путем поиска записей PTR, маркированных типом службы.
Запись содержит всего данные, имя экземпляра службы (который совпадает с именем записи SRV). Записи PTR соответственно называют точно так же, как записи SRV, но без имени экземпляра:
<Service Type>.<Domain>
Вот пример записи PTR для названного спулера печати PrintsAlot
:
_printer._tcp.local. 28800 PTR PrintsAlot._printer._tcp.local.
Снова, 28800
значение времени жизни (TTL), измеренное в секундах.
Текстовые записи
Запись TXT имеет то же имя как соответствующая запись SRV и может содержать мелкую сумму дополнительной информации об экземпляре службы, обычно не больше, чем 100-200 байтов самое большее. Эта запись может также быть пустой. Например, сетевая игра могла распространить имя карты, используемой в многопользовательской игре, и программа чата могла распространить доступность пользователя (например, неактивный, далеко, или доступный). Если необходимо передать большие объемы данных, узел должен установить соединение с клиентом и отправить данные непосредственно.
Исторически, эта запись использовалась для многократных служб, работающих на том же порту в том же IP-адресе, например многократные очереди печати, работающие на том же сервере печати. В этой дополнительной информации случая в TXT запись может использоваться для идентификации намеченной очереди печати, как показано в этом примере:
Имя службы | Ввести | IP-адрес | Порт | Имя очереди (от записи TXT) |
---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
Этот вид практики был необходим, потому что типы службы были исторически связаны со стандартными портами. Разработчики новых Добрый день протоколируют, призваны выполнить каждый экземпляр их службы на различное динамично число назначенного порта, вместо того, чтобы пытаться выполнить их всех на том же известном номере порта и использовать дополнительную информацию для указания, которые инстанцируют клиент, пытается говорить.
Природа и формат данных в записи TXT являются определенными для каждого типа службы, таким образом, каждый новый тип службы должен также определить формат данных для его связанной записи TXT (если таковые имеются), и публиковать этот формат как часть спецификации протокола.
Публикация: пример
Для конкретного примера рассмотрите гипотетическое устройство, совместно использующее музыку по локальной сети — поддерживающее IP устройство автоматической смены дисков. Предположим, что его транспортным протоколом является TCP, и его прикладной протокол идет именем music
. Когда кто-то включает устройство в концентратор Ethernet, много вещей происходят, как показано на рисунке 4-1.
На шаге 1 устройство случайным образом выбирает локальный для ссылки IP-адрес 169.254.150.84
, случайным образом выбранный из IPv4 локальный для ссылки диапазон 169.254.0.0
с маской подсети 255.255.0.0
, и объявляет о нем сети. Поскольку никакие устройства не реагируют на объявление, устройство берет адрес в качестве своего собственного. На шаге 2 это запускает свою собственную Многоадресную передачу респондент DNS, запрашивает имя хоста eds-musicbox.local.
, проверяет его доступность и берет имя в качестве его собственного. Затем, на шаге 3, устройство запускает музыкальную службу совместного использования на порт TCP 1010
. Наконец, на шаге 4, это публикует службу типа _music._tcp
, под именем Ed’s Party Mix
, в local.
домен, сначала удостоверяясь, что никакая служба не существует под тем же именем. Это создает две записи:
Запись SRV называют
Ed’s Party Mix._music._tcp.local.
это указывает наeds-musicbox.local.
на порту TCP1010
Запись PTR называют
_music._tcp.local.
это указывает наEd’s Party Mix._music._tcp.local.
служба.
Открытие
Открытие службы использует записи DNS, зарегистрированные во время публикации службы для нахождения всех именованных экземпляров определенного типа службы. Чтобы сделать это, приложение выполняет запрос для соответствия записей PTR типа службы, такой как _http._tcp
, обычно через высокоуровневый API. Многоадресная передача респонденты DNS, работающие на каждом устройстве, возвращает записи PTR с именами экземпляра службы.
Рисунок 4-2 иллюстрирует просмотр клиентского приложения для музыкальных служб совместного использования. На шаге 1 клиентское приложение выпускает запрос для служб типа _music._tcp
в
local.
домен к стандартному групповому адресу 224.0.0.251
. Каждый Многоадресный респондент DNS в сети слышит запрос, но только музыкальное совместно используемое устройство отвечает записью PTR (шаг 2). Получающаяся запись PTR содержит имя экземпляра службы,
Ed's Party Mix._music._tcp.local.
в этом случае. Клиентское приложение может тогда извлечь имя экземпляра службы из записи PTR и добавить его к экранному списку музыкальных серверов.
Разрешение
Когда пользователь сначала выбирает принтер, открытие службы обычно имеет место только время от времени — например. Эта работа сохраняет имя экземпляра службы, намеченный стабильный идентификатор для любого приведенного примера службы. Номера портов, IP-адреса и даже имена хоста могут измениться со дня на день, но пользователь не должен должен быть повторно выбирать принтер каждый раз, когда это происходит. Соответственно, разрешение с имени службы для снабжения информации сокетом не происходит, пока служба фактически не используется.
Для разрешения службы приложение выполняет поиск DNS для записи SRV с именем службы. Многоадресная передача респондент DNS отвечает записью SRV, содержащей текущую информацию.
Рисунок 4-3 иллюстрирует разрешение службы в музыкальном примере совместного использования. Процесс разрешения начинается с запроса DNS групповому адресу 224.0.0.251
выяснение Ed’s Party Mix._music._tcp.local.
Запись SRV (шаг 1). На шаге 2 этот запрос возвращает имя хоста службы и номер порта (eds-musicbox.local.
, 1010
). На шаге 3 клиент отсылает групповой запрос для IP-адреса. На шаге 4 этот запрос решает к IP-адресу 169.254.150.84
. Тогда клиент может использовать IP-адрес и номер порта для соединения со службой. Этот процесс имеет место каждый раз, когда служба используется, таким образом всегда находя самый актуальный адрес службы и номер порта.