用python进行DNS(domain name system)查询(--查询报文的构建与发送)

来源:互联网 发布:em算法应用实例 编辑:程序博客网 时间:2024/06/10 02:44

最近对python的网络通讯比较感兴趣,了解了一下,写了一个DNS(domain name system,以下简称DNS)查询脚本。

1.DNS是通过UDP协议查询的,所以首先协议导入socket模块并开启UDP服务,代码如下:

import socketsock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

2.编写DNS查询报文:
(1)标识(两字节),由用户随意设置,在应答报文会返回同样的标识。
(2)报文参数(两字节,详细参数如下),

- 参数名 QR 操作码 AA TC RD RA 保留 recode - 值 0 0000 0 0 1 0 000 0000 - 含义 查询 标准查询 是否为权威服务器 报文未截断 期望递归解析 服务器是否支持递归 保留 没有出错

(3)问题数(两字节)
(4)应答数(两字节)
(5)授权机构数(两字节)
(6)附加信息数(两字节)
(7)查询信息(要注意的是网址之间的点不是以ASCII码表示,而是已到下一个点之间的ASCII码数)
例如:www.baidu.com的查询信息为\x00\x03www\x05baidu\x03com\x00
(8)查询类型(两字节,值为0001,即将域名转换为IPv4地址)
(9)查询类(两字节,值为0001,即查询的是因特网的域名)
构造报文的代码是:

msg = b'\x5c\x6d\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x03www\x05baidu\x03com\x00\x00\x01\x00\x01'

4.发送查询报文,并接受返回的数据,代码如下:

sock.sendto(msg,('8.8.8.8',53))c = sock.recv(4096)

至此发送就讲完了,下一次来解析返回的数据

0 0
原创粉丝点击