Eseguire l'individuazione di serviziPerform service discovery

Funzionalità BETABETA feature

Le applicazioni di alto livello su Azure Sphere possono eseguire l'individuazione di servizi (DNS-SD).High-level applications on Azure Sphere can perform service discovery by using DNS service discovery (DNS-SD). È possibile usare l'individuazione di servizi per trovare servizi di rete ed eseguire la risoluzione dei nomi host in modo che le applicazioni possano interagire con il servizio attraverso il firewall di Azure Sphere.Applications can use service discovery to find network services and perform host name resolution so they can interact with the service through the Azure Sphere firewall. È anche possibile usare Multicast DNS (mDNS) per seguire l'individuazione peer-to-peer in una rete locale, un'opzione particolarmente utile quando gli indirizzi IP e i nomi host dell'endpoint di destinazione non sono noti in fase di progettazione.Multicast DNS (mDNS) can also be used to perform peer-to-peer discovery on a local network, which is especially useful when the IP addresses and host names of the destination endpoint aren't known at design time.

Le query DNS-SD possono essere usate dalle applicazioni per recuperare i record DNS da server DNS non locali oppure tramite un collegamento multicast.Applications use DNS-SD queries to retrieve DNS records from non-local DNS servers or over a multicast link. Se il nome sottoposto a query si trova nel dominio di primo livello .local, la query viene inviata in multicast nella rete locale tramite tutte le interfacce di rete abilitate. In caso contrario, viene eseguita l'individuazione di servizi unicast.If the name being queried is under the .local top-level domain (TLD), the query is multicast on the local network through all enabled network interfaces; otherwise, unicast service discovery is performed. L'esempio di individuazione di servizi illustra come eseguire l'individuazione di servizi in Azure Sphere.The Service discovery sample demonstrates how to perform service discovery on Azure Sphere.

Nota

Il firewall di Azure Sphere impedisce le comunicazioni delle applicazioni con servizi non autorizzati.The Azure Sphere firewall prevents applications from communicating with unauthorized services. Tuttavia, se si consentono connessioni in uscita con domini di primo livello .local nel manifesto dell'applicazione, si potrebbe aumentare il rischio di sicurezza per un dispositivo permettendo a un'applicazione di connettersi a servizi non autorizzati annunciati nella rete locale.However, allowing outbound connections to .local TLDs in the application manifest may increase the security risk to a device by allowing an application to connect with unauthorized services that are advertised on the local network. Le applicazioni dovrebbero consentire connessioni in uscita con domini di primo livello .local esclusivamente in ambienti protetti che impediscono a parti non autorizzate di annunciare servizi.Applications should only allow outbound connections to .local TLDs in secured environments that prevent unauthorized parties from advertising services. Per fornire una maggiore protezione in questo scenario, Azure Sphere richiede che i servizi individuati nella rete locale risiedano anche nella subnet locale.To provide additional protection in this scenario, Azure Sphere requires that services that are discovered on the local network also reside on the local subnet.

Includere file di intestazioneInclude header files

Le applicazioni che eseguono l'individuazione di servizi devono includere il file di intestazione resolv:Applications that perform service discovery must include the resolv header file:

 #include <resolv.h>

Consentire la connessione a un servizioAllow a service connection

Prima di eseguire una query DNS-SD, è necessario aggiungere il servizio alla funzionalità AllowedConnections del manifesto dell'applicazione.Before you perform a DNS-SD query, you must add the service to the AllowedConnections capability of the Application manifest. Il firewall di Azure Sphere consentirà quindi all'applicazione di connettersi alle istanze individuate del servizio usando i nomi host e gli indirizzi IP associati.The Azure Sphere firewall will then allow the application to connect to the discovered service instances using their associated host names and IP addresses. Se è specificato un servizio del dominio di primo livello .local, il firewall consentirà solo le connessioni alle risorse individuate nella subnet locale.If a .local TLD service is specified, the firewall will only allow connections to discovered resources on the local subnet.

