Алгоритм сортировки ответов в циклической конфигурации DNS - PullRequest
1 голос
/ 10 января 2010

Я пытаюсь реализовать алгоритм сортировки, чтобы моя библиотека DNS всегда работала с упорядоченным списком записей DNS, даже если ответ приходит из конфигурации Round-Robin.

Давайте возьмем следующие два ответа.

Во-первых.

$ 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

;; ...

Второй.

$ 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

;; ...

Они равны, за исключением того, что раздел ANSWER содержит записи DNS в другом порядке. Мне нужно применить алгоритм сортировки, чтобы нормализовать раздел ответа.

Я уже выяснил начальную версию алгоритма, но чем больше я добавляю тестов, тем больше я обнаруживаю раскрытых случаев. Например, в следующем ответе порядок первой записи должен остаться без изменений.

$ 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

;; ...

Есть ли какая-либо существующая реализация / ссылка, которую я могу прочитать, чтобы извлечь подходящий алгоритм?

ОБНОВЛЕНИЕ: Некоторые пояснения к моему первоначальному вопросу. Мне не нужна библиотека для получения записей DNS, У меня есть . Мне нужно найти эффективный алгоритм для сортировки ответной части ответа.

Кроме того, имейте в виду, что вопрос не ограничивается вопросом. Исходный запрос DNS может быть запросом NS, запросом CNAME или чем угодно.

Я использую Ruby, но это не относится к самому вопросу.

Ответы [ 4 ]

2 голосов
/ 10 января 2010

В зависимости от языка, который вы используете, размещение всех ответов в хэш / словаре с массивом для листьев в соответствии с типом / адресом, возможно, будет проще.

Я бы порекомендовал tie :: sorted :: array :: lazy, если вы используете perl.

0 голосов
/ 11 января 2010

Не могли бы вы объяснить , почему вам нужно их отсортировать?

Обычно порядок записей DNS в каждом разделе пакета не имеет значения. Также не гарантируется, что два последовательных запроса вернут одно и то же подмножество возможных записей.

0 голосов
/ 11 января 2010
  1. Получить список IP-адресов.
  2. Преобразование IP-адресов в целочисленное представление.
  3. Сортировка IP-адресов по целочисленному представлению.
  4. Прибыль.
0 голосов
/ 11 января 2010

Для большинства языков программирования должна быть доступна библиотека для получения списка IP-адресов для данного имени хоста. Это будет что-то вроде gethostbyname, которое будет возвращать массив IP-адресов, которые вы можете отсортировать, как любой стандартный массив. В PHP это gethostbynamel, в Ruby это Socket :: gethostbyname.

Нет необходимости самостоятельно проходить процедуру получения DNS-записей, но если вы действительно этого хотите, правила DNS довольно просты. Имя хоста будет возвращать запись CNAME или A (при условии, что мы имеем дело только с IPv4); запись A будет возвращать IP-адреса, если вы получите CNAME, вы захотите использовать рекурсию для получения записей A результата CNAME.

...