专栏首页程序员的碎碎念简明入门讲义——DNS 域名系统

简明入门讲义——DNS 域名系统

DNS 简史

远古计算机时期(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 沿用至今。

DNS 基本原理

Source: http://www.slideshare.net/srikrupa5/dns-security-presentation-issa

当我们查询访问 Google,首先会查一下本地有没有记录或者 DNS 缓存,发现没有,随即发起一个递归查询(Recursion Query)向上级汇报。上级服务器收到后,发起一个迭代查询(Iteration Query),搞个类似 For 循环看看 Zone 文件有没有对应的资源记录RR,Resource Record)。就这样一级一级的递归、迭代,到了根域名服务器,终于找到了。更新一下各级的域名记录缓存,将 Google 的地址发回来,然后就可以访问了。

加速和水平扩展 DNS 服务器

然而进度条告诉我们事情并没有这么简单,因为 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 地址识别到所在地区,就近分配服务器来加速请求。甚至可以定制本地化内容,或者限制某些地区的访问。

DNS 污染

事情似乎到此为止了,而菜鸡们发现,有时候输入网址还是很慢,但查了对应域名的服务器 IP 是能访问的啊。直到有一天看到自己平时访问的页面出现莫名其妙的广告,才发现有些运营商是真的狗,把 DNS 污染了,指向了一个错的地址。

除了大骂一顿,对于普通的用户(企业可能会采用私有的 DNS 服务器 (Private DNS Server)),这时候可以手动添加我们要访问的域名和 IP 的映射填写到本地的 HOSTS 文件中,或者花点心思配几个口碑好的 DNS 服务器列表

没办法,免费的东西是最贵的,不能指望别人不作恶,否则交钱上网费还得替别人赚外快!

Ref

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)

本文分享自微信公众号 - 程序员的碎碎念(gh_53e607dd4782),作者:FesonX

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-05-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 简明入门讲义——NGINX 为何这么快

    一个 NGINX 主要由 Master 进程和一系列子进程组成,主进程负责配置读取和重新加载、绑定端口以及子进程的管理 子进程有三种角色

    benny
  • 【RL-TCPnet网络教程】第27章 DNS域名系统基础知识

    本章节为大家讲解DNS(Domain Name System,域名系统),通过前面章节对TCP和UDP的学习,需要大家对DNS也有个基础的认识。

    armfly
  • 不为人知的网络编程(九):理论联系实际,全方位深入理解DNS

    本文原作者:selfboot,博客地址:selfboot.cn,Github地址:github.com/selfboot,感谢原作者的技术分享。

    JackJiang
  • 【拓展】一文看懂:网址,URL,域名,IP地址,DNS,域名解析

    今天给大家梳理一篇关于网址、URL、IP地址、域名、DNS、域名解析的白话长文,并以简单的提问-解答形式让读者更加深刻理解网址、URL、IP地址、域名、DNS、...

    pingan8787
  • 简明入门讲义——CAP 理论,鱼和熊掌不可兼得

    开发人员常常要将对性能与扩展性的思考体现在代码中 出现性能(Performance)问题,即单个用户请求是缓慢的 出现扩展(Scalability)问题,即单个...

    benny
  • 简明入门讲义——如何实现可扩展的 Web 服务

    可扩展的应用服务器(Application Server)集群藏身于负载均衡器(Load balance,LB)背后,LB 将负载(即用户请求)平均地分配到各个...

    benny
  • 简明入门讲义——如何实现可扩展的 Web 服务

    可扩展的应用服务器(Application Server)集群藏身于负载均衡器(Load balance,LB)背后,LB 将负载(即用户请求)平均地分配到各个...

    FesonX
  • 全面了解移动端DNS域名劫持等杂症:原理、根源、HttpDNS解决方案等

    本文引用了腾讯工程师廖伟健发表于“鹅厂网事”公众号上的《【鹅厂网事】全局精确流量调度新思路-HttpDNS服务详解》一文部分内容,感谢原作者的分享。

    JackJiang
  • 基于consul的Redis高可用方案

    这几天在研究如何做Redis的高可用容灾方案,查询了资料和咨询DBA同行,了解到Redis可以基于consul和sentinel实现读写分离以及HA高可用方案。...

    用户1278550

扫码关注云+社区

领取腾讯云代金券