【前五篇】系列文章传送门:

  1. 网络协议 11 - Socket 编程(下):眼见为实耳听为虚
  2. 网络协议 12 - HTTP 协议:常用而不简单
  3. 网络协议 13 - HTTPS 协议:加密路上无尽头
  4. 网络协议 14 - 流媒体协议:要说爱你不容易
  5. 网络协议 15 - DNS 协议:网络世界的地址簿

    为什么在地址栏输入域名,就能直接访问到对应服务器?全局负载均衡和内部负载均衡又是什么?这些都和 DNS 解析息息相关,让我们一起来解密 DNS 解析。

    其实说起 DNS 解析,应该都知道它很像地址簿。就像我们去一家新开的沃尔玛超市,通过地址簿查出来沃尔玛在哪条路多少号,然后再去找。

    在网络世界中,也是这样的。我们可以记住网站的名称,但是很难记住网站的 IP 地址,因此需要一个“地址簿”,帮我们将网站名称转换成 IP。这个“地址簿”就是 DNS 服务器

DNS 服务器

    对于 DNS 服务器而言,全球每个人上网,都需要访问它。
    而全球的网民数,据最新统计,已经有 40 亿,每个人都访问它,可想而知 DNS 服务器会有很大的访问流量压力(高并发)。
    而且,它还非常重要,一旦出了故障,整个互联网都将瘫痪(高可用)。
    此外,上网的人分布在全世界各地,如果大家都去同一个地方的某一台服务器,时延将会非常的(分布式)。

    因此,DNS 服务器一定要具备高可用、高并发、分布式的特点。

    基于此,DNS 服务器设计成树状的层次结构。如下图:

  • 根 DNS 服务器:返回顶级域 DNS 服务器的 IP 地址;
  • 顶级域 DNS 服务器:返回权威 DNS 服务器的 IP 地址;
  • 权威 DNS 服务器:返回相应主机的 IP 地址。

DNS 解析流程

    上面说了 DNS 服务器面临大流量访问的压力,因此,为了提高 DNS 的解析性能,很多网站都会就近部署 DNS 缓存服务器。所以,我们常见的 DNS 解析流程就变成了:

  1. 客户端发出 DNS 请求给本地域名服务器。我们访问博客园,客户端会问本地域名服务器, www.cnblogs.com 的 IP 是什么?(本地域名服务器,如果网络是通过 DHCP 配置,本地 DNS 是由你的网络服务商,如电信、联通等自动分配,它通常就在网络服务商的机房里);
  2. 本地 DNS 收到来自客户端的请求,查找“地址簿”,返回 IP 或请求根域名服务器。我们可以理解为服务器上缓存了一张域名与 IP 对应的大表,如果能找到 www.cnblogs.com,就直接返回对应的 IP 地址。如果没有找到,本地 DNS 会去问它的根域名服务器;
  3. 根 DNS 收到来自本地 DNS 的请求,返回 .com 对应的顶级域名服务器的地址。根域名服务器是最高层次的,全球共有 13 套,它不直接用于域名解析,而是指明怎样去查找对应 IP。它发现请求的域名后缀是 .com,就会返回 .com 对应的顶级域名服务器的地址;
  4. 本地 DNS 服务器收到顶级 DNS 服务器地址,请求顶级 DNS 服务器查询域名 IP
  5. 顶级 DNS 服务器返回权威 DNS 服务器地址。顶级域名服务器就是大名鼎鼎的,负责 .com、.net、.org 这些二级域名,比如 cnblogs.com,它会返回对应的权威 DNS 服务器地址;
  6. 本地 DNS 服务器收到权威 DNS 服务器地址,请求权威 DNS 服务器查询域名 IP。而 cnblogs.com 的权威 DNS 服务器就是域名解析结果的原出处;
  7. 权威 DNS 服务器返回对应 IP。权威 DNS 服务器查询“地址簿”,获取到域名对应 IP 地址,返回给本地 DNS 服务器;
  8. 本地 DNS 服务器收到 IP,返回给客户端
  9. 客户端与目标建立连接

    至此,我们完成了 DNS 的解析过程,整个过程如下图:

负载均衡

    站在客户端角度,上述过程是一次 DNS 递归查询过程。因为本地 DNS 全权为它代劳,它只要坐等结果就好了。在这个过程中,DNS 除了可以通过名称映射为 IP 地址外,它还可以做另外一件很重要的事 - 负载均衡

    还是拿我们逛沃尔玛超市为例。它可能在一个城市里会有多家店,我们要逛沃尔玛,可以就近找一家,而不用都去同一家,这就是负载均衡。

