Algoritmo per l'ordinamento risposta in una configurazione DNS round-robin

StackOverflow https://stackoverflow.com/questions/2039418

  •  19-09-2019
  •  | 
  •  

Domanda

Sto cercando di implementare un algoritmo di ordinamento per garantire la mia libreria DNS lavora sempre con un elenco ordinato di record DNS, anche se la risposta viene da una configurazione Round-Robin.

Prendiamo i seguenti due risposte.

Per prima.

$ dig google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> google.com A
;; ...

;; ANSWER SECTION:
google.com.  201 IN A 74.125.39.106
google.com.  201 IN A 74.125.39.105
google.com.  201 IN A 74.125.39.147
google.com.  201 IN A 74.125.39.104
google.com.  201 IN A 74.125.39.103
google.com.  201 IN A 74.125.39.99

;; ...

In secondo luogo.

$ dig google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> google.com A
;; ...

;; ANSWER SECTION:
google.com.  119 IN A 74.125.39.147
google.com.  119 IN A 74.125.39.104
google.com.  119 IN A 74.125.39.103
google.com.  119 IN A 74.125.39.99
google.com.  119 IN A 74.125.39.106
google.com.  119 IN A 74.125.39.105

;; ...

Sono uguali, tranne per il fatto che la sezione di ANSWER contiene i record DNS in ordine diverso. Ho bisogno di applicare un algoritmo di ordinamento per normalizzare la risposta sezione.

I già capito una prima versione dell'algoritmo, ma più aggiungo test più scopro casi scoperti. Ad esempio, nel seguente risposta dell'ordine del primo record deve essere mantenuta invariata.

$ dig www.google.com A

; <<>> DiG 9.6.0-APPLE-P2 <<>> www.google.com A
;; ...

;; ANSWER SECTION:
www.google.com.  603039 IN CNAME www.l.google.com.
www.l.google.com. 78 IN A 74.125.39.105
www.l.google.com. 78 IN A 74.125.39.104
www.l.google.com. 78 IN A 74.125.39.147
www.l.google.com. 78 IN A 74.125.39.106
www.l.google.com. 78 IN A 74.125.39.99
www.l.google.com. 78 IN A 74.125.39.103

;; ...

C'è qualche tipo di implementazione / riferimento esistente posso leggere al fine di estrarre un algoritmo adatto?

UPDATE: Alcuni chiarimenti alla mia domanda iniziale. Non ho bisogno di una libreria per ottenere i record DNS, li ho . Ho bisogno di trovare un algoritmo efficiente per ordinare la sezione di risposta di una risposta.

Inoltre, tenete a mente la questione non è limitata a un A domanda. La query DNS originale potrebbe essere una query NS, una query CNAME o quello che volete.

Sto utilizzando Ruby, ma questo non è rilevante per la domanda stessa.

È stato utile?

Soluzione

A seconda della lingua che si sta utilizzando, mettendo tutte le risposte in un hash / dizionario con un allineamento per le ante in base al tipo / indirizzo, sarebbe probabilmente più semplice.

Mi consiglia cravatta :: ordinato :: :: gamma pigro se si utilizza perl.

Altri suggerimenti

Ci dovrebbe essere una biblioteca a disposizione per la maggior parte dei linguaggi di programmazione per ottenere un elenco di indirizzi IP per un dato hostname. Sarà qualcosa di simile a gethostbyname che restituirà una serie di indirizzi IP che è possibile ordinare come qualsiasi serie standard. In PHP è gethostbynamel, In Ruby è Socket :: gethostbyname.

Non c'è bisogno di passare attraverso il processo di ottenere DNS te stesso record, ma se si vuole veramente allora le regole DNS sono abbastanza semplici. Un nome host sarà o restituire un CNAME o un record A (presumendo che siamo solo a che fare con IPv4); un record A tornerà indirizzi IP, se si ottiene un CNAME si vorrà utilizzare la ricorsione per ottenere i record del risultato CNAME.

  1. Ottenere lista di indirizzi IP.
  2. Convertire gli indirizzi IP a intero rappresentazione.
  3. indirizzi IP Ordina per rappresentazione intera.
  4. Profit.

Si può spiegare perché è necessario per ordinare loro?

Generalmente l'ordine dei record DNS all'interno di ogni sezione di un pacchetto è irrilevante. Né è garantito che due interrogazioni successive restituiranno lo stesso sottoinsieme di possibili record.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top