“DNS”这个单字,想必那些经常使用计算机,尤其是经常手动配置IP和DNS服务器的人是非常熟悉的。也许其中的大部分人并没有深入了解过它的具体意义,只是对它有个简单的了解,然后习惯性地将主DNS服务器和备DNS服务器配置成 114.114.114.114 和 8.8.8.8 (因为比较好记忆~~)。
最近在做与路由器DNS功能相关的项目,所以就深入学习了下DNS的内容。同时在这过程中,写下一些文字,一方面是自己的一种总结,另一方面也是希望通过这一个平台,跟其他人进行交流提高。
DNS 的全称是 Domain Name System(域名系统,或者常称为域名解析系统)。
我们在上网的时候,经常要通过浏览器去访问一些网站,实际上就是访问网站所在的服务器IP地址,但是让用户记住设备的IP地址是非常困难的。我们常用的方式就是在浏览器中输入要访问的网址链接(例如 www.example.com),然后浏览器就会通过解析这个域名地址,找到要访问的服务器,从而读取到需要访问的网站的数据。所以我们在因特网上,构建了域名和IP地址互相映射的分布式数据库,在IP地址和域名之间形成一种转换和查询机制。
所以,DNS工作的过程可以简单描述为:域名地址经过DNS服务器解析后,得到对应的IP地址,通过该IP地址访问到服务器获取我们要访问的内容。
DNS通信主要使用UDP,TCP为辅,使用端口号53。当然,端口号可以修改,但是默认是使用53端口;在某些情况下,也会采用TCP协议。DNS是网络分层里的应用层协议,事实上他是为其他应用层协议工作的。
如果上面通俗的解释让你理解了DNS是什么的话,那么再读一读下面比较官方的说法,也许你就能形成更加准确的认识。
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。
The Domain Name System (DNS) is a hierarchical decentralized naming system for computers, services, or other resources connected to the Internet or a private network. It associates various information with domain names assigned to each of the participating entities. Most prominently, it translates more readily memorized domain names to the numerical IP addresses needed for locating and identifying computer services and devices with the underlying network protocols. By providing a worldwide, distributed directory service, the Domain Name System is an essential component of the functionality on the Internet, that has been in use since 1985.
下面我们在将DNS里面经常涉及到的一些概念进行说明。后面会有文章对其中的一些概念作详细说明。
域名:IP地址对应的主机名。
label:域名由多个lable组成,label间常用符号"."连接。
DNS客户端:局域网内的用户程序(例如Ping、Tracert)向DNS Client发出请求,本地设备收到请求报文后,会向DNS Server发送查询报文。在收到DNS Server的应答报文后,本地会对报文进行解析,并决定下一步的操作,从而完成一次域名解析过程。
DNS代理:(DNS proxy)用来在DNS Client和DNS Server之间转发DNS请求和应答报文。局域网内的DNS Client把DNS proxy当作DNS Server,将DNS请求报文发送给DNS proxy。DNS proxy将该请求报文转发给真正的DNS Server,并将DNS Server的应答报文发送给DNS Client,从而实现域名解析。使用代理功能后,当DNS Server的地址发生变化时,只需要改变DNS proxy上的配置,无需改变整个局域网内每个DNS Client的配置,从而简化了网络管理。
DNS透明代理:可以修改部分DNS请求报文的目的地址,将其修改为其他ISP内的DNS服务器地址,DNS请求被转发到不同的ISP,解析后的Web服务器地址也就属于不同的ISP,所有上网流量将通过不同的ISP链路转发。这样就不会造成一个链路拥塞、其他链路却闲置的情况,充分利用了所有链路资源。
DDNS:(Dynamic Domain Name System动态域名系统)DNS仅提供了域名和IP地址之间的静态对应关系,当节点的IP地址发生变化时,DNS无法动态地更新域名和IP地址的对应关系。DDNS通过动态更新DNS服务器上域名和IP地址之间的对应关系,保证通过域名解析后得到正确的IP地址。
DNS64:将DNS查询信息中的A记录(ipv4地址)合成到AAAA记录(ipv6地址)中,返回合成的AAAA记录给ipv6侧用户。
细粒度订阅:发布端(Subscriber)提供按需的数据发布机制,订阅端只需要订阅其关系的数据,一旦订阅的数据发生变化,发布者将相关数据实时发布到相关的订阅端。
当一个应用需要把主机名解析为IP地址时,该应用进程就调用地址解析程序,它自己就变为了DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP方式先发给本地域名服务器,本地域名服务器在查找域名后,把对应的IP地址放在回答报文中返回,应用程序获得目的主机的IP地址后即可进行通信。若本地域名服务器不能回答该请求,则此域名服务器就暂时称为DNS的另一个客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。
当一个业务需要把域名解析为IP地址时,它就成为了DNS的一个客户端,调用地址解析程序,把待解析的域名加入到DNS请求报文中,通过UDP先发送给本地DNS服务器。本地DNS服务器查找得到对应的IP地址后,通过回应报文将该IP返回,客户端获得该IP地址后可继续后续操作。如果本地域名服务器不能回答该请求,则自身会称为一个新的DNS客户端,向其他DNS服务器发送请求报文。这个过程一直重复,直至得到回应报文为止。
如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户端的身份(递归思想),向根域名服务器继续发出查询报文(替主机查询),不让主机自己进行查询。递归查询返回的结果或者是IP,或者报错。这是从上到下的递归查询过程。
当根域名服务器收到本地域名服务器的查询请求,要么给出ip,要么通知本地域名服务器下一步应该去请求哪一个顶级域名服务器查询(并告知本地域名服务器自己知道的顶级域名的IP),让本地域名服务器继续查询,而不是替他查询。同理,顶级域名服务器无法返回IP的时候,也会通知本地域名服务器下一步向谁查询(查询哪一个权限域名服务器)……这是一个迭代过程。
实际使用中,DNS服务器会将接收到的DNS应答结果在本地缓存一段时间,直到数据老化才删除。当出现对相同域名的查询时,便可以通过缓存的结果直接进行回复,只有在本地缓存中找不到时才向DNS服务器发起查询请求。通过DNS缓存,大部分查询都只需要本地DNS服务器即可完成解析,可以提高效率。
当在浏览器内输入URL时,便开始了DNS解析过程,最后会把找到后的IP地址告知浏览器客户端,方便它继续发出 HTTP(s)请求。在这个过程中,浏览器提出的查询记录类型叫A记录(address)查询,主要是针对ipv4,如果是ipv6的化,就是AAAA。这个A记录意思是从域名解析得到IP地址。那么反过来,从IP地址得到域名的解析过程也需要一个记录,叫PTR记录(和A记录功能相反)。我们可以通过查询IP地址的PTR记录来得到该IP地址指向的域名,达到反查的目的。
域名系统中,一个IP地址可对应多个域名,在Internet上是不会去傻傻的遍历整个域名树的。故DNS的顶级域名提供了一个特别的顶级域——arpa用来做反向域名解析,也称为反向域名。当一个主机加入网络,获得DNS授权,它的IP地址假设为33.13.252.140,它也顺便获得了对应IP地址的 in-addr.arpa (逆向解析域in-addr.arpa)空间的授权,注意DNS名由树底部向上组织,故它的DNS名字为33.13.252.140.in-addr.arpa。IP地址的第一字节一定位于in-addr的下一级。这样把待解析的IP地址就会被表达成一种像域名一样的形式,后缀以反向解析域名"in-addr.arpa"结尾。这就是反向域名解析的本质。
1. 当用户在地址栏输入一个URL之后,浏览器首先查询浏览器的缓存;
2. 找不到就去查询Hosts文件和本地DNS缓存,如果hosts和本地DNS缓存都没有找到域名对应的IP,则自动进入路由器的缓存中检查;
3. 以上均为客户端DNS缓存,若在客户端DNS缓存还是没找到,则进入ISP DNS缓存中查询;
4. 还是找不到,最终才向根DNS 服务器发出 DNS 查询报文,再找不到就报错。
1. DNS 是基于 TCP 还是 UDP 的?端口号是多少?
2. 打开一个URL,在网络层面都发生了哪些事情?(当中说到了DNS原理,这个是绕不过的)
3. 什么是DNS劫持?