远古计算机时期(1972~1989),联网的电脑还可以数的过来。后来,单靠人脑记忆 IP 地址不可靠,于是有南加州大学实验室大佬建了一个表格(实际是个 TXT),写一个程序,将服务器的名称和 IP 一一对应填进去。需要访问时,只需要填个名称,就可以通过表格映射一个 IP 地址访问了!
#################### Mac 上的 hosts 示例# cat /etc/hosts###################### Host Database## localhost is used to configure the loopback interface# when the system is booting. Do not change this entry.##127.0.0.1 localhost255.255.255.255 broadcasthost::1 localhost# Added by Docker Desktop# To allow the same kube context to work on the host and the container:127.0.0.1 kubernetes.docker.internal# End of section
后来,其他实验室和大学的朋友纷纷表示这个有点东西,打电话让大佬把他们的服务器地址也加进去。大佬发现 HOSTS 文本越来越大,除了研究还要天天接电话,说好的偷懒不用记 IP,最后小丑竟是我自己。
于是,聚集一群大佬提了几个草案,决定解决以往的单点、中心化、受限于单台服务器性能人工 HOSTS 文件改造为一个扩展性强而快的自动命名系统,于是域名系统(Domain Name System
)的萌芽开始生长,随后的 1983 年,RFC 882、883 正式发布,域名系统正式诞生。
在伯克利大学,另一群大佬根据 RFC 做了一个的 Unix 实现,以自己的母校命名为 BIND 沿用至今。
Source: http://www.slideshare.net/srikrupa5/dns-security-presentation-issa
当我们查询访问 Google,首先会查一下本地有没有记录或者 DNS 缓存,发现没有,随即发起一个递归查询(Recursion Query
)向上级汇报。上级服务器收到后,发起一个迭代查询(Iteration Query
),搞个类似 For 循环看看 Zone 文件有没有对应的资源记录(RR,Resource Record
)。就这样一级一级的递归、迭代,到了根域名服务器,终于找到了。更新一下各级的域名记录缓存,将 Google 的地址发回来,然后就可以访问了。
然而进度条告诉我们事情并没有这么简单,因为 DNS 服务器每天的查询量实在是太大了。有句话说得好,技术跟不上时,流量来了都以为是 DDoS 攻击。
根域名服务器的请求量太大,很快就扛不住,数据库有主备,DNS 服务器也整一个主次节点(Primary-Second
)次节点只读,全量复制主节点的数据。此外,还有一种缓存服务器(Caching servers
)只缓存查询结果,不维护 Zone 数据文件 (是不是与我们今天很多 Web 服务器很像?)。
Wikipedia - Domain Name Space
虽然这样能用了,但大佬还是觉得不行,不够快。于是又搞了几个负载均衡策略来提速。分别是基于权重轮询(Weighted Round-Robin Based)、基于延迟(Latency-based)和基于地理位置(Geo-based)菜鸡表示看不懂但大受震撼。
基于权重轮询:简单的说,以往是简单的轮询,给几台 DNS 服务器,按顺序把请求发给能用的服务器。后来发现为了水平扩展,服务器的性能并不是每一台都一致。服务器 A 每秒搞定 100 条请求,服务器 B 才 25,B 表示根本忙不过来,于是运维指定一个权重 1 给 B,4 给 A,这样,大概每 4 轮才到一次 B,压力就平衡了
基于延迟:通过 Ping 等方式记录一次来回的时间,用户请求时优先到延迟低的服务器
基于地理位置:通过 IP 地址识别到所在地区,就近分配服务器来加速请求。甚至可以定制本地化内容,或者限制某些地区的访问。
事情似乎到此为止了,而菜鸡们发现,有时候输入网址还是很慢,但查了对应域名的服务器 IP 是能访问的啊。直到有一天看到自己平时访问的页面出现莫名其妙的广告,才发现有些运营商是真的狗,把 DNS 污染了,指向了一个错的地址。
除了大骂一顿,对于普通的用户(企业可能会采用私有的 DNS 服务器 (Private DNS Server)
),这时候可以手动添加我们要访问的域名和 IP 的映射填写到本地的 HOSTS 文件中,或者花点心思配几个口碑好的 DNS 服务器列表。
没办法,免费的东西是最贵的,不能指望别人不作恶,否则交钱上网费还得替别人赚外快!
1. Amazon - GeoLocation Routing (https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html#routing-policy-geo)2. Micorsoft - DNS Architecture(https://technet.microsoft.com/en-us/library/dd197427(v=ws.10).aspx)3. Wekipedia - Domain Name System(https://en.wikipedia.org/wiki/Domain_Name_System)