1、DNS
域名系统(英文:Domain Name System,缩写:DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用UDP端口53。当前,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
该系统用于命名组织到域层次结构中的计算机和网络服务。在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成。
DNS协议运行在UDP协议之上,使用端口号53。在传输层TCP提供端到端可靠的服务,在UDP端提供尽力交付的服务。其控制端口作用于UDP端口53。
在架设dns服务器时,linux系统需要在防火墙规则中内加入UDP端口53的外网访问,windows系统需要在防火墙里添加端口,选择UDP,输入端口号53,如果使用服务器安全狗等防火墙,请添加53端口在UDP的完全访问,例外中去掉127.0.0.1即可。
2、域名解析流程
当一个用户在地址栏输入www.taobao.com时,DNS解析有大致十个过程,如下:
(1)浏览器先检查自身缓存中有没有被解析过的这个域名对应的ip地址,如果有,解析结束。同时域名被缓存的时间也可通过TTL属性来设置。
(2)如果浏览器缓存中没有(专业点叫还没命中),浏览器会检查操作系统缓存中有没有对应的已解析过的结果。而操作系统也有一个域名解析的过程。在windows中可通过c盘里一个叫hosts的文件来设置,如果你在这里指定了一个域名对应的ip地址,那浏览器会首先使用这个ip地址。但是这种操作系统级别的域名解析规程也被很多黑客利用,通过修改你的hosts文件里的内容把特定的域名解析到他指定的ip地址上,造成所谓的域名劫持。所以在windows7中将hosts文件设置成了readonly,防止被恶意篡改。
(3)如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了。
(4)如果LDNS仍然没有命中,就直接跳到Root Server 域名服务器请求解析
(5) 根域名服务器返回给LDNS一个所查询域的主域名服务器(gTLD Server,国际顶尖域名服务器,如.com .cn .org等)地址
(6)此时LDNS再发送请求给上一步返回的gTLD
(7)接受请求的gTLD查找并返回这个域名对应的Name Server的地址,这个Name Server就是网站注册的域名服务器
(8)Name Server根据映射关系表找到目标ip,返回给LDNS
(9)LDNS缓存这个域名和对应的ip
(10) LDNS把解析的结果返回给用户,用户根据TTL值缓存到本地系统缓存中,域名解析过程至此结束
3、DNS报文格式解析
DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同。DNS 报文格式如图所示。
DNS报文格式分为DNS查询和响应的报文格式。这个报文由12字节长的首部和4个长度可变的字段组成。报文中问题字段是由客户填入的,由服务器返回问题的回答、授权和附加信息字段。
上图中显示了 DNS 的报文格式。其中,事务 ID、标志、问题计数、回答资源记录数、权威名称服务器计数、附加资源记录数这 6 个字段是DNS的报文首部,共 12 个字节。
整个 DNS 格式主要分为 3 部分内容,即基础结构部分、问题部分、资源记录部分。
3.1、基础结构部分
DNS 报文的基础结构部分指的是报文首部,如图所示。

该部分中每个字段含义如下:
- 事务 ID:DNS 报文的 ID 标识。对于请求报文和其对应的应答报文,该字段的值是相同的。通过它可以区分 DNS 应答报文是对哪个请求进行响应的。
- 标志:DNS 报文中的标志字段。
- 问题计数:DNS 查询请求的数目。
- 回答资源记录数:DNS 响应的数目。
- 权威名称服务器计数:权威名称服务器的数目。
- 附加资源记录数:额外的记录数目(权威名称服务器对应 IP 地址的数目)。
基础结构部分中的标志字段又分为若干个字段,如图所示:

标志字段中每个字段的含义如下:
- QR(Response):查询请求/响应的标志信息。查询请求时,值为 0;响应时,值为 1。
- Opcode:操作码。其中,0 表示标准查询;1 表示反向查询;2 表示服务器状态请求。
- AA(Authoritative):授权应答,该字段在响应报文中有效。值为 1 时,表示名称服务器是权威服务器;值为 0 时,表示不是权威服务器。
- TC(Truncated):表示是否被截断。值为 1 时,表示响应已超过 512 字节并已被截断,只返回前 512 个字节。
- RD(Recursion Desired):期望递归。该字段能在一个查询中设置,并在响应中返回。该标志告诉名称服务器必须处理这个查询,这种方式被称为一个递归查询。如果该位为 0,且被请求的名称服务器没有一个授权回答,它将返回一个能解答该查询的其他名称服务器列表。这种方式被称为迭代查询。
- RA(Recursion Available):可用递归。该字段只出现在响应报文中。当值为 1 时,表示服务器支持递归查询。
- Z:保留字段,在所有的请求和应答报文中,它的值必须为 0。
- rcode(Reply code):返回码字段,表示响应的差错状态。当值为 0 时,表示没有错误;当值为 1 时,表示报文格式错误(Format error),服务器不能理解请求的报文;当值为 2 时,表示域名服务器失败(Server failure),因为服务器的原因导致没办法处理这个请求;当值为 3 时,表示名字错误(Name Error),只有对授权域名解析服务器有意义,指出解析的域名不存在;当值为 4 时,表示查询类型不支持(Not Implemented),即域名服务器不支持查询类型;当值为 5 时,表示拒绝(Refused),一般是服务器由于设置的策略拒绝给出应答,如服务器不希望对某些请求者给出应答。
基础部分格式:
字段 | 长度 | 描述 |
---|---|---|
ID | 16 bit | 标识字段,客户通过标识字段来确定DNS响应是否与查询请求匹配。 |
QR | 1 bit | 操作类型:
|
OPCODE | 4 bit | 查询类型:
反向查询是客户端请求服务器根据回答生成导致此回答的问题,这个查询类型的使用并不多。 |
AA | 1 bit | 若置位,则表示该域名解析服务器是授权回答该域的。 |
TC | 1 bit | 若置位,则表示报文被截断。 使用UDP传输时,应答的总长度超过512字节时,只返回报文的前512个字节内容。 |
RD | 1 bit | 客户端希望域名解析服务器采取的解析方式:
|
RA | 1 bit | 域名解析服务器采取的解析方式:
|
Z | 3 bit | 全部置0,保留未用。 |
RCODE | 4 bit | 响应类型:
|
QDCOUNT | 16 bit | 无符号16位整数表示报文请求段中的问题记录数。 |
ANCOUNT | 16 bit | 无符号16位整数表示报文回答段中的回答记录数。 |
NSCOUNT | 16 bit | 无符号16位整数表示报文授权段中的授权记录数。 |
ARCOUNT | 16 bit | 无符号16位整数表示报文附加段中的附加记录数。 |
3.2、问题部分
问题部分指的是报文格式中查询问题区域(Queries)部分。该部分是用来显示 DNS 查询请求的问题,通常只有一个问题。该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类。
问题部分格式如图所示:

该部分中每个字段含义如下:
- 查询名:一般为要查询的域名,有时也会是 IP 地址,用于反向查询,以0长度和空字符串来表示域名结束。
- 查询类型:DNS 查询请求的资源类型。通常查询类型为 A 类型,表示由域名获取对应的 IP 地址。
- 查询类:地址类型,通常为互联网地址,值为 1。
字段 | 长度 | 描述 |
---|---|---|
查询名 | 变长 | 域名被编码为一些labels序列,每个labels包含一个字节表示后续字符串长度,以及这个字符串,以0长度和空字符串来表示域名结束。注意这个字段可能为奇数字节,不需要进行边界填充对齐。 |
查询类型 | 2个字节 | 表示查询类型,.取值可以为任何可用的类型值,以及通配码来表示所有的资源记录。 |
查询类 | 2个字节 | 表示查询的协议类,比如,IN代表Internet。 |
3.3、资源记录部分(DNS响应时才有)
资源记录部分是指 DNS 报文格式中的最后三个字段,包括回答问题区域字段、权威名称服务器区域字段、附加信息区域字段。这三个字段均采用一种称为资源记录的格式,格式如图所示:

资源记录格式中每个字段含义如下:
- 域名:DNS 请求的域名。
- 类型:资源记录的类型,与问题部分中的查询类型值是一样的。
- 类:地址类型,与问题部分中的查询类值是一样的。
- 生存时间:以秒为单位,表示资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间。它同时也可以表明该资源记录的稳定程度,稳定的信息会被分配一个很大的值。
- 资源数据长度:资源数据的长度。
- 资源数据:表示按查询段要求返回的相关资源记录的数据。
应答,授权,附加段都共用相同的格式:多个资源记录,资源记录的个数由报文头段中对应的几个数值确定,每个资源记录格式如下:
字段 | 长度 | 描述 |
---|---|---|
NAME | 不定长 | 资源记录包含的域名。 |
TYPE | 2个字节 | 表示资源记录的类型,指出RDATA数据的含义。 |
CLASS | 2个字节 | 表示RDATA的类。 |
TTL | 4字节 | 无符号整数,表示资源记录可以缓存的时间。0代表只能被传输,但是不能被缓存。 |
RDLENGTH | 2个字节 | 无符号整数,表示RDATA的长度。 |
RDATA | 不定长 | 字符串,表示记录,格式跟TYPE和CLASS有关。比如,TYPE是A,CLASS是IN,那么RDATA就是一个4个字节的ARPA网络地址。 |
4、DNS查询报文实例
//测试程序 #include <stdio.h> #include <sys/socket.h> #include <netdb.h> #include <string.h> #include <arpa/inet.h> int main() { struct hostent *hptr = NULL; char str[32]; const char * ptr = "www.baidu.com"; if( (hptr = gethostbyname(ptr) ) == NULL ) //得到域名相关信息,失败返回NULL { printf("gethostbyname error : %s\n", hstrerror(h_errno)); //打印错误字符串 return -1; } struct sockaddr_in me; int i = 0; for (; hptr->h_addr_list[i]; i++) //h_addr_list[i]中有多个ip,则h_addr_list[i]不为空 { memset(&me, 0, sizeof(struct sockaddr_in)); memcpy(&me.sin_addr, hptr->h_addr_list[i], hptr->h_length); printf("address:%s\n", inet_ntop(hptr->h_addrtype, &me.sin_addr, str, sizeof(str))); printf("hptr->h_name:%s\n", hptr->h_name); printf("me.sin_addr.s_addr [%u]\n", ntohl(me.sin_addr.s_addr)); //网络序转换成主机序 printf("\n"); } return 0; }
4.1、DNS 请求数据包报文
图中的数据包为 DNS 查询请求包,查询请求包只包含基础结构部分和查询问题区域,为了方便讲解这里将信息列出进行说明:
Frame 60: 103 bytes on wire (824 bits), 103 bytes captured (824 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: VMware_c9:23:23 (00:0c:29:c9:23:23), Dst: HuaweiDe_05:07:1d (04:f1:69:05:07:1d) Internet Protocol Version 4, Src: 192.168.1.102, Dst: 192.168.1.1 User Datagram Protocol, Src Port: 48591, Dst Port: 53 Domain Name System (query) Transaction ID: 0x271c #事务ID Flags: 0x0000 Standard query #报文中的标志字段 0... .... .... .... = Response: Message is a query #QR字段, 值为0, 因为是一个请求包 .000 0... .... .... = Opcode: Standard query (0) #Opcode字段, 值为0, 因为是标准查询 .... ..0. .... .... = Truncated: Message is not truncated #TC字段 .... ...0 .... .... = Recursion desired: Don't do query recursively #RD字段 .... .... .0.. .... = Z: reserved (0) #保留字段, 值为0 .... .... ...0 .... = Non-authenticated data: Unacceptable #保留字段, 值为0 Questions: 1 #问题计数, 这里有1个问题 Answer RRs: 0 #回答资源记录数 Authority RRs: 0 #权威名称服务器计数 Additional RRs: 0 #附加资源记录数 Queries #问题部分 www.baidu.com: type A, class IN Name: www.baidu.com #查询名字段, 这里请求域名baidu.com [Name Length: 13] [Label Count: 3] Type: A (Host Address) (1) #查询类型字段, 这里为A类型 Class: IN (0x0001) #查询类字段, 这里为互联网地址 [Response In: 18]
这里需要注意的是,在请求中 Questions 的值不可能为 0;Answer RRs,Authority RRs,Additional RRs 的值都为 0,因为在请求中还没有响应的查询结果信息。这些信息在响应包中会有相应的值。
4.2、 DNS 响应数据包报文
(1)基础结构部分
Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 #事务ID Flags: 0x8180 Standard query response, No error #报文中的标志字段 1... .... .... .... = Response: Message is a response #QR字段, 值为1, 因为是一个响应包 .000 0... .... .... = Opcode: Standard query (0) # Opcode字段 .... .0.. .... .... = Authoritative: Server is not an authority for domain #AA字段 .... ..0. .... .... = Truncated: Message is not truncated #TC字段 .... ...1 .... .... = Recursion desired: Do query recursively #RD字段 .... .... 1... .... = Recursion available: Server can do recursive queries #RA字段 .... .... .0.. .... = Z: reserved (0) .... .... ..0. .... = Answer authenticated: Answer/authority portion was not authenticated by the server .... .... ...0 .... = Non-authenticated data: Unacceptable .... .... .... 0000 = Reply code: No error (0) #返回码字段 Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries Answers Authoritative nameservers Additional records [Request In: 53] [Time: 0.048977000 seconds]
以上输出信息中加粗部分为 DNS 响应包比请求包中多出来的字段信息,这些字段信息只能出现在响应包中。在输出信息最后可以看到 Answer RRs,Authority RRs,Additional RRs 都有了相应的值(不一定全为 0)。
(2)查询问题区域
Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 Flags: 0x8180 Standard query response, No error Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries #问题部分 www.baidu.com: type A, class IN Name: www.baidu.com #查询名字段, 这里请求域名baidu.com [Name Length: 13] [Label Count: 3] Type: A (Host Address) (1) #查询类型字段, 这里为A类型 Class: IN (0x0001) #查询类字段, 这里为互联网地址 Answers Authoritative nameservers Additional records [Request In: 53] [Time: 0.048977000 seconds]

Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 Flags: 0x8180 Standard query response, No error Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries Answers #“回答问题区域”字段 www.baidu.com: type CNAME, class IN, cname www.a.shifen.com Name: www.baidu.com Type: CNAME (Canonical NAME for an alias) (5) Class: IN (0x0001) Time to live: 1036 (17 minutes, 16 seconds) Data length: 15 CNAME: www.a.shifen.com www.a.shifen.com: type A, class IN, addr 14.215.177.38 #资源记录部分 Name: www.a.shifen.com #域名字段 Type: A (Host Address) (1) #类型字段, 这里为A类型 Class: IN (0x0001) #类字段 Time to live: 600 (10 minutes) #生存时间 Data length: 4 #数据长度 Address: 14.215.177.38 #资源数据, 这里为IP地址 www.a.shifen.com: type A, class IN, addr 14.215.177.39 Name: www.a.shifen.com Type: A (Host Address) (1) Class: IN (0x0001) Time to live: 600 (10 minutes) Data length: 4 Address: 14.215.177.39 Authoritative nameservers Additional records [Request In: 53] [Time: 0.048977000 seconds]
(4)权威名称服务器区域
Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 Flags: 0x8180 Standard query response, No error Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries Answers Authoritative nameservers #“权威名称服务器区域”字段 a.shifen.com: type NS, class IN, ns ns5.a.shifen.com #资源记录部分 Name: a.shifen.com Type: NS (authoritative Name Server) (2) #类型字段, 这里为NS类型 Class: IN (0x0001) Time to live: 1138 (18 minutes, 58 seconds) Data length: 6 Name Server: ns5.a.shifen.com #权威名称服务器 a.shifen.com: type NS, class IN, ns ns3.a.shifen.com a.shifen.com: type NS, class IN, ns ns1.a.shifen.com a.shifen.com: type NS, class IN, ns ns2.a.shifen.com a.shifen.com: type NS, class IN, ns ns4.a.shifen.com Additional records [Request In: 53] [Time: 0.048977000 seconds]
(5)附加信息区域字段
Frame 57: 302 bytes on wire (2416 bits), 302 bytes captured (2416 bits) on interface \Device\NPF_{CFE29DA0-6701-4126-9A0F-273DF6D359B2}, id 0 Ethernet II, Src: HuaweiDe_05:07:1d (04:f1:69:05:07:1d), Dst: VMware_c9:23:23 (00:0c:29:c9:23:23) Internet Protocol Version 4, Src: 192.168.1.1, Dst: 192.168.1.102 User Datagram Protocol, Src Port: 53, Dst Port: 48591 Domain Name System (response) Transaction ID: 0x1bd2 Flags: 0x8180 Standard query response, No error Questions: 1 Answer RRs: 3 Authority RRs: 5 Additional RRs: 5 Queries Answers Authoritative nameservers Additional records #“附加信息区域”字段 ns5.a.shifen.com: type A, class IN, addr 180.76.76.95 #资源记录部分 Name: ns5.a.shifen.com #“权威名称服务器”名称 Type: A (Host Address) (1) #类型字段, 这里为A类型 Class: IN (0x0001) Time to live: 426 (7 minutes, 6 seconds) Data length: 4 Address: 180.76.76.95 #“权威名称服务器”的IP地址 ns1.a.shifen.com: type A, class IN, addr 110.242.68.42 ns2.a.shifen.com: type A, class IN, addr 220.181.33.32 ns3.a.shifen.com: type A, class IN, addr 112.80.255.253 ns4.a.shifen.com: type A, class IN, addr 14.215.177.229 [Request In: 53] [Time: 0.048977000 seconds]
其中,Name 的值为“权威名称服务器”名称,Type 的值为 A,表示获取域名对应的 IP 地址;Address 的值显示了所有获取到的权威名称服务器对应的 IP 地址。