DNS协议概述

《Linux高性能服务器编程》阅读笔记:

1. DNS工作原理

  通常情况下我们要访问某个网站,使用的是该网站所在机器的域名,而不是直接使用其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字节

2. Linux下访问DNS服务器

  要访问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地址。

3. 通过tcpdump抓取DNS数据包

  在Linux系统中运行host命令以查询www.baidu.com对应的IP地址,并在另一终端抓取这一过程中LAN上传输的以太网帧。

$ sudo tcpdump -i eth0 -nt -s 500 port domain

这里写图片描述

  在另一终端中,向DNS服务器发送请求:

$ host -t A www.baidu.com

这里写图片描述

  回到tcpdump的终端下:
这里写图片描述

  (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字节

  tcpdump命令还可以开启-x选项,这样能看到DNS报文中的每一个字节:
这里写图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值