DNS报文格式解析
- MetricVoid
- 5月 22, 2021
- 技术笔记
- 0 Comments
DNS数据包一般走的协议是UDP,而且请求和答复的报文格式其实是一样的。请求只包含Question部分,而答复包含Question和Answer
Header – 报头 |
Question – 请求的DNS数据 |
Answer – DNS的答复 |
Header 报头
报头的数据格式如下(LSB First):
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ID | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QDCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ANCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | NSCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ARCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- ID: 16位的ID。这个ID在响应请求的时候将会被复制,这样客户端就可以将请求和回复对应上。
- QR:0代表这是一个请求,1代表这是一个回复。
- Opcode:指示当前进行的操作
- 0:普通DNS查询
- 1:反向DNS查询
- 2:查询服务器状况
- AA:Authorative Answer,指示当前回复是否权威。
- TC:TrunCated. 1代表当前小心因为过长而被切割了。
- RD:Recursion Desired。客户端希望服务器进行迭代查询(向上层服务器转发查询)。
- RA:Recusion Available。指示当前服务器支持迭代查询。
- Z:保留。目前设为0
- RCODE:Response Code
- 0:没有错误 (NOERROR)
- 1:入包格式错误 (FORMERR)
- 2:服务器错误 (SERVFAIL)
- 3:域名不存在 (NXDOMAIN)
- 4:未实现 (NOTIMPL),已弃用
- 除此之外还有很多不常用的。
- QDCOUNT:问题的个数
- ANCOUNT:答案的个数
- NSCOUNT:权威服务器的数量(一般用不到,为0)。
- ARCOUNT:额外信息的数量(一般用不到,为0)。
Question部分格式
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | / QNAME / / / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QTYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QCLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- QNAME:一个特殊格式的分段字符串。每一段的格式如下
- 长度:一个字节(8位)的数字,指示当前这一段的长度,如0x03
- 内容:如上长度的内容,比如
0x777777
,代表www
- 每段之间是一个
.
- 长度为0(0x00)代表整个字符串的结束。
- QTYPE:请求的类型
- 1:Type A,请求IPv4的IP地址(A记录)。
- 2:Type.NS,请求域名服务器(NS记录)。
- 3:Type.AAAA,请求IPv6的IP地址(AAAA记录)。
- 5:Type.CNAME,请求一个CNAME记录
- 其他还有很多
- QCLASS:
- 1:IN,代表Internet。99.999999%的DNS记录都是IN。
- 其他还有类似CH(CHAOS), HS(Hesiod)等记录,但是没人用过它们。
Answer部分格式
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | | / / / NAME / | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | CLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TTL | | | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | RDLENGTH | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| / RDATA / / / +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
- NAME:同QNAME
- TYPE:同QTYPE
- CLASS:同QCLASS
- TTL:Time To Live,这条记录的有效时长(秒)
- RDLENGTH:
RDATA
部分的长度 - RDATA:回复的消息,根据
TYPE
的不同而有所不同。例如,如果TYPE
为1(A)的话,RDATA就是一系列的32位数字,代表IP地址。