DNS协议请求包格式:
+———————+
| 报文头 |
+———————+
| 问题 | 向服务器提出的查询部分
+———————+
| 回答 | 服务器回复的资源记录
+———————+
| 授权 | 权威的资源记录
+———————+
| 格外的 | 格外的资源记录
+———————+
其中报文头是12字节,包括以下内容:
- ID 2字节 随机id
- QR 1/8字节 0查询 1回复
- Opcode 1/2字节 查询种类:0标准 1反向
- AA 1/8字节 是否权威回复
- TC 1/8字节 是否有截取内容
- RD 1/8字节 是否递归
- RA 1/8字节 服务器是否支持递归
- Z 3/8字节 保留字段
- RCODE 1/2字节 返回状态码
- QDCOUNT 2字节 查询记录个数
- ANCOUNT 2字节 回复记录个数
- NSCOUNT 2字节 权威记录个数
- ARCOUNT 2字节 额外记录个数
然后是查询主体,包括QNAME(不定长)、QTYPE(1是A查询)、QCLASS(1是IN)
$domain = 'www.mogublog.net.';
$dns = '223.5.5.5';
// pack('n6', ID, QR-RCODE, QDCOUNT, ANCOUNT, NSCOUNT, ARCOUNT)
$data = $data = pack('n6', rand(1, 65530), 0b100000000, 1, 0, 0, 0);
// QNAME
foreach (explode('.', $domain) as $bit) {
$l = strlen($bit);
$data .= chr($l) . $bit;
}
// pack('n2', QTYPE, QCLASS)
$data .= pack('n2', 1, 1);
参考资料:
http://www.voidcn.com/blog/Primeprime/article/p-5772321.html