4. Messages (Messaggi)
Tutte le comunicazioni all'interno del protocollo di dominio sono trasportate in un singolo formato chiamato messaggio.
4.1. Format (Formato)
Il formato di livello superiore di un messaggio è diviso in 5 sezioni (alcune delle quali sono vuote in certi casi):
+---------------------+
| Header |
+---------------------+
| Question | la domanda per il name server
+---------------------+
| Answer | RR che rispondono alla domanda
+---------------------+
| Authority | RR che puntano verso un'autorità
+---------------------+
| Additional | RR contenenti informazioni aggiuntive
+---------------------+
Descrizioni delle sezioni:
-
Header: Sempre presente. Include campi che specificano quali sezioni rimanenti sono presenti e se il messaggio è una query o una risposta, una query standard o altro opcode, ecc.
-
Question: Contiene campi che descrivono una domanda a un name server. Questi campi sono un tipo di query (QTYPE), una classe di query (QCLASS) e un nome di dominio di query (QNAME).
-
Answer: Contiene RR che rispondono alla domanda.
-
Authority: Contiene RR che puntano verso un name server autoritativo.
-
Additional: Contiene RR che si riferiscono alla query, ma non sono strettamente risposte alla domanda.
Le ultime tre sezioni hanno lo stesso formato: un elenco possibilmente vuoto di resource record (RR) concatenati.
4.1.1. Header Section Format (Formato sezione header)
L'header contiene i seguenti campi:
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ID |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z | RCODE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QDCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ANCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| NSCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| ARCOUNT |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Descrizioni dei campi
ID (16 bit):
- Un identificatore a 16 bit assegnato dal programma che genera qualsiasi tipo di query
- Questo identificatore viene copiato nella risposta corrispondente
- Può essere utilizzato dal richiedente per abbinare le risposte alle query in sospeso
QR (1 bit):
- Flag Query/Response
- Specifica se questo messaggio è una query (0) o una risposta (1)
OPCODE (4 bit):
- Specifica il tipo di query in questo messaggio
- Impostato dall'iniziatore di una query e copiato nella risposta
- Valori:
0- Query standard (QUERY)1- Query inversa (IQUERY)2- Richiesta di stato del server (STATUS)3-15- Riservato per uso futuro
AA (1 bit):
- Risposta autoritativa (Authoritative Answer)
- Valido nelle risposte
- Specifica che il name server che risponde è un'autorità per il nome di dominio nella sezione question
- Nota: La sezione answer può avere più nomi di proprietari a causa degli alias. Il bit AA corrisponde al nome che corrisponde al nome della query, o al primo nome del proprietario nella sezione answer.
TC (1 bit):
- Troncamento (TrunCation)
- Specifica che questo messaggio è stato troncato a causa di una lunghezza maggiore di quella consentita sul canale di trasmissione
RD (1 bit):
- Ricorsione desiderata (Recursion Desired)
- Può essere impostato in una query e viene copiato nella risposta
- Se RD è impostato, indica al name server di perseguire la query in modo ricorsivo
- Il supporto delle query ricorsive è opzionale
RA (1 bit):
- Ricorsione disponibile (Recursion Available)
- Impostato o cancellato in una risposta
- Indica se il supporto delle query ricorsive è disponibile nel name server
Z (3 bit):
- Riservato per uso futuro
- Deve essere zero in tutte le query e risposte
RCODE (4 bit):
- Codice di risposta
- Impostato come parte delle risposte
- Valori:
0- Nessuna condizione di errore1- Errore di formato - Il name server non è stato in grado di interpretare la query2- Guasto del server - Il name server non è stato in grado di elaborare questa query a causa di un problema con il name server3- Errore di nome - Significativo solo per le risposte da un name server autoritativo, questo codice indica che il nome di dominio referenziato nella query non esiste4- Non implementato - Il name server non supporta il tipo di query richiesto5- Rifiutato - Il name server rifiuta di eseguire l'operazione specificata per motivi di politica6-15- Riservato per uso futuro
QDCOUNT (16 bit):
- Un intero senza segno a 16 bit che specifica il numero di voci nella sezione question
ANCOUNT (16 bit):
- Un intero senza segno a 16 bit che specifica il numero di resource record nella sezione answer
NSCOUNT (16 bit):
- Un intero senza segno a 16 bit che specifica il numero di resource record del name server nella sezione dei record di autorità
ARCOUNT (16 bit):
- Un intero senza segno a 16 bit che specifica il numero di resource record nella sezione dei record aggiuntivi
4.1.2. Question Section Format (Formato sezione question)
La sezione question viene utilizzata per trasportare la "domanda" nella maggior parte delle query, cioè i parametri che definiscono cosa viene chiesto.
La sezione contiene QDCOUNT (di solito 1) voci, ciascuna nel seguente formato:
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Descrizioni dei campi
QNAME (variabile):
- Un nome di dominio rappresentato come una sequenza di etichette
- Ogni etichetta consiste di un ottetto di lunghezza seguito da quel numero di ottetti
- Il nome di dominio termina con l'ottetto di lunghezza zero per l'etichetta nulla della radice
- Nota: Questo campo può avere un numero dispari di ottetti; non viene utilizzato alcun padding
QTYPE (16 bit):
- Un codice a due ottetti che specifica il tipo della query
- I valori per questo campo includono tutti i codici validi per un campo TYPE, insieme ad alcuni codici più generali che possono corrispondere a più di un tipo di RR
QCLASS (16 bit):
- Un codice a due ottetti che specifica la classe della query
- Ad esempio, il campo QCLASS è IN per Internet
4.1.3. Resource Record Format (Formato resource record)
Le sezioni answer, authority e additional condividono tutte lo stesso formato: un numero variabile di resource record, dove il numero di record è specificato nel campo di conteggio corrispondente nell'header.
Ogni resource record ha il seguente formato:
1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ /
/ NAME /
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| CLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| TTL |
| |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| RDLENGTH |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|
/ RDATA /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
Descrizioni dei campi
NAME (variabile):
- Un nome di dominio a cui questo resource record appartiene
TYPE (16 bit):
- Due ottetti contenenti uno dei codici di tipo RR
- Questo campo specifica il significato dei dati nel campo RDATA
CLASS (16 bit):
- Due ottetti che specificano la classe dei dati nel campo RDATA
TTL (32 bit):
- Un intero senza segno a 32 bit che specifica l'intervallo di tempo (in secondi) per cui il resource record può essere memorizzato nella cache prima che debba essere scartato
- I valori zero sono interpretati nel senso che l'RR può essere utilizzato solo per la transazione in corso e non deve essere memorizzato nella cache
RDLENGTH (16 bit):
- Un intero senza segno a 16 bit che specifica la lunghezza in ottetti del campo RDATA
RDATA (variabile):
- Una stringa di lunghezza variabile di ottetti che descrive la risorsa
- Il formato di queste informazioni varia in base al TYPE e alla CLASS del resource record
- Ad esempio, se il TYPE è A e la CLASS è IN, il campo RDATA è un indirizzo Internet ARPA a 4 ottetti
4.1.4. Message Compression (Compressione dei messaggi)
Per ridurre le dimensioni dei messaggi, il sistema di dominio utilizza uno schema di compressione che elimina la ripetizione dei nomi di dominio in un messaggio.
Metodo di compressione
In questo schema, un nome di dominio completo o un elenco di etichette alla fine di un nome di dominio viene sostituito con un puntatore a un'occorrenza precedente dello stesso nome.
Formato del puntatore:
Il puntatore assume la seguente forma:
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| 1 1| OFFSET |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- I primi due bit sono uno
- Questo consente di distinguere un puntatore da un'etichetta, poiché le etichette devono iniziare con due bit zero
- Il campo OFFSET specifica un offset dall'inizio del messaggio (cioè, il primo ottetto del campo ID nell'header del dominio)
- Un offset zero specifica il primo byte del campo ID, ecc.
Regole di compressione
Lo schema di compressione consente a un nome di dominio in un messaggio di essere rappresentato come:
- Una sequenza di etichette che termina con un ottetto zero
- Un puntatore
- Una sequenza di etichette che termina con un puntatore
Restrizioni importanti:
- I puntatori possono essere utilizzati solo per le occorrenze di un nome di dominio in cui il formato non è specifico per la classe
- Se così non fosse, un name server o resolver dovrebbe conoscere il formato di tutti gli RR che gestisce
- Finora, non ci sono tali casi, ma potrebbero verificarsi in futuri formati RDATA
La compressione è consentita:
- Nel campo NAME dei resource record
- Nel campo QNAME delle voci question
- Ogni volta che un nome di dominio appare nel campo RDATA (solo per certi tipi RR dove il formato è noto)
La compressione NON è consentita:
- Nell'RDATA dei tipi RR dove il formato RDATA è sconosciuto o variabile
Esempio
Se una query contiene:
www.example.com
mail.example.com
La seconda occorrenza di "example.com" può essere sostituita con un puntatore alla prima occorrenza, risparmiando byte.
4.2. Transport (Trasporto)
I messaggi DNS possono essere trasportati da diversi protocolli di trasporto:
4.2.1. UDP Usage (Uso UDP)
- Trasporto predefinito: UDP è il trasporto preferito per le query e le risposte DNS
- Dimensione massima: I messaggi DNS inviati tramite UDP non dovrebbero (SHOULD NOT) superare i 512 ottetti
- Troncamento: Se una risposta supera i 512 ottetti, il bit TC (Troncamento) dovrebbe (SHOULD) essere impostato nell'header
- Ripetizione: Quando TC=1, il client dovrebbe (SHOULD) riprovare la query utilizzando TCP
Vantaggi di UDP:
- Overhead inferiore
- Più veloce per query piccole
- Nessuna configurazione di connessione richiesta
4.2.2. TCP Usage (Uso TCP)
- Quando usare: TCP dovrebbe (SHOULD) essere utilizzato quando:
- La dimensione della risposta supera i 512 ottetti
- È richiesta una consegna affidabile
- Vengono eseguiti trasferimenti di zona
- Formato del messaggio: Quando si utilizza TCP, un campo di lunghezza a 16 bit precede ogni messaggio
- Gestione della connessione: Le connessioni possono essere persistenti o chiuse dopo ogni coppia query-risposta
Formato del messaggio TCP:
+---------------------+
| Length (16 bits) |
+---------------------+
| |
| DNS Message |
| |
+---------------------+
4.3. Standard Query Example (Esempio di query standard)
Ecco un esempio di query standard per il record A di www.example.com:
Struttura del messaggio di query:
Header:
ID: 0x1234
QR: 0 (Query)
OPCODE: 0 (Standard Query)
RD: 1 (Recursion Desired)
QDCOUNT: 1
ANCOUNT: 0
NSCOUNT: 0
ARCOUNT: 0
Question:
QNAME: www.example.com
QTYPE: A (1)
QCLASS: IN (1)
Struttura del messaggio di risposta:
Header:
ID: 0x1234
QR: 1 (Response)
OPCODE: 0 (Standard Query)
AA: 1 (Authoritative Answer)
RD: 1 (Recursion Desired)
RA: 1 (Recursion Available)
RCODE: 0 (No Error)
QDCOUNT: 1
ANCOUNT: 1
NSCOUNT: 0
ARCOUNT: 0
Question:
QNAME: www.example.com
QTYPE: A (1)
QCLASS: IN (1)
Answer:
NAME: www.example.com
TYPE: A (1)
CLASS: IN (1)
TTL: 3600
RDLENGTH: 4
RDATA: 93.184.216.34
Successivo: 5. Master Files (File Master)