DNS 做负载均衡也有花样可以玩。
1)DNS 做内部负载均衡
    所谓的内部负载均衡,其实很好理解。就像我们的应用访问数据库,在应用里配置的数据库地址。如果配置成 IP 地址,一旦数据库换到了另外一台机器,我们就要修改配置。如果我们有很多台应用同时连一个数据库,一换 IP,就需要将这些应用的配置全部修改一遍,是不是很麻烦?所以,我们可以将数据地址配置成域名。在更换数据库位置时,只要在 DNS 服务器里,将域名映射为新的 IP 地址就可以了。

    在这个基础上,我们可以更进一步 。例如,某个应用要访问另外一个应用,如果配置另外一个应用的 IP 地址,那么这个访问就是一对一的。但是当被访问的应用因流量过大撑不住的时候,我们就需要部署多个应用。这时候,我们就不能直接配置成 IP,而是要配置域名了。只要在域名解析的时候,配置好策略,这次返回一个 IP,下次返回第二个 IP,就实现了负载均衡。

2)DNS 做全局负载均衡
    为了保证我们应用的高可用性,往往会将应用部署在多个机房,每个地方都会有自己的 IP 地址。当用户访问某个域名的时候,这个 IP 地址可以轮询访问多个数据中心。如果一个数据中心因为某种原因挂了,只要将这个 IP 地址从 DNS 服务器中删掉就可以了,用户不会访问到宕机的服务器,保证了应用的可用性。

    另外,我们肯定希望用户能访问就近的数据中心。这样客户访问速度就会快很多,体验也会好很多,也就实现了全局负载均衡的概念。

负载均衡示例

    我们通过 NDS 访问数据中心对象存储上的静态资源为例,来看一看整个过程。

    假设全国有多个数据中心,托管在多个运营商,每个数据中心有三个可用区。对象存储可以通过跨可用区部署,实现高可用性。在每个数据中心中,都至少部署两个内部负载均衡器,内部负载均衡器后面对接多个对象存储的前置服务器(Proxy-server)。那么,请求过程如下图:

  1. 当一个客户端要访问 object.yourcompany.com 的时候,需要将域名转换为 IP 地址进行访问,所以它要请求本地 DNS 解析器;
  2. 本地 DNS 解析器先查看本地的缓存是否有这个记录。如果有,就直接用,省略后续查询步骤,提高相应时间;
  3. 如果本地无缓存,就需要请求本地的 DNS 服务器;
  4. 本地 DNS 服务器一般部署在数据中心或者你所在的运营商网络中。本地 DNS 服务器也需要看本地是否有缓存,如果有,就直接返回;
  5. 本地没有,通过第 5、6、7 步骤获取到 IP 地址,缓存到本地 DNS 解析器中,然后在返回给客户端。

    对于不需要做全局负载均衡的简单应用来讲,yourcompany.com 的权威 DNS 服务器可以直接将 object.yourcompa.com 这个域名解析为一个或者多个 IP 地址,然后客户端可以通过多个 IP 地址,进行简单的轮询,实现简单的负载均衡。

    但是对于复制的应用,尤其是跨地域跨运营商的大型应用,就需要更加复杂的全局负载均衡机制,因而需要专门的设备或者服务器来做这件事情,这就是全局负载均衡器(GSLB,Global Server Load Balance)

    在 yourcompany.com 的 DNS 服务器中,一般是通过配置 CNAME 的方式,给 object.yourcompany.com 起一个别名。例如 object.vip.yourcompany.com,然后告诉本地 DNS 服务器,让它请求 GSLB 解析这个域名,GSLB 就可以在解析这个域名的过程中,通过自己的策略实现负载均衡。

上图中画了两层的 GSLB,是因为分运营商和地域。我们希望不同运营商的客户,可以访问对应运营商机房中的资源,这样不跨运营商访问,有利于提高吞吐量,减少时延。两层 GSLB 的过程如下:

  1. 第一层 GSLB,通过查看请求它的本地 DNS 服务器所在的运营商,就知道用户所在的运营商。假设是移动,通过 CNAME 的方式,通过另一个别名 object.yd.yourcompany.com,告诉本地 DNS 服务器去请求第二层的 GSLB;
  2. 第二层 GSLB,通过查看请求它的本地 DNS 服务器的地址,知道用户所在的地理位置,然后将距离用户位置比较近的一个 Region 的六个内部负载均衡的地址,返回给本地 DNS 服务器;
  3. 本地 DNS 服务器将结果返回给本地 DNS 解析器;
  4. 本地 DNS 解析器将结果缓存后,返回给客户端;
  5. 客户端开始访问属于相同运营商的,且距离比较近的 Region1 中的对象存储。当然,客户端得到了六个 IP 地址,它可以通过负载均衡的方式,随机或者轮询选择一个可用区进行访问。对象存储一般会有三个备份,从而实现对存储读写的负载均衡。

小结

  • DNS 是网络世界的地址簿。可以通过域名查地址,因为域名服务器是按照树状结构组织的,因而域名查找是使用递归查询的方式,并通过缓存的方式加快效率;
  • 在域名和 IP 的映射中,给了应用基于域名做负载均衡的机会,可以是简单的负载均衡,也可以是根据地址和运营商做的全局负载均衡。

参考:

  1. 维基百科-域名系统 词条;
  2. 知乎-域名解析
  3. 刘超 - 趣谈网络协议系列课;

