进一步理解 DNS

把空间移到了新浪的 SAE 了,一来是发现海外的空间速度实在慢,在体会过新浪 SAE 的六线接入的一点瞬开的效果之后,直接被秒杀了,另外, DNS 的域名解析也迁移到了 DNSPod ,在 DNSPod 上做了 301 的跳转,于是现在的效果是速度很快,但是 URL 很恶心,不过权衡之后,我还是觉得速度更重要。

说说新浪的 SAE ,SAE 的应用商店里面有专门改写过的 WordPress ,主要是数据库层面改写了,具体的还没有研究,不过这是稍晚的事,我现在的想法是想先读读 WordPress 的源码,昨天安装的时候,发现 WordPress 可以发邮件通知,虽然这不是什么很高深的功能,但是我倒是想到当时我的主机上好像没有主动开启 SMTP 服务啊,那么 PHP 的 mail 函数是怎么发出邮件的呢?于是决定就这个好好研究一下 PHP 的邮件模块。另外一个发现的就是 WordPress 的搜索功能支持空格的,数据库上我当然是没有做全文检索的,那么这个功能又是怎么实现的呢,我目前就只能想到用 SQL 的 like 来拼接,具体的实现还是要读源码啊。

说说 DNSPod ,我们知道,一次 HTTP 请求发起之后,客户机会首先去用各种方法解析输入的域名,这里的各种方法包括本机的 hosts 文件,也包括请求网络的 DNS 服务,而 DNS 在各个层级都有缓存(相应的,缓存当然有过期时间,一般是 600 秒),在原来我的域名是托管在 Godaddy 做 A 解析的,域名的 NameServer 服务器当然是在海外,自然就慢了,后来迁移到新浪的 SAE 后,SAE 提供域名的绑定,但是要求做 CNAME 解析,可惜 Godaddy 是不支持对一级域名做 CNAME 解析的(估计是出于对 MX 解析冲突的考虑),于是没办法,我就把域名转到 DNSPod ,需要注意的是,这个地方的转移,其实只是把域名的解析服务转移出去,但是域名的根本管理权限还是在 Godaddy 的,怎么理解呢,简单的说,就是本来我们的机子向附近的 DNS 服务器请求解析域名,但是附近的 DNS 的并没有缓存我们请求的域名的记录,于是请求被向上转发,这里可能经过一次或者多次转发,然后到了某个层次的 DNS 服务器,一般是根服务器(顺便一提,DNS 的根服务器全球一共 13 台,没有一台在中国,具体情况可以参看维基百科的 根域名服务器 条目),他会最终处理这个请求,它查询发现我们这个被请求的域名是由类似 ns41.domaincontrol.com 或者 ns42.domaincontrol.com 这样的服务器解析的,但是,此处,根服务器并不会送佛送到西地找 ns41.domaincontrol.com 之类的解析,而是把这个负责域名的服务器地址返回给请求的服务器,于是下级的 DNS 向其中一个要求解析对应的地址,最终得到对应的 IP 地址,再层层下转,当然每层都应该会缓存,最后到了我们的机子,一次 DNS 解析请求就此完成,而在我们把域名转到 DNSPod 解析后,最终的解析请求就是由类似 f1g1ns1.dnspod.net 或者 f1g1ns2.dnspod.net 这样的服务器来解析的,这些服务器都是多线接入网络,自然响应速度比向海外的服务器请求要快了,到此,我们基本就理解了 A 解析了。

但是那个 301 是什么回事呢?其实,一般 301 服务器跳转的实现,都是由 DNS 的 NameServer 服务商自己开一个 HTTP 请求服务器来帮忙实现的,我们可以尝试着发送一个 HTTP 的 HEAD 类请求来验证:

Date: Tue, 01 May 2012 21:54:27 GMT
Server: DNSPod v1.0
Location: http://zrj0.sinaapp.com
Content-Length: 0
Connection: close

可以看到返回的 Server 是写着 DNSPod 的,通过一次 ping 请求我们可以进一步验证这个想法:

C:>ping zrj.me

正在 Ping dnspod-free.urlpod.cn [70.39.107.178] 具有 32 字节的数据:
来自 70.39.107.178 的回复: 字节=32 时间=211ms TTL=47
来自 70.39.107.178 的回复: 字节=32 时间=211ms TTL=47
来自 70.39.107.178 的回复: 字节=32 时间=211ms TTL=47
来自 70.39.107.178 的回复: 字节=32 时间=211ms TTL=47

70.39.107.178 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 211ms,最长 = 211ms,平均 = 211ms

C:>

可以清楚的看到,响应这个 ICMP 包的,就是 DNSPod 的服务器。至此,我们基本理解了 301 跳转类的域名解析服务了。

其他的比较少用,而且今天刚好发现 DNSPod 上的帮助写的很不错,简单易懂,直接引用过来:

A记录:地址记录,用来指定域名的IPv4地址(如:8.8.8.8),如果需要将域名指向一个IP地址,就需要添加A记录。
CNAME: 如果需要将域名指向另一个域名,再由另一个域名提供ip地址,就需要添加CNAME记录。
TXT:在这里可以填写任何东西,长度限制255。绝大多数的TXT记录是用来做SPF记录(反垃圾邮件)。
NS:域名服务器记录,如果需要把子域名交给其他DNS服务商解析,就需要添加NS记录。
AAAA:用来指定主机名(或域名)对应的IPv6地址(例如:ff06:0:0:0:0:0:0:c3)记录。
MX:如果需要设置邮箱,让邮箱能收到邮件,就需要添加MX记录。
URL:从一个地址301重定向到另一个地址的时候,就需要添加URL记录(注:DNSPod目前只支持显性301重定向)。
SRV:记录了哪台计算机提供了哪个服务。格式为:服务的名字、点、协议的类型,例如:_xmpp-server._tcp。

各类型的记录值一般是这样的:

A记录:填写您服务器 IP,如果您不知道,请咨询您的空间商
CNAME记录:填写空间商给您提供的域名,例如:dnspod.cn
MX记录:填写您邮件服务器的IP地址或企业邮局给您提供的域名,如果您不知道,请咨询您的邮件服务提供商
TXT记录:一般用于 Google、QQ等企业邮箱的反垃圾邮件设置
URL记录:填写要跳转到的网址,例如:http://www.baidu.com
AAAA:不常用。解析到 IPv6 的地址。
NS记录:不常用。系统默认添加的两个NS记录请不要修改。NS向下授权,填写dns域名,例如:f1g1ns1.dnspod.net
SRV记录:不常用。格式为:优先级、空格、权重、空格、端口、空格、主机名,记录生成后会自动在域名后面补一个“.”,这是正常现象。例如:5 0 5269 xmpp-server.l.google.com.

========== Update ==========

虽然 DNSPod 的域名解析是多线的,但是可惜的是,据官方说明,他的 301 服务器还是在海外,悲催的是,我转过来第一天就遇到 301 服务器悲剧的情况,于是现在 301 还是在 Godaddy 做。

3 thoughts on “进一步理解 DNS

    • 域名是在 Godaddy 买的,不需要备案。
      绑定的话,在 Goaddy 的 DNS Manager 面板可以设置把域名指定到哪个 IP ,或者 CNAME 到哪个域名。

  1. Pingback: 从点击到呈现 — 详解一次HTTP请求(2) | ZRJ

Leave a Reply

Your email address will not be published. Required fields are marked *