DNS查询

更新时间:April 25, 2018

作者:Windson Yang

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处(www.enginego.org)。

当你在浏览器输入www.apple.com。按下回车之后,浏览器跳到苹果的官网,把iPhoneX的介绍和图片显示出来。浏览器是如何通过www.apple.com这个域名找到iPhone的内容并且正确显示呢?第一步就要经过DNS查询

域名browser

  1. DNS查询
  2. 为什么要使用域名?
  3. Q&A

DNS查询

DNS查询其实很好理解,生活上比较贴近的例子就是使用通讯录,我们通常能够记住自己的电话号码,不过要找其他人的电话,一般都需要通过通讯录。我们输入朋友的名字,通讯录就会找到对应的电话号码。在这里,通讯录担任了把难记的电话号码转成好记的人名的工作。DNS查询其实也一样。互联网刚开始发展的时候,联网的电脑加起来才几千台(没错~)。每台电脑都需要保存一个文件(称为hosts文件)用作记录域名对应哪个IP地址(就像通讯录记录人名对应哪个电话号码)。

www.enginego.org 104.24.120.11(每一行分别对应着域名和IP地址)
www.apple.com 119.145.144.223
www.ieee.org  23.38.177.118

当我们在浏览器输入域名的时候,浏览器会先查询hosts文件,找到该域名对应的IP地址。然后再通过IP地址获取到服务器里面的内容,也就是iPhoneX的简介和图片。

为什么要使用域名?

  1. 容易记忆

    计算机比较擅长处理数字,但是人类就差多了,访问苹果官网要背那么多数字显然不现实。使用域名就像我们使用手机的通讯录一样,我们会为常用的电话号码添加联系人姓名,打电话的时候直接输入名字就可以拨打,不需要背电话号码。

  2. 容易扩展

    早期的计算机和IP地址是一一对应的关系,但是一台计算机的性能并不能承受大量用户的请求。而一个域名可以背后可以对应多个IP地址。通过给不同地区的用户分配不同的IP地址,公司就能使用多台服务器来提供服务了。

不过问题随着互联网的发展慢慢显现了,如果只是靠一个hosts文件会出现几个问题。

  1. 每个小时都有新的域名被注册,新的主机加入互联网,主机数量太多了,现在已经超过10亿台设备接入互联网,如果每次查询的话都要从文件中找到对应的IP地址,那么速度会非常慢,hosts文件也会很大。
  2. 大部分的网站用户根本不会上,就像大部分联系人一样。每上线一个小网站就要求全球的电脑都进行更新这样显然小题大做了。

更新hosts

很可惜,这是治标不治本的方法。那么有什么方法可以解决这个问题呢?

现在DNS查询会经过3个步骤,一旦查询到结果,就会跳过剩下的步骤:

  1. 先查询浏览器有没有保留缓存

    如果你之前访问过这个网站,那么浏览器会网站保存对应的IP地址,这样就能减少查询IP地址的时间。

  2. 查询本地的hosts文件

    如果hosts文件有对应的内容,例如上面的

    www.apple.com 119.145.144.223
    

    那么计算机就会直接使用这个IP地址,你可以查看自己电脑的hosts文件,不同系统分别存储在不同的位置

    Windows
    c:\windows\system32\drivers\etc\hosts
    
    macOS
    /etc/hosts
    
  3. DNS服务器查询

    当计算机在前两个方法都没有找到对应的IP地址,就会进行DNS服务器查询,它会发送一个UDP请求到最近的子域名服务器(默认是ISP运营商提供,在国内就是中国电信,中国联通,中国移动这几家),从它们中获取到IP地址。如果找不到的话就查询根域名服务器,子域名服务器会定时从根域名服务器中获取最新的内容域名和IP的对应关系。

经过这三部,我们只需要记住某个网站的域名,就能获取到该网站的IP地址了。

Q&A

  • Q: 那么是不是破坏这13组根域名服务器就能破坏互联网的查询功能呢?例如让别人输入苹果的域名却跳到一个其他的网站呢?

    A: 是的。但是很遗憾它分布在全世界各个地区,很难同时攻击它们 :D

  • Q: 如果浏览器通过DNS查询到苹果的IP地址,那么我直接访问这个IP地址是不是就能访问到苹果的官网呢?

    A: 很遗憾地说,在现在的互联网经过多层的设计以及代理,所以大部分情况下是不可以的。