Per la funzionalità AllowedConnections sono supportati i tipi di nomi di servizi seguenti:The following types of service names are supported in the AllowedConnections capability:

  • Nome di servizio del DNS locale, ad esempio "_sample._tcp.local"Local DNS service name, such as "_sample._tcp.local"
  • Nome di servizio del DNS non locale, ad esempio "_sampleinstance._tcp.dns-sd.org"Non-local DNS service name, such as "_sampleinstance._tcp.dns-sd.org"
  • Nome di istanza di servizio locale, ad esempio "_sampleinstance._tcp.hostname.local"Local service instance name, such as "_sampleinstance._tcp.hostname.local"
  • Nome di dominio, ad esempio "samplehost.contoso.com"Domain name, such as "samplehost.contoso.com"
  • Indirizzo IPIP address

Ecco un estratto del manifesto dell'applicazione che include un nome di servizio non locale.Here's an excerpt from an application manifest that includes a non-local service name.

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

Eseguire una query DNS-SDPerform a DNS-SD query

Per eseguire una query DNS-SD, è necessario richiedere diversi tipi di record DNS:To perform a DNS-SD query, you need to request several types of DNS records:

  • I record PTR, che enumerano le istanze di un servizio DNS.PTR records that enumerate instances of a DNS service.
  • I record SRV e TXT, che contengono i dettagli delle istanze del servizio, ad esempio il nome host e la porta.SRV and TXT records that contain details of the service instances, such as host name and port.
  • I record A, che contengono gli indirizzi IP dei nomi host recuperati.A records that contain the IP addresses of the retrieved host names.

Prima di inviare la query, è necessario crearla, inizializzarla e quindi aggiungervi un messaggio che richiede il record DNS.Before you send the query, you need to create and initialize it, and then add a query message that requests the DNS record. Per creare e inizializzare una query DNS-SD è possibile chiamare la funzione POSIX res_init().You can create and initialize a DNS-SD query by calling the POSIX function res_init(). Per creare un messaggio per la query è possibile chiamare la funzione POSIX res_mkquery().You can create a message for the query by calling the POSIX function res_mkquery().

Inviare una query DNS unicastSend a unicast DNS query

Quando si esegue l'individuazione di servizi unicast, è possibile inviare la query DNS-SD e recuperare la risposta chiamando la funzione POSIX res_send().When performing unicast service discovery, you can send the DNS-SD query and retrieve the response by calling the POSIX function res_send().

Per inviare una query DNS-SD attraverso un collegamento multicast, l'applicazione deve aprire un socket e inviare la richiesta tramite il socket all'indirizzo IP di loopback 127.0.0.1 (porta di destinazione 53).To send a DNS-SD query over a multicast link, the application must open a socket and send the request over the socket to the loopback IP address 127.0.0.1 (destination port 53). Dopo l'invio della richiesta, possono essere restituite più risposte.After the request is sent, multiple responses may be returned. L'applicazione dovrà rimanere in attesa e in ascolto per diversi secondi per raccoglierle tutte.The application should wait and listen for several seconds to collect all responses. Questo scenario è illustrato nell'esempio di individuazione di servizi.This is demonstrated in the Service discovery sample.

Importante

Questo indirizzo IP di loopback è una funzionalità Beta che verrà deprecata e sostituita nelle prossime versioni.This loopback IP address is a Beta feature that will be deprecated and then replaced in future releases. Questa modifica causerà l'interruzione delle applicazioni che si basano su tale indirizzo.This will be a breaking change for applications that rely on the address.

Connessioni consentite per gli host con più indirizzi IPAllowed connections for hosts with multiple IP addresses

Il firewall di Azure Sphere consente le connessioni a un solo indirizzo IP per nome host.The Azure Sphere firewall only allows connections to one IP address per host name. Se un host ha più indirizzi IP, il firewall di Azure Sphere consente solo le connessioni a uno degli indirizzi.If a host has multiple IP addresses, the Azure Sphere firewall only allows connections to one of the addresses. Per eseguire richieste HTTPS a un host che ha più indirizzi IP, un'applicazione può usare cURL. In questo modo, viene eseguito un tentativo di connessione a ogni indirizzo IP, finché non viene trovato l'indirizzo consentito.An application can use curl to make HTTPS requests to a host that has multiple IP addresses; curl will try to connect to each IP address until the allowed address is found. Può tuttavia verificarsi un ritardo dovuto al tempo impiegato dall'applicazione per trovare l'indirizzo consentito.However, this may cause a delay while the application finds the allowed address.