Выполнение обнаружения служб

Высокоуровневые приложения в Azure Sphere могут выполнять обнаружение служб с помощью службы DNS (DNS-SD). Приложения могут использовать обнаружение служб для поиска сетевых служб и разрешения имен узлов, чтобы взаимодействовать со службой через брандмауэр Azure Sphere. Многоадресная рассылка DNS (mDNS) также может использоваться для выполнения однорангового обнаружения в локальной сети, что особенно полезно, если IP-адреса и имена узлов конечной точки назначения не известны во время разработки.

Приложения используют запросы DNS-SD для получения записей DNS с нелокционных DNS-серверов или через многоадресную рассылку. Если запрашиваемое имя находится в локальном домене верхнего уровня (TLD), запрос будет многоадресной рассылкой в локальной сети через все включенные сетевые интерфейсы; В противном случае выполняется обнаружение одноадресной службы. В примере обнаружения служб показано, как выполнять обнаружение служб в Azure Sphere.

Примечание

Брандмауэр Azure Sphere запрещает приложениям взаимодействовать с несанкционированными службами. Однако разрешение исходящих подключений к локальным TLD в манифесте приложения может увеличить риск безопасности для устройства, позволяя приложению подключаться к несанкционированным службам, объявленным в локальной сети. Приложения должны разрешать исходящие подключения только к локальным TLD в защищенных средах, которые предотвращают доступ несанкционированных сторон к рекламным службам. Чтобы обеспечить дополнительную защиту в этом сценарии, Azure Sphere требует, чтобы службы, обнаруженные в локальной сети, также находились в локальной подсети.

Включение файлов заголовков

Приложения, выполняющие обнаружение служб, должны содержать файл заголовка resolve:

 #include <resolv.h>

Разрешить подключение к службе

Перед выполнением запроса DNS-SD необходимо добавить службу в возможность AllowedConnections манифеста приложения. Затем брандмауэр Azure Sphere позволит приложению подключаться к обнаруженным экземплярам службы, используя связанные с ними имена узлов и IP-адреса. Если указана локальная служба TLD, брандмауэр разрешит подключения только к обнаруженным ресурсам в локальной подсети.

В возможности AllowedConnections поддерживаются следующие типы имен служб:

  • Имя локальной службы DNS, например "_sample._tcp.local"
  • Имя службы DNS, не являющейся локальным, например "_sampleinstance._tcp.dns-sd.org".
  • Имя локального экземпляра службы, например "_sampleinstance._tcp.hostname.local"
  • Доменное имя, например "samplehost.contoso.com"
  • IP-адрес

Ниже приведен фрагмент манифеста приложения, включающее имя службы, не являющееся локальным.

"AllowedConnections": [ "_http._tcp.dns-sd.org" ]

Выполнение запроса DNS-SD

Чтобы выполнить запрос DNS-SD, необходимо запросить несколько типов записей DNS:

  • PTR-записи , перечисляющие экземпляры службы DNS.
  • Записи SRV и TXT , содержащие сведения об экземплярах службы, такие как имя узла и порт.
  • Записи , содержащие IP-адреса полученных имен узлов.

Перед отправкой запроса необходимо создать и инициализировать его, а затем добавить сообщение запроса, которое запрашивает запись DNS. Вы можете создать и инициализировать запрос DNS-SD, вызвав функцию POSIX res_init(). Вы можете создать сообщение для запроса, вызвав функцию POSIX res_mkquery().

Отправка одноадресного ЗАПРОСА DNS

При обнаружении одноадресной службы можно отправить запрос DNS-SD и получить ответ, вызвав функцию POSIX res_send().

Чтобы отправить запрос DNS-SD по многоадресной ссылке, приложение должно открыть сокет и отправить запрос через сокет на IP-адрес замыкания на себя 127.0.0.1 (порт назначения 53). После отправки запроса может быть возвращено несколько ответов. Приложение должно ждать и прослушивать в течение нескольких секунд, чтобы собрать все ответы. Это показано в примере обнаружения службы.

Важно

Этот IP-адрес на себя представляет собой бета-версию функции, которая будет прекращена, а затем заменена в будущих выпусках. Это будет критическое изменение для приложений, использующих адрес.

Разрешенные подключения для узлов с несколькими IP-адресами

Брандмауэр Azure Sphere разрешает подключения только к одному IP-адресу для каждого имени узла. Если узел имеет несколько IP-адресов, брандмауэр Azure Sphere разрешает подключения только к одному из адресов. Приложение может использовать curl для отправки HTTPS-запросов к узлу с несколькими IP-адресами; Curl будет пытаться подключиться к каждому IP-адресу, пока не будет найден допустимый адрес. Однако это может привести к задержке, пока приложение находит допустимый адрес.