Я пытаюсь реализовать алгоритм сортировки, чтобы моя библиотека 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, но это не относится к самому вопросу.