Copyright © 1996, 1997 Università di Firenze. All rights reserved.
license available.
![]() |
La seconda funzione fondamentale del metodo dei nomi di dominio
è quella di implementare un sistema distribuito efficiente, affidabile
e di applicabilità generale per porre in corrispondenza i nomi di dominio
con gli indirizzi IP corrispondenti. Il sistema si definisce distribuito perché
la risoluzione di un nome di dominio avviene attraverso una collaborazione di
più server dislocati in posti distinti. Vale infatti la regola generale
che se un server DNS non conosce l'indirizzo IP di una certa macchina (ovvero
dalla stringa del nome si accorge che non riguarda il suo dominio), passa la
richiesta al server DNS di dominio superiore, o comunica come risposta l'indirizzo
del DNS superiore. Efficiente perchè la risoluzione nella maggioranza
dei casi avviene localmente senza incrementare ulteriormente il traffico in
rete. La maggior parte delle volte (specialmente all'interno di grandi azienda)
si interroga il DNS per conoscere l'indirizzo IP di altre macchine poste sempre
all'interno dell'azienda. Con un sistema gerarchico tutte queste richieste non
escono fuori dalla LAN della azienda, ma vengono gestite internamente. Affidabile
perché l'interruzione, per cause accidentali, di un collegamento ad un
server di risoluzione dei nomi non comporta l'interruzione del servizio: le
richieste verranno dirottate su un altro server. Quasi sempre in tutte le macchine
vengono infatti specificati due o più indirizzi di server DNS, e la macchina
automaticamente interroga i server successivi al primo in caso di mancata risposta.
La risoluzione di un nome di dominio avviene grazie a dei programmi appositi
chiamati server di nomi (Name Server), spesso situati su macchine
apposite dette anch'esse server di nomi. Sulla macchina client gira un software
detto risolutore di nomi (Local Resolver) che interroga uno o
più server di nomi per convertire un nome di dominio in indirizzo IP.
Per capire come avvenga la risoluzione di un nome di dominio facciamo un esempio,
seguendo come riferimento lo schema concettuale rappresentato nella Slide
6. Supponiamo che un host collegato al dominio dec.com (ad esempio Host1.dec.com)
voglia scoprire l'indirizzo IP della macchina Host2.va.us. L'Host1 porrà
la sua richiesta al DNS dec.com che analizzerà il nome dell'Host2.
Il DNS di dec.com si renderà conto che la richiesta riguarda una
macchina non appartenente al suo dominio, e passerà la richiesta al server
.com. Anch'egli noterà che la macchina destinazione ha come ultima
estensione .us e quindi scaricherà la richiesta al server di radice.
Procedendo in questo modo la richiesta tornerà giù per i domini
.us e va.us, dove incontrerà il server DNS va.us
in grado di associare al nome Host2.va.us un indirizzo IP. A questo punto
la risposta non ripercorrerà la stessa strada della domanda, ma
tornerà direttamente al Host1.dec.com che entrerà
a conoscenza dell'indirizzo IP richiesto (in realtà non è proprio
così, ma prendiamolo momentaneamente per vero).
In realtà le connessioni di rete tra i vari server non sono esattamente
come nella Slide 6 In altre parole la struttura nella
Slide 6 non rappresenta fedelmente la struttura della
rete: essa rappresenta soltanto i server di nomi che un server conosce e che
quindi può contattare. Nella pratica la struttura è più complessa,
i server possono essere dislocati nelle posizioni più impensabili. Spesso
in un unico server ci sono più server di nomi capaci di risolvere più
domini. La Slide 6 risulta semplicemente una semplificazione
teorica. La Slide successiva mostra uno schema più
realistico in cui un server contiene più server di nomi.
![]() |
Questo tipo di organizzazione gerarchica ha pochi livelli. Il
server radice contiene informazioni sui domini di massimo livello, ogni organizzazione,
poi, impiega un singolo server per risolvere i nomi di dominio locali. Questo
significa che la risoluzione di un nome, molto spesso impiega un solo livello
dell'albero, riducendo il traffico in rete. Ad esempio per risolvere l'indirizzo
xinu.cs.purdue.edu si contatteranno solo due server: quello radice e
quello relativo al dominio purdue.edu. Ogni DNS, in pratica, dovrà gestire
uno spazio di nomi non più composto ad un nodo singolo, ma da un sottoalbero
dello spazio dei nomi complessivo.
Questa struttura semplificata opera correttamente, ma può diventare inefficiente
per due motivi: il primo è dovuto alla centralità del nodo radice,
cioè se dovesse rompersi il collegamento non saremmo in grado di risolvere
il nome di dominio; oggiogiorno il server di radice è ricopiato su più
macchine, al fine di garantire il servizio anche nel caso in cui una di esse
dovesse venire a mancare. Il secondo motivo percui questa struttura perde in
qualità è che il server radice (o i server di radice) ritorna ad
essere centro di un elevato traffico.
Per questo secondo motivo internet implementa il name caching al fine
di migliorarne l'efficienza. Ogni server di dominio mantiene in una memoria
cache locale la lista dei nomi risolti recentemente; quando arriva una richiesta
di risoluzione, controlla avanti nella chace, se è presente restituisce
immediatamente l'indirizzo IP senza ulteriori passaggi, altrimenti interpella
il server di livello superiore, il quale esegue le stesse operazioni. In questo
modo si limita il flusso di dati verso il nodo radice. Le informazioni contenute
nella cache di un server, hanno una durata di vita caratterizzata dal Time
to Live, cioè dopo un tempo prestabilito vengono cancellate o aggiornate.
Quando un server restituisce un indirizzo IP prelevato dalla cache locale lo
contrassegna come un legame non autorevole e restituisce anche il nome
del server da cui ha ottenuto tale indirizzo. In questo modo comunica al client
che tale indirizzo potrebbe essere cambiato, ma gli fornisce anche l'indirizzo
del server che conterrà l'informazione aggiornata. Un Server può
però inviare anche informazioni autorvoli, il che significa che
sono informazioni prelevate dal proprio spazio dei nomi.
È importante scollegare il nome di un certo dominio dalla posizione della
macchina che ne implementa il DNS. A tutti gli effetti, il server di dominio
di die.unifi.it (dominio di nomi del laboratorio di ing. elettronica
di Firenze) "potrebbe" fisicamente trovarsi anche in Germania. Un server di
nomi per il dominio .UK (inglese) stà in America, in modo tale
che le richieste americane di risoluzione di un nome di dominio .UK non
devono passare le limitate linee oceaniche.
Il DNS nient'altro è che un data base (consultabile in
rete e distribuito) in grado di associare ad un nome un indirizzo IP e (a volte)
viceversa.
Un'altra importante nota riguarda proprio quest'ultima affermazione: i DNS (come tutti i data base) non solo sono in grado di collegare un oggetto ad un altro, ma possono anche collegare un oggetto a molti, e molti ad uno. Al DNS in genere si richiede di elaborare un certo nome in modo da farsi rendere un indirizzo IP: è comunque possibile fare richieste più complesse, e ottenere come risposta un set di indirizzi IP ed eventuali alias di nomi. Questo perchè una stessa macchina può avere più nomi (ed un unico indirizzo IP), e più macchine (gemelle) possono avere lo stesso nome (ma differenti indirizzi IP).
![]() |
Riassumendo, ogni sistema DNS è costituito da tre componenti
principali : Spazio del dominio dei nomi e Record di risorse : Server di Nomi Risolutori Sono programmi che estraggono l'informazione dai
name server in risposta alle richieste dell'utente. I Risolutori devono poter
accedere almeno ad un name server. L'informazione ottenuta dai name server
può essere diretta o può essere l'indirizzo di un altro name
server a cui avanzare la richiesta. Un Risolutore tipicamente è una
routine di sistema che è direttamente accessibile dai programmi utente.
Per questo motivo non è necessario nessun protocollo tra il Risolutore
ed il programma utente.
![]() |
Possessore : Tipo : Classe : TTL : Rdata : E' il dato della RR, e dipende dal tipo e dalla
classe.
Un nome di dominio identifica un nodo. Ogni nodo ha un set non
ordinato di Resource Records, (eventualmente nessuno). Ogni Resource Record contiene
i seguenti campi :
Le RR (Resource Records) spesso si scrivono sotto forma testuale (a volte
tralasciando il TTL e la Classe) : nell'esempio del lucido significa che Il server
di posta (MX) per il dominio ISI.EDI del sistema Internet (IN)
ha Valore 10 e Nome VENERA.ISI.EDU. Un altro esempio potrebbe essere
quello di un Alias:
A = Indirizzo dell'host
CNAME = Nome canonico di un Alias
HINFO = Informazioni di CPU e OS
MX = Individua il Mail Exchenge del dominio
NS = Il Name Server Autorità del dominio
PTR = Un puntatore ad un altro Name Server
SOA = Identifica l'inizio di una zona di autorit\agrave
IN = Sistema Internet
CH = Sistema Chaos
Indirizo IP a 32 bit (IN)
o Chaos a 16 bit (CH)
Nome di Dominio
Valore a 16 bit e Nome dell'host
server di Mail Exchange
Nome di un dominio
Diversi campi
PIPPO.DIE.UNIFI.IT IN CNAME
PLUTO.DIE.UNIFI.IT
PLUTO.DIE.UNIFI.IT IN A
150.17.8.24
![]() |
Standard : Sono le classiche query, in cui si specifica un nome e si ottiene in cambio una serie
di Resource Record che il DNS possiede
Reverse : Sono le query inverse, in cui si specifica un indirizzo IP e si vuole sapere il
nome (o i nomi) del rispettivo host.
Non Ricorsive : Sono query in cui, nel caso che il DNS interpellato non sia in possesso
di Resource Record inerenti alla risposta, esso manda un Risource Record che contiene
informazioni su un DNS più "vicino" alla risposta. E' compito del local resolver reiterare
la richiesta ad altri server
Ricorsive : In queste query il DNS si prende il compito di avanzare la domanda
ad altri DNS e fare così da tramite per il local resolver.
Ogni Query può essere dei seguenti
tipi :
Un DNS deve obbligatoriamente saper rispondere alle query standard, mentre le
inverse sono opzionali. Le query possono essere anche schematizzate con altri due tipi :
Un DNS deve essere in grado di rispondere a query non ricorsive. Il DNS può comunicare
al local resolver che egli è in grado di fare query ricorsive. Se anche il local
risolver (nella query) richiede la ricorsione, allora il DNS è abilitato a eseguire
una query ricorsiva. Il DNS può comunicare questa sua possibilità solo ad
alcuni client (selezionati).
![]() |
Il protocollo DNS prevede che avvenga uno scambio di Query tra Local Resolver e Name Server. Questo scambio di messaggi avviene sulla porta 53 (decimale) con servizio TCP o UDP, ed ha il vincolo che ogni Query non sia più lunga di 513 bytes. Ogni messaggio di Query scambiato è composto dalle sezioni raffigurate nella Slide 11. Più avanti analizzeremo in dettaglio ogni sezione, ma per adesso limitiamoci a fare un esempio di Query e risposta :
|
Header
|
OPCODE = SQUERY |
|
Question
|
QNAME = PIPPO.DIE.UNIFI.IT, QCLASS = IN, QTYPE = A |
|
Answer
|
<vuoto> |
|
Authority
|
<vuoto> |
|
Additional
|
<vuoto> |
Con questo messaggio il Local Resolver richiede al DNS una Simple Query, ovvero richiede di trasformare il nome contenuto nella domanda (PIPPO.DIE.UNIFI.IT) in un indirizzo (A) di Internet (IN). Il DNS risponderà con u messaggio del tipo :
|
Header
|
OPCODE = SQUERY, RESPONSE, AA |
|
Question
|
QNAME = PIPPO.DIE.UNIFI.IT., QCLASS = IN, QTYPE = A |
|
Answer
|
PIPPO.DIE.UNIFI.IT. 86400 IN A 150.17.8.25 |
|
Authority
|
<vuoto> |
|
Additional
|
<vuoto> |
Il DNS sta rispondendo (bit RESPONSE settato) in maniera autoritaria (AA) : nella sezione di risposta si nota bene (sotto forma testuale), il Resource Record che associa al nome (PIPPO.DIE.UNIFI.IT) un indirizzo di Internet (IN) 150.17.8.25.
Moltri altri esempi possono essere trovati in fondo alla RFC 1034
![]() |
Analizziamo più in dettaglio il
formato dell'header del messaggio di Query. Ecco i vari campi di cui si compone
:
| ID | E' un identificatore a 16 bit assegnato dal programma che genera la query. Esso viene copiato nella risposta corrispondente per far capire al local resolver di che risposta si tratta. |
| QR | Indica se il messaggio è una Query (0) o una Risposta (1) |
| Opcode |
Indica di che tipo di query si tratta 0 (QUERY)- Query standard 1 (IQUERY) - Query inversa 2 (STATUS) - Richiesta di stato del server 3-15 - Riservato a futuri usi |
| AA | Indica che la risposta dal DNS autoritativa |
| TC | Indica che il messaggio è stato troncato |
| RD | Viene settato dal local resolver per indicare che desidera la ricorsione |
| RA | Viene settato dal DNS per indicare che la ricorsione è disponibile |
| Z | Riservato per usi futuri - deve essere 0 |
| RCODE | E' il codice di risposta : 0 - Nessun errore 1 - Errore nella formattazione della query 2 - Errore interno nel Server dei nomi 3 - Ricevuto da un server autorità, indica che la query non esiste 4 - Il Server dei nomi non implementa quel tipo di query 5 - Il Server si rifiuta di eseguire l'operazione per motivi di settaggi 6/15 - Riservato per usi futuri |
![]() |
La sezione di domanda è usata per trasportare la domanda nella maggior parte
delle Query. Essa contiene un numero di entry come quelle riportate nella Slide
13 pari a DQCOUNT (vedi formato dell'header). In queste entry si ha i seguenti
parametri :
| QNAME | Un nome di dominio, rappresentato da una sequenza di label (es. Telemat.die.unifi.it sono 4 labels) ognuna codificata con lunghezza (1 byte) + testo. La stringa è terminata con 0 (label di lunghezza 0) |
| QTYPE | Indica il tipo di query : può essere un qualsiasi valore di type più alcuni altri valori particolari |
| QCLASS | Indica la classe della query |
Le tre sezioni che seguono la seziona di domanda sono tutte costituite nello modo : ogni sezione è un numero variabile (scritto nell'header) di Resource Record. Descrivendo la codifica di un Resource Record si conclude quindi la descrizione della sintassi dei messaggi che il Local Resolver ed il Server di Nomi si scambiano.
![]() |
Nella Slide 14 viene presentato il formato di un Resource Record sulla rete.
Le dimensioni sono quelle rappresentate nella stessa Slide. A questo punto dovrebbe
essere chiaro il significato dei vari campi del Resource Record. Da notare che
il campo RDATA ha dimensione variabile. La dimensione ed il tipo di informazioni
vengono definite in base ai campi RDLENGTH, CLASS e TYPE.
E' inutile specificare quì i vari formati di RDATA (per questo si rimanda
allo standard sui messaggi dei DNS, RFC 1035). Le regole che ruotano attorno al mondo dei DNS sono molte di più di
quelle riportate in queste poche Slide. Ci sono molteplici configurazioni di
DNS, molteplici tipi di Query e diversi (non standardizzati) algoritmi per la
gestione di un Name Server e di un Local Resolver. Ci sono i vincoli
temporali sulle RR's memorizzate nella cache, e sistemi di compressione di nomi
di domini duplicati nello stesso messaggio. Per chi volesse interessarsi maggiormente
all'argomento può consultare i seguenti documenti che formano lo standard
sui DNS :
Conclusioni
/ Bibliografia