Вернемся к запросу, который я сформировал, а вернее - моя программа сформировала, он был показан ранее во врезках, и как видим я запрашивал:
------------------------------ ID .... : 1234 FLAGS . : RD QDCOUNT : 1 ANCOUNT : 0 NSCOUNT : 0 ARCOUNT : 0 ------------------------------ QNAME . : www.netvision.net.il TYPE .. : A CLASS . : IN ------------------------------
Идентификатор ID может быть выбран случайным образом, он нужен вам для учета. Но я бы советовал вырабатывать номера по порядку, хотя и не обязательно с единицы. Однако я для опыта выбрал 1234 в шестнадцатиричном формате. Запросил возможность рекурсивного обращения RD, на всякий случай. Количество пунктов в поле 'Question' у меня - один. Так я в счетчике QDCOUNT и указал. Остальные счетчики - не моя забота, а сервера. Пусть он и ставит что полагается. А я забил нулями.
QNAME - www.netvision.net.il - имя интересующего меня хоста. TYPE - А - что желаю получить - IP адрес. CLASS - IN - сетка - Интернет.
Ну, что, пока все ясно ? Ну, я рад.
Теперь смотрим, что я получил в ответ :
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ----------------------------------------------- 00 95 12 34 85 80 00 01 00 01 00 02 00 02 03 77 ...4...........w 77 77 09 6E 65 74 76 69 73 69 6F 6E 03 6E 65 74 ww.netvision.net 02 69 6C 00 00 01 00 01 C0 0C 00 01 00 01 00 01 .il............. 51 80 00 04 C2 5A 01 0A 09 6E 65 74 76 69 73 69 Q....Z...netvisi 6F 6E 03 6E 65 74 02 69 6C 00 00 02 00 01 00 01 on.net.il....... 51 80 00 06 03 64 6E 73 C0 36 C0 36 00 02 00 01 Q....dns.6.6.... 00 01 51 80 00 11 05 6E 79 70 6F 70 05 65 6C 72 ..Q....nypop.elr 6F 6E 03 6E 65 74 00 C0 52 00 01 00 01 00 01 51 on.net..R......Q 80 00 04 C2 5A 01 05 C0 64 00 01 00 01 00 01 51 ....Z...d......Q 80 00 04 C7 CB 01 14 00 00 00 00 00 00 00 00 00 ................ -------------------^ это последний байт ответа
А теперь посмотрим результаты работы моей функции декодирования:
-------- Results of Query ------- **. DataBlock Length -------- : 0097 --- 151 bytes. **. Query Length ------------ : 0095 --- 149 bytes. ========== Header ========== 00. ID ------ Identifier : 1234 01. QR ----- Query/Response : 0001 02. OPCODE -- Opcode : 0000 03. AA ------ Autoritate : 0001 04. TC ------ Truncation : 0000 05. RD ------ RecursDesired : 0001 06. RA ------ RecursAvailable : 0001 07. Z ------- RFU : 0000 08. RCODE --- ResponseCode : 0000 09. QDCOUNT - N of Questions : 0001 0A. ANCOUNT - N of Answers : 0001 0B. NSCOUNT - N of Authority : 0002 0C. ARCOUNT - N 0f Additions : 0002 ======= Question =========== www.netvision.net.il TYPE = A, CLASS = IN ============================ ========= Response ========= www.netvision.net.il TYPE = A, CLASS = IN RDLENGTH = 0004 IP address = 194.90.1.10 ============================ netvision.net.il TYPE = NS, CLASS = IN RDLENGTH = 0006 NS server : dns.netvision.net.il ============================ netvision.net.il TYPE = NS, CLASS = IN RDLENGTH = 0011 NS server : nypop.elron.net ============================ dns.netvision.net.il TYPE = A, CLASS = IN RDLENGTH = 0004 IP address = 194.90.1.5 ============================ nypop.elron.net TYPE = A, CLASS = IN RDLENGTH = 0004 IP address = 199.203.1.20 ============================
Даже и не знаю, что еще можно объяснять. Я постарался выцарапать из ответа все, что только можно и отобразить на экране. Ну, и попутно скинуть на винт в виде файла. Если кому не лень, тот может пройтись по "бинарному" ответу и заметить, что часть имен хостов представлена в обычном виде, а часть в упакованном, о чем я и говорил раньше. Так что убедитесь.
Ну, вот. Кажется и все пока. Если что будет новое, то обновим этот документ. Разве что можно еще взглянуть со стороны на моего примитивного NS-lookup клиента. Пожалуй, стоит его причесать, и вставить в основную мою программу - почтового сервера для персонального использования, в виде дополнительной опции.