网络协议 16 - DNS 协议:网络世界的地址簿的更多相关文章

  1. 网络协议 16 - DNS 协议

    为什么在地址栏输入域名,就能直接访问到对应服务器?全局负载均衡和内部负载均衡又是什么?这些都和 DNS 解析息息相关,让我们一起来解密 DNS 解析.     其实说起 DNS 解析,应该都知道它很像 ...

  2. 前端浅谈-协议相关(DNS协议)

    从应用层到实体层的协议太多了,我们并不能一一涉及,目前来说就打算整理可能会与前端相关的协议. 前端面试常会问到一个问题-"从输入一个url到页面渲染经历了哪些过程".这其实是一个相 ...

  3. 网络协议 20 - RPC 协议(上)- 基于XML的SOAP协议

    [前五篇]系列文章传送门: 网络协议 15 - P2P 协议:小种子大学问 网络协议 16 - DNS 协议:网络世界的地址簿 网络协议 17 - HTTPDNS:私人定制的 DNS 服务 网络协议 ...

  4. 网络协议 19 - RPC协议综述:远在天边近在眼前

    [前五篇]系列文章传送门: 网络协议 14 - 流媒体协议:要说爱你不容易 网络协议 15 - P2P 协议:小种子大学问 网络协议 16 - DNS 协议:网络世界的地址簿 网络协议 17 - HT ...

  5. #WEB安全基础 : HTTP协议 | 0x4 各种协议与HTTP协议的关系(一个报文的旅行)

    报文是怎么旅行的呢? 在网络中有很多引路人,如HTTP协议,IP协议.TCP协议.DNS协议以及ARP协议. 请看下图,演绎一个报文的旅程 这就是一个报文的完整请求过程,请加以理解并记忆 //本系列教 ...

  6. 网络A、B、C类IP地址的区别

    学网络之前得先要明白几个概念:(起初我也不怎么知道后来就慢慢会了) 1字节=8位,1位就是1个数字,所以1字节等于8个数字. 2的8次方,和二进制11111111转换为十进制并不一回事. 0-127是 ...

  7. 网络 osi七层协议

    一 互联网的本质 咱们先不说互联网是如何通信的(发送数据,文件等),先用一个经典的例子,给大家说明什么是互联网通信. 现在追溯到八九十年代,当时电话刚刚兴起,还没有手机的概念,只是有线电话,那么此时你 ...

  8. TCP/IP协议(一)网络基础知识

    参考书籍为<图解tcp/ip>-第五版.这篇随笔,主要内容还是TCP/IP所必备的基础知识,包括计算机与网络发展的历史及标准化过程(简述).OSI参考模型.网络概念的本质.网络构建的设备等 ...

  9. TCP/IP 中文译名为传输控制协议/因特网互联协议,又叫网络通讯协议

    原文地址:http://hi.baidu.com/albyuyrgqgbbhoq/item/65006d2d002ab33195f62ba1 TCP/IP(Transmission Control P ...

随机推荐

  1. 使用Spring MVC测试Spring Security Oauth2 API

    不是因为看到希望了才去坚持,而坚持了才知道没有希望. 前言 在Spring Security源码分析十一:Spring Security OAuth2整合JWT和Spring Boot 2.0 整合 ...

  2. python中__del__使用方法

    创建对象后,python解释器默认调用__init__()方法.当删除一个对象时,python解释器也会默认调用一个方法,这个方法为__del__()方法.在python中,对于开发者来说很少会直接销 ...

  3. 远程服务器使用phantomjs报错:phantomjs unexpectedly exited. Status code was: 127

    原因是因为缺少phantomjs运行的依赖包 Ubuntu尝试: sudo apt-get install libfontconfig centos尝试: 用wget安装phantomjs依赖的lib ...

  4. RabbitMQ分布式集群架构和高可用性(HA)

    (一) 功能和原理 设计集群的目的 允许消费者和生产者在RabbitMQ节点崩溃的情况下继续运行 通过增加更多的节点来扩展消息通信的吞吐量 1 集群配置方式 RabbitMQ可以通过三种方法来部署分布 ...

  5. config.go

    package blog4go import ( "encoding/xml" "errors" "io/ioutil" "os& ...

  6. 【bzoj 2916】[Poi1997]Monochromatic Triangles

    题目描述        空间中有n个点,任意3个点不共线.每两个点用红线或者蓝线连接,如果一个三角形的三边颜色相同,那么称为同色三角形.给你一组数据,计算同色三角形的总数.          输入 第 ...

  7. BZOJ_4804_欧拉心算_欧拉函数

    BZOJ_4804_欧拉心算_欧拉函数 Description 给出一个数字N Input 第一行为一个正整数T,表示数据组数. 接下来T行为询问,每行包含一个正整数N. T<=5000,N&l ...

  8. BZOJ_1040_[ZJOI2008]骑士_树形DP

    BZOJ_1040_[ZJOI2008]骑士_树形DP 题意: Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各 界的赞扬.最近发生了一件可怕的事情,邪 ...

  9. BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演

    BZOJ_4176_Lucas的数论_杜教筛+莫比乌斯反演 Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求 ...

  10. html中 submit和button的区别?

    前者是向数据库提交表单 后者是单纯的按钮功能