域名里有哪些门道h3>
- 域名的形式
- 域名的解析
- 域名的“新玩法”
- 小结
- 课下作业
在上一讲里,我们学习了HTTP协议使用的TCP/IP协议栈,知道了HTTP协议是运行在TCP/IP上的。
IP协议的职责是“ 际互连”,它在MAC层之上,使用IP地址把MAC编 转换成了四位数字,这就对物理 卡的MAC地址做了一层抽象,发展出了许多的“新玩法”。
例如,分为A、B、C、D、E五种类型,公有地址和私有地址,掩码分割子 等。只要每个小 络在IP地址这个概念上达成一致,不管它在MAC层有多大的差异,都可以接入TCP/IP协议栈,最终汇合进整个互联 。
但接入互联 的计算机越来越多,IP地址的缺点也就暴露出来了,最主要的是它“对人不友好”,虽然比MAC的16进制数要好一点,但还是难于记忆和输入。
怎么解决这个问题呢p>
那就“以其人之道还治其人之身”,在IP地址之上再来一次抽象,把数字形式的IP地址转换成更有意义更好记的名字,在字符串的层面上再增加“新玩法”。于是,DNS域名系统就这么出现了。
域名的形式
在第4讲曾经说过,域名是一个有层次的结构,是一串用“.”分隔的多个单词,最右边的被称为“顶级域名”,然后是“二级域名”,层级关系向左依次降低。
最左边的是主机名,通常用来表明主机的用途,比如“www”表示提供万维 服务、“mail”表示提供邮件服务,不过这也不是绝对的,名字的关键是要让我们容易记忆。
看一下极客时间的域名“time.geekbang.org”,这里的“org”就是顶级域名,“geekbang”是二级域名,“time”则是主机名。使用这个域名,DNS就会把它转换成相应的IP地址,你就可以访问极客时间的 站了。
域名不仅能够代替IP地址,还有许多其他的用途。
在Apache、Nginx这样的Web服务器里,域名可以用来标识虚拟主机,决定由哪个虚拟主机来对外提供服务,比如在Nginx里就会使用“server_name”指令:
域名本质上还是个名字空间系统,使用多级域名就可以划分出不同的国家、地区、组织、公司、部门,每个域名都是独一无二的,可以作为一种身份的标识。
举个例子吧,假设A公司里有个小明,B公司里有个小强,于是他们就可以分别说是“小明.A公司”,“小强.B公司”,即使B公司里也有个小明也不怕,可以标记为“小明.B公司”,很好地解决了重名问题。
因为这个特性,域名也被扩展到了其他应用领域,比如Java的包机制就采用域名作为命名空间,只是它使用了反序。如果极客时间要开发Java应用,那么它的包名可能就是“org.geekbang.time”。
而XML里使用URI作为名字空间,也是间接使用了域名。
域名的解析
就像IP地址必须转换成MAC地址才能访问主机一样,域名也必须要转换成IP地址,这个过程就是“域名解析”。
目前全世界有几亿个站点,有几十亿 民,而每天 络上发生的HTTP流量更是天文数字。这些请求绝大多数都是基于域名来访问 站的,所以DNS就成了互联 的重要基础设施,必须要保证域名解析稳定可靠、快速高效。
DNS的核心系统是一个三层的树状、分布式服务,基本对应域名的结构:
- 根域名服务器(Root DNS Server):管理顶级域名服务器,返回“com”“net”“cn”等顶级域名服务器的IP地址;
- 顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,比如com顶级域名服务器可以返回apple.com域名服务器的IP地址;
- 权威域名服务器(Authoritative DNS Server):管理自己域名下主机的IP地址,比如apple.com权威域名服务器可以返回www.apple.com的IP地址。
在Nginx里有这么一条配置指令“resolver”,它就是用来配置DNS服务器的,如果没有它,那么Nginx就无法查询域名对应的IP,也就无法反向代理到外部的 站。
resolver 8.8.8.8 valid=30s; #指定Google的DNS,缓存30秒
域名的“新玩法”
有了域名,又有了可以稳定工作的解析系统,于是我们就可以实现比IP地址更多的“新玩法”了。
-
第一种,也是最简单的,“重定向”。因为域名代替了IP地址,所以可以让对外服务的域名不变,而主机的IP地址任意变动。当主机有情况需要下线、迁移时,可以更改DNS记录,让域名指向其他的机器。比如,你有一台“buy.tv”的服务器要临时停机维护,那你就可以通知DNS服务器:“我这个buy.tv域名的地址变了啊,原先是1.2.3.4,现在是5.6.7.8,麻烦你改一下。”DNS于是就修改内部的IP地址映射关系,之后再有访问buy.tv的请求就不走1.2.3.4这台主机,改由5.6.7.8来处理,这样就可以保证业务服务不中断。
-
第二种,因为域名是一个名字空间,所以可以使用bind9等开源软件搭建一个在内部使用的DNS,作为名字服务器。这样我们开发的各种内部服务就都用域名来标记,比如数据库服务都用域名“mysql.inner.app”,商品服务都用“goods.inner.app”,发起 络通信时也就不必再使用写死的IP地址了,可以直接用域名,而且这种方式也兼具了第一种“玩法”的优势。
-
第三种“玩法”包含了前两种,也就是基于域名实现的负载均衡。这种“玩法”也有两种方式,两种方式可以混用。
-
第一种方式,因为域名解析可以返回多个IP地址,所以一个域名可以对应多台主机,客户端收到多个IP地址后,就可以自己使用轮询算法依次向服务器发起请求,实现负载均衡。
-
第二种方式,域名解析可以配置内部的策略,返回离客户端最近的主机,或者返回当前服务质量最好的主机,这样在DNS端把请求分发到不同的服务器,实现负载均衡。
-
前面我们说的都是可信的DNS,如果有一些不怀好意的DNS,那么它也可以在域名这方面“做手脚”,弄一些比较“恶意”的“玩法”,举两个例子:
“域名屏蔽”,对域名直接不解析,返回错误,让你无法拿到IP地址,也就无法访问 站;
“域名劫持”,也叫“域名污染”,你要访问A 站,但DNS给了你B 站。
好在互联 上还是好人多,而且DNS又是互联 的基础设施,这些“恶意DNS”并不多见,你上 的时候不需要太过担心。
小结
这次我们学习了与HTTP协议有重要关系的域名和DNS,在这里简单小结一下今天的内容:
- 域名使用字符串来代替IP地址,方便用户记忆,本质上一个名字空间系统;
- DNS就像是我们现实世界里的电话本、查 台,统管着互联 世界里的所有 站,是一个“超级大管家”;
- DNS是一个树状的分布式查询系统,但为了提高查询效率,外围有多级的缓存;
- 使用DNS可以实现基于域名的负载均衡,既可以在内 ,也可以在外 。
课下作业
- 在浏览器地址栏里随便输入一个不存在的域名,比如就叫“www.不存在.com”,试着解释一下它的DNS解析过程。
- 浏览器DNS缓存->操作系统缓存->Hosts文件->非权威域名服务器->根域名服务器->顶级域名服务器->权威域名服务器
- 根据上述查询顺序,依次查询:浏览器缓存、操作系统缓存、host文件、根域名、顶级域名,由于顶级域名不存在,所以返回失败
- 如果因为某些原因,DNS失效或者出错了,会出现什么后果li>
- “域名屏蔽”:无法拿到IP地址,也就无法访问 站;
- “域名劫持”:将域名解析道错误的 IP 地址上,无法访问到真正想访问的 站。
文章知识点与官方知识档案匹配,可进一步学习相关知识 络技能树支撑应用程序的协议HTTP协议22972 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!