Domain Name Service - Служба Доменных Имен



         

Практическая реализация DNS - часть 3


/p>

Общая длина заголовка - 12 байт, после которого следуют поля переменной длины. Нас будут интересовать только секции вопросов и ответов. В пакете от клиента количество вопросов, как правило, равно единице. А в пакете от сервера количество ответов как минимум один. Остальные счетчики будем устанавливать в ноль.

Обе секции (вопросы и ответы) имеют одинаковое начало: переменное количество байт, отведенное на имя, два байта на тип, и два - на класс. Класс будет всегда единицей. Типы - A, NS, MX, CNAME и т.д. Например, для типа A поле будет установлено в единицу, а для MX - 15. Для запросов и ответов имя кодируется одинаково. Все символы представляются своими ASCII кодами за исключением точек. Точки разделяют имя на части, а сами заменяются длинами этих частей. Для примера: www.yahoo.com.

Будет представлено в виде последовательности байт: 3www5yahoo3com0 - буквы представляются кодами.

При этом финальный ноль является обязательным, т.к. является маркером конца имени.

Теперь у нас есть достаточно информации, чтобы составить клиентский пакет, который запрашивает IP адрес хоста "aaa."

byte[] question={2,34,1,0,0,1,0,0,0,0,0,0,3,97,97,97,0,0,1,0,1};

2,34 - это идентификаторы, выбранные случайным образом

За ними следуют два байта флагов, которые сообщают о том, что это стандартный запрос, требующий рекурсию.

Следующие два байта - это кол-во вопросов, т.е. один. При этом остальных полей переменной длины нет.

Вопрос начинается сразу после заголовка - 12й байт, считая с нуля.

Такую же последовательность, за исключением идентификатора, можно увидеть сетевым монитором, сформировав запрос "aaa" с помощью утилиты nslookup.

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

//получение текста имени из вопроса int i=12; String s=""; String QUESTION;

while (data[i]>0) { if (s.length()>0) {s+=".";} if ((data[i]+i+1)>=len) {s="";break;} s += new String(data, i+1, data[i]); i+=data[i]+1; } QUESTION = s;




Содержание  Назад  Вперед