Algoritmo para classificar a resposta em uma configuração de DNS round-robin

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

  •  19-09-2019
  •  | 
  •  

Pergunta

Eu estou tentando implementar um algoritmo de classificação para garantir minha biblioteca DNS trabalha sempre com uma lista ordenada de registros de DNS, mesmo se a resposta vem de uma configuração Round-Robin.

Vamos dar as duas respostas seguintes.

Em primeiro lugar.

$ 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

;; ...

Em segundo lugar.

$ 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

;; ...

Eles são iguais, exceto pelo fato da seção ANSWER contém os registros de DNS em ordem diferente. Eu preciso aplicar um algoritmo de classificação para normalizar a secção de resposta.

Eu já descobriu uma versão inicial do algoritmo, mas quanto mais eu adicionar testes mais eu descobrir casos descobertos. Por exemplo, na seguinte resposta na ordem do primeiro registro deve ser mantida inalterada.

$ 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

;; ...

Existe algum tipo de implementação existente / referência eu posso ler, a fim de extrair um algoritmo adequado?

UPDATE: Alguns esclarecimentos à minha pergunta inicial. Eu não preciso de uma biblioteca para obter registros de DNS, eu tenho que . Eu preciso encontrar um algoritmo eficiente para classificar a secção de resposta de uma resposta.

Além disso, mantenha em mente a questão não se restringe a uma pergunta A. A consulta DNS original pode ser uma consulta NS, uma consulta CNAME ou o que quiser.

Eu estou usando Ruby, mas isso não é relevante para a questão em si.

Foi útil?

Solução

Dependendo do idioma que você está usando, colocando todas as respostas em um hash / dicionário com uma matriz para as folhas acordo com o tipo / endereço, provavelmente seria mais simples.

Eu recomendo laço :: classificadas :: variedade :: preguiçoso, se você usar perl.

Outras dicas

Deve haver um disponível biblioteca para a maioria das linguagens de programação para obter uma lista de endereços IP para um determinado nome de host. Vai ser algo como gethostbyname que irá retornar uma matriz de endereços IP que você pode classificar como qualquer norma matriz. Em PHP, gethostbynamel, Em Ruby é soquete :: gethostbyname.

Não há necessidade de passar pelo processo de obtenção de registros de DNS mesmo, mas se você realmente quer, em seguida, as regras de DNS são bastante simples. Um hostname será ou retornar um CNAME ou um registro A (presumindo que estamos lidando apenas com IPv4); um registro retornará endereços IP, se você receber um CNAME que você vai querer usar recursão para obter os registros do resultado CNAME.

  1. Obter lista de endereços IP.
  2. endereços IP converter para representação inteira.
  3. Classificar IP endereços por representação inteira.
  4. Profit.

Pode me explicar por que você precisa para classificá-los?

Geralmente, a ordem de registros de DNS dentro de cada seção de um pacote é irrelevante. Nem é garantido que duas consultas sucessivas retornará o mesmo subconjunto de possíveis registros.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top