域名和DNS

怎么找到一个网站?先找到他的IP:)

我们在浏览网站时,计算机和Internet是怎么知道我们想要找的是哪个网站呢?怎么知道我要找的是www.badibu.com而不是www.baidu.com呢?计算机又不识字…

计算机和网络虽然不识字,但是知道IP的,就是123.234.12.89这种东西。如果知道IP,通过复杂的IP协议,计算机(客户端)就可以把“我们需要浏览xxx网站的yyy网页”这种信息正确投递给响应的计算机(服务端),并返回响应结果。而在此之前,需要做的事情就是把www.badibu.com翻译成对应的IP地址11.22.33.44。这个过程就是DNS解析。

DNS解析有点类似于查字典。大家对www.badibu.com这种方式的地址已经司空见惯,而事实上该地址还有个省略的’.’,其实真实地址是www.badibu.com.。 其组织方式是很geek的,翻转一下该地址就成了 .com.badibu.www,按.分隔的话就是./com/badibu/www,变成了几个域的组成。根域是.,下面管着com,net,cn,org这种顶级域名,接着就到了sina.com, baidu.com这种大网站级别的域名了。自然地,当需要解析某个具体的网址域名时,会根据上面的域路径逐层解析,根据.域的DNS解析拿到对应的.com的DNS解析对应的服务IP,再根据该IP进一步解析xxx.com的DNS,直至某个DNS解析服务告诉上级请求,这里有目标网址的具体IP记录,就不要再查下去了,返回给查询者即可。这个过程可参考下图

DNS正向解析

我的博客网站还是个小网站,没办法把自己加到上图中的递归查询去,这个时候域名商的DNS服务或者第三方托管DNS服务就跳出来帮忙了。他们帮我们把域名放到上图的递归查询的某一环里。像name.com就可以把委托其注册的网址按配置登记记录,从而让全世界的人都可以正确解析到我们的网址IP。当然你也可以使用第三方如dnspod等来登记记录,帮助解析。

真实的DNS查询比这要复杂得多

仅仅这样的话,虽然是可以了,但从技术角度来说还有很多问题,最大的问题便是开销和速度。我们每天的请求无数,若每次都这么递归查询一遍,那根本没法玩。于是又有了DNS缓存技术来解决这一问题。我们在查询网站IP时是可以逐层缓存的,能不麻烦上级就不麻烦上级,这样既减小开销也加快了查询速度。基本流程类似下图
DNS解析&缓存

这些DNS解析及缓存服务从本地host记录到小区宽带运营商,到电信/移动运营商,再到全internet的顶级运营商们,再到各个子域名子网站的对应DNS解析,整体上形成了一个自底向上,又自上而下地查询链弧,最终拿到你的网址对应的IP。这个过程是复杂,冗长和易错的,尤其如上图加上各种墙之后。

当某些人想不让你正确访问某个网址时,所需要做的最简单的事儿就是破坏如上的这种DNS解析。在其中任意环境加入曲解,把你的网址曲解或者阻挡,“DNS污染”和“DNS劫持”便是其中的手段之二。

而如果你是技术人员,在写代码时,会使用到类似gethostbyname()这种函数来获取网站对应的IP,这个时候就要注意了。按上述描述,这个过程有可能很长,也可能很短(缓存命中了),是个时间不确定的网络阻塞请求,所以该函数是可能会阻塞住的,甚至阻塞很长时间…。我曾经解过的一个bug里,有人在自己的内网程序中使用了该函数,当用户每次请求时都会调用一次,而这意味着每次都要去请求一次内网假设的DNS服务,堵住的风险很高,导致请求的响应时间很不稳定,大大影响用户体验。

作为站点,怎么设置记录以供查询呢?

前文提到,可以通过设置域名商/第三方DNS服务商的DNS记录来帮助登记记录。DNS记录包含以下几种格式:

  • A记录

    • 主机记录,绑定登记域名和对应IP,形式和host文件类似,这也是我们常用的记录,以name.com上的为例
a-records.png
这里有2种稍微高级一点的用法,一种是泛记录,在host里填入 * .badibu.com,则将任意的badibu下的二级域名绑定到该IP上

还有一种则是负载轮询,把多个IP绑定到同一host上,则大家访问该host时会随机轮询,这种可用在主页这种高访问高可用的站点上
  • MX记录

    • 专用的mail记录,电子邮件在互联网的早期是重要概念!在今天看来有点不可思议,会为了电子邮件有专门的协议和DNS记录等。这个小网站用得少,就不多说了。如果你想有自己的邮箱服务,则需要用到它。
  • NS记录

    • DNS解析记录,用于指定网站的DNS解析服务器。若你的网站的子域名比较多,尤其是不只是一台机器时,这个时候就需要一个DNS服务了,像sina,baidu这种中大型网站都会去设置这记录,而个人网站看自己兴趣了。
  • SOA记录

    • 起始授权机构记录。NS的NS,这里不赘述,小网站难用到。
  • CNAME记录

    • 别名指向,这个是个很有趣的记录。它主要用处是隔离站点和IP的变更。我们可以把某个域名作为主域名,其他域名都指向该域名。这样就可以统一管理/变更这些域名的IP了。当你注册了多个网址却只有一台服务器时,用它来管理则事半功倍。
  • AAAA记录

    • A记录的IPv6版,现在IPv6用的越来越多,可以试试这个了。
  • SRV记录

    • 作用是说明一个服务器能够提供什么样的服务,很新很小众的一个概念。有点像是微软强塞进来的概念,给活动目录用(Active Directory)用。

有时间再把DNS服务设置再串起来讲一下,我们事实是可以设置局域网或者站点的DNS解析的,这样的话就灵活控制了网内的网址路由和子站点管理。

参考

http://blog.chinaunix.net/uid-28216282-id-3757849.html

http://www.chinaz.com/web/2010/0708/119675_2.shtml