******************************************* ---------- Здесь начало пакета ------------ ******************************************* 00 26 ............... Length (UINT) 2 байта - длина запроса ******************************************* -------------- Header Field --------------- ******************************************* 12 34 ............... ID (UINT) 2 байта идентификатор запроса ------------------------------------------- 01 00 ............... FLAGS 2 байта с флагами ------------------------------------------- 00 01 ............... QDCOUNT (UINT) 2 байта счетчик записей в поле Question ------------------------------------------- 00 00 ............... ANCOUNT (UINT) 2 байта счетчик записей в поле Answer ------------------------------------------- 00 00 ............... NSCOUNT (UINT) 2 байта счетчик записей в поле Authority ------------------------------------------- 00 00 ............... ARCOUNT (UINT) 2 байта счетчик записей в поле Additional ******************************************* ------------ Question Field --------------- ******************************************* 03 "www" 09 "netvision" 03 "net" 02 "il" 00 ...... QNAME ( URL в виде 'Ns domain name' : последовательность символьных меток, предваряемых байтом длины, оканчивается 'as zero-string' нолем. Длина - до 255 байт + '\0' ). ------------------------------------------- 00 01 ............... QTYPE (UINT) 2 байта тип запроса 'A' IP адрес ------------------------------------------- 00 01 ............... QCLASS (UINT) 2 байта класс запроса 'IN' Internet ******************************************* ---------- Здесь окончание пакета --------- *******************************************
Я надеюсь, что вы не запутались в QNAME поле, уж очень неудобно строка в виде байтов выглядит, поэтому я так и сделал, сначала один байт длины поставил, за ним меточку, и так далее. Метки могут быть длиной до 63 символов + 'zero-byte'.
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| OPCODE |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
QR : [q/r] 0 -Query 1 -Response
OPCODE : [q] 0 -standard query, 1 -inverse query, 2 -server status. 3..15 RFU
AA : [r] Authoritative Answer (ставит NS север, отвечающий за домен в запросе)
TC : [r] TrunCation, ставится при урезании сообщения из-за ограничения в длину.
RD : [q/r] Recursion Desired, запрос поддержки рекурсивных обращений
RA : [r] Recursion Available - сервер поддерживает рекурсивные обращения
Z : RFU - Reserved for Future Using
RCODE : [r] Response Code 0 - нет ошибок. 1..5 ошибки.... может быть - позже.
В квадратных скобках [q/r] указано где ставится флаг.
Внимание !!
Бит 00 - самый старший, бит 0F - самый младший. Честное слово, так в документации. Ж8-0.
OPCODE - с ним я еще не до конца разобрался, однако пока использую стандартный запрос. Если разберусь, обновим этот текст.
TC - тоже пока мне не попадался.
RD - я его ставлю, сервер его не трогает
RA - сервер ставит сам, что бы меня успокоить
RCODE - с этим все понятно. Если ноль, стало быть порядок. Нет - смотри документацию.