《Linux高性能服务器编程》阅读笔记:
通常情况下我们要访问某个网站,使用的是该网站所在机器的域名,而不是直接使用其IP地址。将机器域名转换为IP地址的过程,这就需要域名查询服务。常见的域名查询服务有NIS(Network Information Service, 网络信息服务)、本地静态文件和DNS。
DNS是一套分布式的域名服务系统,即有多个DNS服务器遍布于世界。每个DNS服务器上存放着大量的机器域名和IP地址的映射,并且是动态更新。众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。举例:有时候电脑的DNS服务器的地址没有设置好时,出现浏览器不可以访问网站,但是腾讯QQ可以上网聊天的情况。这是因为腾讯QQ客户端访问腾讯服务器时用的是IP地址而非域名,因此不需要DNS服务器进行域名查询服务,而浏览器上通过域名访问网站自然需要DNS服务器了。
DNS协议属于应用层的协议,它既可以使用TCP服务,也可以使用UDP服务:
(以太网帧中)DNS的查询和应答报文如下:
(1) 16位标识: 标记一堆DNS查询和应答,以区分哪一个DNS应答对应哪个DNS查询的回应
(2) 16位标志: 协商具体的通信方式和反馈通信状态。具体位如下:
a. QR: 查询/应答标志位,0表这是一个查询报文,1表示应答报文
b. opcode: 定义查询/应答的类型,0表标准查询,1表反向查询(由IP地址获得主机域名),2表请求服务器状态
c. AA: 授权应答标志,仅被应答报文使用。1表示该DNS服务商是授权服务器
d. TC: 截断标志,仅被应答报文使用。因为UDP数据报是有长度限制的,过长的DNS报文将被截断。为1表DNS报文超过512字节并被截断
e. RD: 递归查询标志,1表执行递归查询:若目标DNS服务器无法解析某个主机名,则它将向其他DNS服务器继续查询,如此递归,直至获得结果并返回给客户端;0表示迭代查询:若目标DNS服务器无法解析某个主机名,则将它自己知道的其他DNS服务器的IP地址返回给客户端,让客户端决定是否继续往向其他DNS发送请求。
f. RA:允许递归标志,仅被应答报文使用。1表示DNS支持服务器递归查询
g. ZERO: 这3位未使用,须设置为0
h. rcode: 4位返回码,表应答状态。0表无错误,3表域名不存在
对于查询报而言:
(3) 16位问题个数: 一般包含一个查询问题
(4) 16位应答资源个数、16位授权资源记录数目、16位额外资源记录数据: 查询报中至少为1;
对于应答报而言:
(3) 应答报文的应答资源记录数:至少为1,
(4) 授权资源、额外资源记录数据:可为0或非0
(5) 查询问题的格式为:
查询名以一定的格式封装了要查询的主机名,查询类型表如何执行查询操作:
a. 类型A,值是1:表获取目的主机的IP地址
b. 类型CNAME,值是5:表获得目标主机的别名
c. 类型PTR,值为12,表反向查询(通过IP地址获取域名)
查询类一般为1,表获取IP地址。
(6) 应答、授权和额外信息字段都使用资源记录(Resource Record, RR)格式:
(7) 域名、类型、类:资源对应的名字,格式和查询问题的格式一样
(8) 生存时间: 表该查询记录结果可被本地客户端缓存多长时间,单位是S
(9) 资源数据长度、资源数据:取决于类型字段。对于类型A,资源数据是32位的IPv4地址,资源数据长度为4字节
要访问DNS服务器,就需要先知道DNS服务器的IP地址。在Linux中,DNS服务器的IP地址存放在/etc/resolv.conf文件中。
IP地址分别表示首选DNS服务器地址(还可以多设置一个备用DNS服务器地址)。Linux系统中常用的访问DNS服务的客户端程序是host,利用host命令向首选DNS服务器查询www.baidu.com的IP:
$ host -t A www.baidu.com
可见,机器码www.baidu.com是www.a.shifen.com的别名,且该机器名对应两个IP地址。
命令-t选项是告诉DNS协议使用哪种查询类型,这里指定为A类型,即通过机器的域名获得其IP地址。
在Linux系统中运行host命令以查询www.baidu.com对应的IP地址,并在另一终端抓取这一过程中LAN上传输的以太网帧。
$ sudo tcpdump -i eth0 -nt -s 500 port domain
在另一终端中,向DNS服务器发送请求:
$ host -t A www.baidu.com
(1) 两个数据包开始的”IP”表明他们后面的内容描述的是IP数据包
(2) tcpdump是以”IP地址.端口号”的形式来描述通信的一端,”源端 > 目的端”。第一个数据包是请求包,第二个则是应答包
(3) DNS服务器使用的端口号是53
(4) 数值18482是DNS查询报文的标识值,因此该值也出现在应答包中,形成对应
(5) +表示启用递归查询,A?表示使用A类查询方式
(6) “www.baidu.com”是DNS查询问题中的查询名,数值31表查询报文的长度为31字节
(7) 3/0/0表示该应答包中有3个应答资源记录、0个授权记录和0个额外信息记录。
(8) “www.a.shifen.com., A 14.215.177.39, A 14.215.177.38”表3个应答资源记录的内容,其中CNAME表其后记录是及其的别名,A表其后记录的是IP地址,数值的90表应答报文长度为90字节