从本节开始,我们研究和实现一个体系较为复杂的协议,也就是域名解析协议,简写为DNS。该协议几乎也是我们”日用而不知“的幕后英雄,没有它肯定就没有现在的互联网繁荣。
当我们在浏览器上输入网址,例如www.baidu.com时,浏览器先通过DNS协议找到与该网址对应的IP地址,然后再使用IP去向服务器获取网页信息。也就是说互联网上的设备其实有两种辨认方法,一种是IP,一种是域名。就如同人的身份证,人有名字,同时也有几十位数字组成的身份证号。
人与人相互识别时,使用的都是名字,几乎没有人使用身份证号来识别他人的,即使身份证号相对于名字而言更加唯一和准确。说到底是因为人对数字识别很费劲,而记住名字很容易。
对计算机的访问也是如此。在互联网发展早期,计算机只是在局域网内互联,并且联网的机器非常有限,因此当时使用IP直接定位不同的机器。但是随着网络的发展,联网的机器越来越多,使用数字辨别每一台计算机变得越来越困难,于是人们开始想用更方便的记忆方式,于是自然就想到用字符串来替代难以记忆的数字。
然而对程序而言,它只能识别数字,于是字符串仅仅用作于方便记忆,在运行机制上,程序就得把字符串与IP数字进行转换。最早使用的转换机制很简单,甚至到现在还在使用,那就是hosts文件,它使用文本的方式将IP与字符串名字对应起来,如下图:
程序在运行时,先将该文件内容读入内存,当用户输入网址时,它先从里面的对应关系中,将网址直接转换成对应的IP地址。这种方法在主机数量少时适用,但现在网络上的主机数量数以千万计,如此我们得在文件中维护几万个对应关系,这显然不合情理,随着联网的设备越来越多,适用这种静态配置的方式越来越不合时宜,因此全网使用一种统一的IP字符串映射方式是势在必行。
如今能满足这种域名转换成IP需要机制,就是我们要研究和实现的DNS协议,它是极佳的分布式系统设计案例,互联网发展几十年来,接入网络的设备呈指数级增长,需要进行域名解析的请求自然也指数级增长,DNS自设计完成以来就具备了极佳的扩展性,因此它在没有大变动的情况下,满足日益增长的需求,可见其设计思路之巧妙。
相比于其他网络协议,DNS协议本身更像是一个系统。它主要包含以下三种系统功能:
显然我们不可能实现全部功能,但我们会选择一些重要模块进行研究和实现,事实上抓住局部原理,对整体功能的把握也就能做到心中有数。DNS分为三大块,紫色部分是名字空间,它规定了域名的层级构造标准,第二部分是名字注册,它负责添加新设备的名称并防止名字冲突,第三部分是名字解析,它负责将域名转换为对应IP。
在了解DNS协议时,我们需要掌握一个很重要的概念叫域名。”域名“其实是对一个特定领域的统一称呼。例如我的大学名叫”北京化工大学“,于是对于我母校而言,它是一级域名,在下面又分很多个学院,例如理学院,化工学院,文法学院等,这些学院名称就是二级”域名“,学院内又有很多个系,像我所在的理学院有:数学系,物理系,化工系,这些系的名称就是三级域名,系下面又分班,比如我所在的数学系分为1,2,3,4班,这四个班名称对应的是四级域名,每个班内的人都有自己的名字,于是就对应五级域名。
因此要定位我的时候就可以使用如下格式:北京化工大学.理学院.数学系.3班.陈屹,这个世界上与我同名的人肯定不少,但是所有层级的域名都给我一致的,那很可能就只有我一个,除非在班里有和我同名的人,倘若如此,我们可以把名字再当做一级域名,在底下进行区分,例如一个班内有两个陈屹时,上面域名就可以变为:北京化工大学.理学院.数学系.3班.陈屹.A,在任何一个层级出现冲突时,我们可以在该层级切分出多个子层级,从而避免冲突。
DNS中的域名以拓扑树的方式存在,如下图:
它以一个根节点开始,派生出一级域名,一级域名下面是二级域名,二级域名之后全都叫子域名。每一级域名可以使用数字和字符组合成的字符串来表示,其中字符串不区分大小写,同时一个域名下面的子域名不能相同,假设有一个一级域名叫"Black",那么它下层的子域名可以是"white",但必须只有一个,如果有另一个子域名叫”WHITE",由于域名不区分大小写,因此两个域名被认为相同,这是不允许的。
由此域名设定时可以从根到叶子节点,中间以符号".“隔开。上图中的Root始终对应空字符串,所以"www.baidu.com"对应于上图而言,第一级域名就是”",第二级域名就是"baidu",第三级域名就是"www",在解析的时候,该字符串域名就要倒转变成"www.baidu.com"。如果是百度知道,那么域名就是zhidao.baidu.com。
一级域名由特定机构控制例如IANA这类互联网管理机构,而二级域名往往对应一个特定组织或团体,例如baidu对应百度公司,三级域名则由组织自己控制。域名对公司而言是非常重要的信息资产,早期有很多聪明人通过域名碰瓷,也就曾大公司或机构不注意,用他们的名字注册域名,结果这些公司想用时只能从他们手中高价购买,很多人就靠这种手段发了大财。
接下来我们看看域名解析的基本流程。首先要解析域名,我们先找到含有相关域名信息的服务器,然后向该服务器发送信息请求。问题在于,域名信息不是存储在固定服务器中,为了系统鲁棒性和扩展性,域名信息以分布式的形式存储在不同服务器里,因此第一步要查询哪个服务器包含了域名对应的信息。
假设我们要解析域名“C.B.A",首先我们将请求发送给所谓的根域名服务器,该服务器会把拥有域名A的服务器地址返回给我们,返回的服务器可能知道域名B.A的信息或者它把关于A的信息返回后,再给我们一个知道域名B的服务器地址,返回的服务器可能知道域名C的信息,或者返回域名B的信息后,再告诉我们哪个服务器知道域名C的信息,因此我们在解析过程中要根据服务器返回信息进行选择。
在下一节我们会就解析流程做深入介绍。
更多技术信息,包括操作系统,编译器,面试算法,机器学习,人工智能,请关照我的公众号: