关于DNS协议的记录

初识DNS协议,一个前端常用应用层协议

DNS概念及特征

DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议主要有以下特点:

  • 运行在UDP协议之上(但是当请求字节过长超过512字节时用TCP协议,将其分割成多个片段传输
  • 使用端口号53
  • 浏览器的DNS缓存:
    1. chrome 对每个域名会默认缓存60s;
    2. IE 将DNS缓存30min;
    3. Firefox 默认缓存时间只有1分钟;
    4. Safari 约为10S

DNS域名结构

DNS域名结构图

*注意:最开始的域名最后都是带了点号的,比如 baidu.com 以前的话应该是 baidu.com. ,最后面的点号表示根域名服务器,后来发现所有的网址都要加上最后的点,就简化了写法,干脆所有的都不加,但是你在网址后面加上点号也是可以正常解析的。*


DNS域名服务器

域名服务器,实际上就是装有域名系统的主机。可分为以下几个大类:

  • 根域名服务器
    最高层次的域名服务器,也是最重要的域名服务器,本地域名服务器如果解析不了域名就会向根域名服务器求助。全球共有13个不同IP地址的根域名服务器,它们的名称用一个英文字母命名,从a一直到m。这些服务器由各种组织控制,并由 ICANN(互联网名称和数字地址分配公司)授权,由于每分钟都要解析的名称数量多得令人难以置信,所以实际上每个根服务器都有镜像服务器,每个根服务器与它的镜像服务器共享同一个 IP 地址,中国大陆地区内只有6组根服务器镜像(F,I(3台),J,L)。当你对某个根服务器发出请求时,请求会被路由到该根服务器离你最近的镜像服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和地址,如果向根服务器发出对 “jocent.me” 的请求,则根服务器是不能在它的记录文件中找到与 “jocent.me” 匹配的记录。但是它会找到 “me” 的顶级域名记录,并把负责 “me” 地址的顶级域名服务器的地址发回给请求者。
  • 顶级域名服务器
    负责管理在该顶级域名服务器下注册的二级域名。当根域名服务器告诉查询者顶级域名服务器地址时,查询者紧接着就会到顶级域名服务器进行查询。比如还是查询”jocent.me”,根域名服务器已经告诉了查询者“me”顶级域名服务器的地址,“me”顶级域名服务器会找到 “jocent.me”的域名服务器的记录,域名服务器检查其区域文件,并发现它有与 “jocent.me” 相关联的区域文件。在此文件的内部,有该主机的记录。此记录说明此主机所在的 IP 地址,并向请求者返回最终答案。
  • 权限域名服务器
    负责一个区的域名解析工作DNS域名解析结构
  • 本地域名服务器
    当一个主机发出DNS查询请求的时候,这个查询请求首先就是发给本地域名服务器的。

域名解析过程

  1. 本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名(递归查询)
  2. 本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址(迭代查询)

递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询


DNS协议报文格式

DNS协议报文格式

Queries区域的查询类型的值主要有以下几种:

类型助记符说明
1A由域名获得IPv4地址
2NS查询域名服务器(返回保存下一级域名信息的服务器地址。该记录只能设置为域名,不能设置为IP地址)
5CNAME查询规范名称(返回另一个域名,即当前查询的域名是另一个域名的跳转)
6SOA开始授权
11WKS熟知服务
12PTR逆向查询,把IP地址转换成域名
13HINFO主机信息
15MX邮件交换
28AAAA由域名获得IPv6地址
252AXFR传送整个区的请求
255ANY所有记录的请求

Tips: PTR逆向查询的一个应用,是可以防止垃圾邮件,即验证发送邮件的IP地址,是否真的有它所声称的域名。


DNS相关的命令

  • Windows环境下清空DNS缓存的命令是 ipconfig/flushdns 也可以通过重启DNS client 和 DHCP client 两项服务清空DNS缓存
  • Windows环境下可以用命令 ipconfig /displaydns 来查看DNS缓存的内容
  • nslookup 命令可以用来查看域名对应的IP地址,比如 nslookup jocent.me