PHP构建DNS请求包

DNS协议请求包格式:

+———————+
| 报文头 |
+———————+
| 问题  | 向服务器提出的查询部分
+———————+
| 回答  | 服务器回复的资源记录
+———————+
| 授权 | 权威的资源记录
+———————+
| 格外的 | 格外的资源记录
+———————+

其中报文头是12字节,包括以下内容:

  1. ID             2字节              随机id
  2. QR             1/8字节         0查询 1回复
  3. Opcode         1/2字节          查询种类:0标准 1反向
  4. AA             1/8字节         是否权威回复
  5. TC             1/8字节         是否有截取内容
  6. RD             1/8字节         是否递归
  7. RA             1/8字节         服务器是否支持递归
  8. Z              3/8字节         保留字段
  9. RCODE          1/2字节           返回状态码
  10. QDCOUNT        2字节              查询记录个数
  11. ANCOUNT        2字节              回复记录个数
  12. NSCOUNT        2字节              权威记录个数
  13. 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