DNS协议详解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
除了报文头是固定的 12 字节外,其他每一部分的长度均为不定字节数。 我们在这边关心的是报文头、问题、回答这三个部分。
其中报文头的格式:
111111 0123456789012345 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ID | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QDCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ANCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | NSCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ARCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
QTYPE 中的 A,MX,CNAME 为常用,QCLASS 中的 IN 为常用。
其中每个回复的记录格式:
111111 0123456789012345 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ || // / NAME / || +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | CLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TTL | || +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | RDLENGTH | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| / RDATA / // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
而如果每次访问一台计算机都是通过输入这样的东东来访问,那不就太可怕了?以是出了 DNS 这样的好东东,用要指示其绑定的 IP 地址,当我们在浏览器内输入 http://zzsy.com 时,浏览器不知道网页该到哪里取,于是就向设定好的 DNS 服务器查询 zzsy.com 这个域 名。DNS 服务器会先寻找自己的记录库,如果没有发现就转向上一级 DNS 服务器进行查询 (转发请求)。把找到后的 IP 告知你的浏览器。这里边浏览器查询的记录类型是 A 记录。 RFC1035 文档第 11 页中定义有 16 种记录类型,而常见的有 A(地址)记录、CNAME(别 名)记录、MX(邮件交换)记录。我们本篇要关心的是 MX 记录。
RD:占 1 位,1/8 字节。此位在查询中指定,回复时相同。设置为 1 指示服务器进行递 归查询。
RA:占 1 位,1/8 字节。由 DNS 回复返回指定,说明 DNS 服务器是否支持递归查询。 Z:占 3 位,3/8 字节。保留字段,必须设置为 0。 RCODE:占 4 位,1/2 字节。由回复时指定的返回码:0:无差错;1:格式错;2:DNS 出 错;3:域名不存在;4:DNS 不支持这类查询;5:DNS 拒绝查询;6-15:保留字段。 QDCOUNT:占 16 位,2 字节。一个无符号数指示查询记录的个数。 ANCOUNT:占 16 位,2 字节。一个无符号数指明回复记录的个数。 NSCOUNT:占 16 位,2 字节。一个无符号数指明权威记录的个数。 ARCOUNT:占 16 位,2 字节。一个无符号数指明格外记录的个数。
TXT=0x10, //指定文本信息。 UINFO=0x64, //指定用户信息。 UID=0x65, //指定用户标识符。 GID=0x66, //指定组名的组标识符。 ANY=0xFF //指定所有数据类型。 };
QTYPE:2 字节。 根据 RFC1035 及 nslookup 的帮助文档,我定义以下枚举类型: enum QueryClass //指定信息的协议组。 { IN=0x01, //指定 Internet 类别。 CSNET=0x02, //指定 CSNET 类别。(已过时) CHAOS=0x03, //指定 Chaos 类别。 HESIOD=0x04,//指定 MIT Athena Hesiod 类别。 ANY=0xFF //指定任何以前列出的通配符。 };
NAME:回复查询的域名,不定长。
TYPE:回复的类型。2 字节,与查询同义。指示 RDATA 中的资源记录类型。 CLASS:回复的类。2 字节,与查询同义。指示 RDATA 中的资源记录类。 TTL:生存时间。4 字节,指示 RDATA 中的资源记录在缓存的生存时间。 RDLENGTH:长度。2 字节,指示 RDATA 块的长度。 RDATA:资源记录。不定义,依 TYPE 的不同,此记录的格示不同,通常一个 MX 记录 是由一个 2 字节的指示该邮件交换器的优先级值及不定长的邮件交换器名组成的。
二、DNS 协议原理 我认为,要想成为一个好的网络软件程序员,必须得读懂 RFC 文档。因为本文是面向
大多广泛程序爱好者,所以我尽量从细节上写,如果高手的话,可以跳过此部分。 DNS 协议的相关 RFC 文档:
RFC1034-《DOMAIN NAMES - CONCEPTS AND FACILITIES》 RFC1035-《DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION》 网上的计算机用形如 220.162.75.1 这样称为 IP 地址的数字串来标识一台计算机。
这边述说一下名称的组合形式。名称由多个标识序列组成,每一个标识序列的首字节说 明该标识符的长度,接着用是 ASCII 码表示字符,多个序列之后由字节 0 表示名字结束。 其中某一个标识序列的首字符的长度若是 0xC0 的话,表示下一字节指示不是标识符序列, 而是指示接下部分在本接收包内的偏移位置。
一、前言 foxmail 新版中有一个《邮件特快专递》的功能。起先搞不懂如何用,后来知道要在 工
具->系统选项 那边设置 本地 DNS 服务器的 IP 地址。 觉得这个新功能蛮好用的。不需要通过 SMTP 代理,可以直接通过本地往邮箱所在的
邮件交换器发送邮件。在暑假一开始想在 VC++中实现这个功能。用 IRIS 截包后,发现程 序后 mx8.263.net 发送邮箱,不知道这个是什么东西所以作罢。 后来才想到这个就是 263.net 的 MX 记录主机,原来特快专递的原理就是Biblioteka Baidu这个主机上发送数据就行。
其中每个查询的资源记录格式:
111111 0123456789012345 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ || / QNAME / // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QTYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QCLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
运行 nslookup 程序: set type=mx 263.net 有了,有了,得到结果: Non-authoritative answer: 263.net MX preference = 10, mail exchanger = mx06.263.net 263.net MX preference = 10, mail exchanger = mx08.263.net 263.net MX preference = 10, mail exchanger = mx09.263.net 263.net MX preference = 10, mail exchanger = mx11.263.net 263.net MX preference = 10, mail exchanger = mx12.263.net 263.net MX preference = 40, mail exchanger = mx03.263.net 263.net MX preference = 10, mail exchanger = mx01.263.net 没有错了。就是这个了。后来因为不知道怎么实现 nslookup 的功能,就放弃了,学了 半个多月的 C#。后来偶然在网上查找到了一些相关的文档。几次实验。把我的开发过程拿 过来分享,我第一次写教程性文档。所以不规范之处,请大家包涵。本文涉及的域名、邮箱 及 IP 均为真实的。
好家伙,是什么鬼画符! 其中最上边是位的数字标识,0-15(注意,后边的 10-15 写成上下的形式了,一开始 我楞没看懂)。 接下来是: ID:占 16 位,2 个字节。此报文的编号,由客户端指定。DNS 回复时带上此标识,以 指示处理的对应请应请求。 QR:占 1 位,1/8 字节。0 代表查询,1 代表 DNS 回复 Opcode:占 4 位,1/2 字节。指示查询种类:0:标准查询;1:反向查询;2:服务器状态查 询;3-15:未使用。 AA:占 1 位,1/8 字节。是否权威回复。 TC:占 1 位,1/8 字节。因为一个 UDP 报文为 512 字节,所以该位指示是否截掉超过 的部分。
查询的过程一般是:客户向 DNS 服务器的 53 端口发送 UDP 报文,DNS 服务器收到 后进行处理,并把结果记录仍以 UDP 报文的形式返回过来。
此 UDP 报文的一般格式:
+---------------------+ | 报文头 |
+---------------------+ | 问题 | 向服务器提出的查询部分 +---------------------+ | 回答 | 服务器回复的资源记录 +---------------------+ | 授权 | 权威的资源记录 +---------------------+ | 格外的 | 格外的资源记录 +---------------------+
QNAME:不定长,表示要查询的域名。(两边的方框用 / 来表示不定长) QTYPE:2 字节,根据 RFC1035 及 nslookup 的帮助文档,我定义以下枚举类型: enum QueryType //查询的资源记录类型。 { A=0x01, //指定计算机 IP 地址。 NS=0x02, //指定用于命名区域的 DNS 名称服务器。 MD=0x03, //指定邮件接收站(此类型已经过时了,使用 MX 代替) MF=0x04, //指定邮件中转站(此类型已经过时了,使用 MX 代替) CNAME=0x05, //指定用于别名的规范名称。 SOA=0x06, //指定用于 DNS 区域的“起始授权机构”。 MB=0x07, //指定邮箱域名。 MG=0x08, //指定邮件组成员。 MR=0x09, //指定邮件重命名域名。 NULL=0x0A, //指定空的资源记录 WKS=0x0B, //描述已知服务。 PTR=0x0C, //如果查询是 IP 地址,则指定计算机名;否则指定指向其它信息的指针。 HINFO=0x0D, //指定计算机 CPU 以及操作系统类型。 MINFO=0x0E, //指定邮箱或邮件列表信息。 MX=0x0F, //指定邮件交换器。
其中报文头的格式:
111111 0123456789012345 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ID | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ |QR| Opcode |AA|TC|RD|RA| Z | RCODE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QDCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ANCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | NSCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | ARCOUNT | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
QTYPE 中的 A,MX,CNAME 为常用,QCLASS 中的 IN 为常用。
其中每个回复的记录格式:
111111 0123456789012345 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ || // / NAME / || +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | CLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | TTL | || +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | RDLENGTH | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--| / RDATA / // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
而如果每次访问一台计算机都是通过输入这样的东东来访问,那不就太可怕了?以是出了 DNS 这样的好东东,用要指示其绑定的 IP 地址,当我们在浏览器内输入 http://zzsy.com 时,浏览器不知道网页该到哪里取,于是就向设定好的 DNS 服务器查询 zzsy.com 这个域 名。DNS 服务器会先寻找自己的记录库,如果没有发现就转向上一级 DNS 服务器进行查询 (转发请求)。把找到后的 IP 告知你的浏览器。这里边浏览器查询的记录类型是 A 记录。 RFC1035 文档第 11 页中定义有 16 种记录类型,而常见的有 A(地址)记录、CNAME(别 名)记录、MX(邮件交换)记录。我们本篇要关心的是 MX 记录。
RD:占 1 位,1/8 字节。此位在查询中指定,回复时相同。设置为 1 指示服务器进行递 归查询。
RA:占 1 位,1/8 字节。由 DNS 回复返回指定,说明 DNS 服务器是否支持递归查询。 Z:占 3 位,3/8 字节。保留字段,必须设置为 0。 RCODE:占 4 位,1/2 字节。由回复时指定的返回码:0:无差错;1:格式错;2:DNS 出 错;3:域名不存在;4:DNS 不支持这类查询;5:DNS 拒绝查询;6-15:保留字段。 QDCOUNT:占 16 位,2 字节。一个无符号数指示查询记录的个数。 ANCOUNT:占 16 位,2 字节。一个无符号数指明回复记录的个数。 NSCOUNT:占 16 位,2 字节。一个无符号数指明权威记录的个数。 ARCOUNT:占 16 位,2 字节。一个无符号数指明格外记录的个数。
TXT=0x10, //指定文本信息。 UINFO=0x64, //指定用户信息。 UID=0x65, //指定用户标识符。 GID=0x66, //指定组名的组标识符。 ANY=0xFF //指定所有数据类型。 };
QTYPE:2 字节。 根据 RFC1035 及 nslookup 的帮助文档,我定义以下枚举类型: enum QueryClass //指定信息的协议组。 { IN=0x01, //指定 Internet 类别。 CSNET=0x02, //指定 CSNET 类别。(已过时) CHAOS=0x03, //指定 Chaos 类别。 HESIOD=0x04,//指定 MIT Athena Hesiod 类别。 ANY=0xFF //指定任何以前列出的通配符。 };
NAME:回复查询的域名,不定长。
TYPE:回复的类型。2 字节,与查询同义。指示 RDATA 中的资源记录类型。 CLASS:回复的类。2 字节,与查询同义。指示 RDATA 中的资源记录类。 TTL:生存时间。4 字节,指示 RDATA 中的资源记录在缓存的生存时间。 RDLENGTH:长度。2 字节,指示 RDATA 块的长度。 RDATA:资源记录。不定义,依 TYPE 的不同,此记录的格示不同,通常一个 MX 记录 是由一个 2 字节的指示该邮件交换器的优先级值及不定长的邮件交换器名组成的。
二、DNS 协议原理 我认为,要想成为一个好的网络软件程序员,必须得读懂 RFC 文档。因为本文是面向
大多广泛程序爱好者,所以我尽量从细节上写,如果高手的话,可以跳过此部分。 DNS 协议的相关 RFC 文档:
RFC1034-《DOMAIN NAMES - CONCEPTS AND FACILITIES》 RFC1035-《DOMAIN NAMES - IMPLEMENTATION AND SPECIFICATION》 网上的计算机用形如 220.162.75.1 这样称为 IP 地址的数字串来标识一台计算机。
这边述说一下名称的组合形式。名称由多个标识序列组成,每一个标识序列的首字节说 明该标识符的长度,接着用是 ASCII 码表示字符,多个序列之后由字节 0 表示名字结束。 其中某一个标识序列的首字符的长度若是 0xC0 的话,表示下一字节指示不是标识符序列, 而是指示接下部分在本接收包内的偏移位置。
一、前言 foxmail 新版中有一个《邮件特快专递》的功能。起先搞不懂如何用,后来知道要在 工
具->系统选项 那边设置 本地 DNS 服务器的 IP 地址。 觉得这个新功能蛮好用的。不需要通过 SMTP 代理,可以直接通过本地往邮箱所在的
邮件交换器发送邮件。在暑假一开始想在 VC++中实现这个功能。用 IRIS 截包后,发现程 序后 mx8.263.net 发送邮箱,不知道这个是什么东西所以作罢。 后来才想到这个就是 263.net 的 MX 记录主机,原来特快专递的原理就是Biblioteka Baidu这个主机上发送数据就行。
其中每个查询的资源记录格式:
111111 0123456789012345 +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ || / QNAME / // +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QTYPE | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ | QCLASS | +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
运行 nslookup 程序: set type=mx 263.net 有了,有了,得到结果: Non-authoritative answer: 263.net MX preference = 10, mail exchanger = mx06.263.net 263.net MX preference = 10, mail exchanger = mx08.263.net 263.net MX preference = 10, mail exchanger = mx09.263.net 263.net MX preference = 10, mail exchanger = mx11.263.net 263.net MX preference = 10, mail exchanger = mx12.263.net 263.net MX preference = 40, mail exchanger = mx03.263.net 263.net MX preference = 10, mail exchanger = mx01.263.net 没有错了。就是这个了。后来因为不知道怎么实现 nslookup 的功能,就放弃了,学了 半个多月的 C#。后来偶然在网上查找到了一些相关的文档。几次实验。把我的开发过程拿 过来分享,我第一次写教程性文档。所以不规范之处,请大家包涵。本文涉及的域名、邮箱 及 IP 均为真实的。
好家伙,是什么鬼画符! 其中最上边是位的数字标识,0-15(注意,后边的 10-15 写成上下的形式了,一开始 我楞没看懂)。 接下来是: ID:占 16 位,2 个字节。此报文的编号,由客户端指定。DNS 回复时带上此标识,以 指示处理的对应请应请求。 QR:占 1 位,1/8 字节。0 代表查询,1 代表 DNS 回复 Opcode:占 4 位,1/2 字节。指示查询种类:0:标准查询;1:反向查询;2:服务器状态查 询;3-15:未使用。 AA:占 1 位,1/8 字节。是否权威回复。 TC:占 1 位,1/8 字节。因为一个 UDP 报文为 512 字节,所以该位指示是否截掉超过 的部分。
查询的过程一般是:客户向 DNS 服务器的 53 端口发送 UDP 报文,DNS 服务器收到 后进行处理,并把结果记录仍以 UDP 报文的形式返回过来。
此 UDP 报文的一般格式:
+---------------------+ | 报文头 |
+---------------------+ | 问题 | 向服务器提出的查询部分 +---------------------+ | 回答 | 服务器回复的资源记录 +---------------------+ | 授权 | 权威的资源记录 +---------------------+ | 格外的 | 格外的资源记录 +---------------------+
QNAME:不定长,表示要查询的域名。(两边的方框用 / 来表示不定长) QTYPE:2 字节,根据 RFC1035 及 nslookup 的帮助文档,我定义以下枚举类型: enum QueryType //查询的资源记录类型。 { A=0x01, //指定计算机 IP 地址。 NS=0x02, //指定用于命名区域的 DNS 名称服务器。 MD=0x03, //指定邮件接收站(此类型已经过时了,使用 MX 代替) MF=0x04, //指定邮件中转站(此类型已经过时了,使用 MX 代替) CNAME=0x05, //指定用于别名的规范名称。 SOA=0x06, //指定用于 DNS 区域的“起始授权机构”。 MB=0x07, //指定邮箱域名。 MG=0x08, //指定邮件组成员。 MR=0x09, //指定邮件重命名域名。 NULL=0x0A, //指定空的资源记录 WKS=0x0B, //描述已知服务。 PTR=0x0C, //如果查询是 IP 地址,则指定计算机名;否则指定指向其它信息的指针。 HINFO=0x0D, //指定计算机 CPU 以及操作系统类型。 MINFO=0x0E, //指定邮箱或邮件列表信息。 MX=0x0F, //指定邮件交换器。