06_透视HTTP协议_域名里有哪些门道?

内容

IP 协议的职责是“网际互连”,它在 MAC 层之上,使用IP地址把MAC编号转换成了四位数字,这就对了物理网卡的MAC地址做了一层抽象,发展出了许多玩法。例如,分为ABCDE,五种类型,公有地址和私有地址,掩码分隔子网等。只要每个小网络在IP地址这个概念上达成一致,不管他在MAC层有多大的差异,都可以接入TCP/IP协议栈,最终汇合进整个互联网。

但接入互联网的计算机越来越多,IP地址的缺点也就暴露出来了,最主要的是,他对人不友好,虽然比MAC的16进制数要好一些,但还是难于记忆和输入。那怎么解决这个问题呢?那就对IP地址,再来一次抽象,把数字形式的IP地址转换成更有意义更好记的名字,在字符串的层面上,再增加“新玩法”。于是,DNS域名系统就这么出现了。

域名的形式

在第四讲的时候说过,域名是一个有层次的结构,是一串用 " . ",分隔的多个单词,最右边被称为“顶级域名”,然后是“二级域名”,层级关系向左依次降低。
最左边是主机名,通常用来表明主机的用途,比如"www"表示提供万维网服务,"mail"表示提供邮件服务,不过也不是绝对的,名字的关键是让我们容易记忆。

比如:time.geeekbang.org. 这里的"org"就是顶级域名,"geekbang"是二级域名,"time"则是主机名。使用这个域名,DNS就会把他转换成对应的IP地址,这样就能访问极客时间的网址了。

域名不只能够代替IP地址,还有其他用途。在Apacha、Nginx这样的web服务器里,域名可以用来标识虚拟主机,决定由哪个虚拟主机来对外提供服务,比如在Nginx里就会使用"server_name"指令:


server{
listen 80;
server_name time.geekbang.org;
...
}


域名本质上还是个名字空间系统,使用多级域名就可以划分出不同的国家、地区、组织、公司、部门,每个域名都是独一无二的,可以作为一种身份的标识。
例子:
假设A公司里有个小明,B公司有个小强,于是他们就可以分别说是,“小明.A公司”“小强.B公司”,即使B公司里有个小明也不怕,可以标记为“小明.B公司”,这样可以很好地解决重名问题。
因为这个特性,域名也被扩展到了其他应用领域,比如Java的包机制就采用域名作为命名空间,只是他使用了反序。
eg:org.geekbang.time

而XML里使用URI作为名字空间,也是间接使用了域名。

域名的解析

就像IP地址,必须转换成MAC地址才能访问主机一样,域名也必须要转换成IP地址,这个过程就是域名解析。目前全世界有几亿个站点,有几十亿网民,而每天网络上发生的HTTP流量更是天文数字。这些请求绝大多是都是基于域名来访问网站的,所以DNS就成了互联网的重要基础设施,必须要保证域名解析稳定可靠、快速高效。

DNS的核心系统是一个三层的树状、分布式服务,基本对应域名的结构:

  1. 根域名服务器(Root DNS Server):
    管理顶级域名服务器,返回“com” “net” “cn”等顶级域名服务器的IP地址
  2. 顶级域名服务器(Top-level DNS Server)
    管理各自域名下的权威域名服务器,比如com顶级域名服务器可以返回apple.com域名服务器的IP地址
  3. 权威域名服务器(Authoritative DNS Server)
    管理自己域名下主机的IP地址,比如apple.com权威域名服务器可以返回www.apple.com的IP地址
    域名架构

在这里,根域名服务器是关键,他必须是众所周知额,否则下面的各级服务器就无从谈起了,全世界共有13组根域名服务器,又有数百台的镜像,保证一定能够被访问到。有了这个系统之后,任何一个域名都可以在这个树形结构里从顶至下进行查询,就好像是把域名从右到左按顺序走了一遍,最终就获得了域名对应的IP地址。

eg:
要访问,"www.apple.com",就要进行下面的三次查询:

  1. 访问根域名服务器,他会告诉你 "com"顶级域名服务器的地址;
  2. 访问"com"顶级域名服务器,他再告诉你"apple.com"域名服务器的地址;
  3. 最后访问"apple.com"域名服务器,就得到了"www.apple.com"的地址。

DNS系统的缓存环节

虽然核心的DNS系统遍布全球,服务能力很强也很稳定,但如果全世界的网民都往这个系统里挤,即使不挤瘫痪了,访问速度也会很慢。所以在核心DNS系统之外,还有两种手段用来减轻域名解析的压力,并且能够更快地获取结果,基本思路就是“缓存”。

大公司自己的DNS服务器:代理向

首先,许多大公司、网络运行商都会建立自己的DNS服务器,作为用户DNS查询的代理,代替用户访问核心DNS系统。这些野生服务器被称为“非权威域名服务器”,可以缓存之前的查询结果,如果已经有了记录,就无需再向根服务器发起查询,直接返回对应的IP地址。这些DNS服务器的数量,要比核心系统的服务器多很多,而且大多部署在离用户很近的地方。比较知名的DNS有,Google的"8.8.8.8", Microsoft 的"4.2.21",还有CloudFlare的"1.1.1.1"等等。

操作系统缓存+host文件

另外,操作系统还有一个特殊的“主机映射”文件,通常是一个可编辑的文本,在Linux里是“/etc/hosts”,在windows里是“C:\WINDOWS\system32\drivers\etc\hosts”,如果操作系统在缓存里找不到DNS记录,就会找到这个文件。

有了上面的野生DNS服务器、操作系统缓存和hosts文件后,很多域名解析的工作就不用“跋山涉水”了,直接在本地或本机就能解决,不仅方便了用户,也减轻了各级DNS服务器的压力,效率就大大提升了。


现有DNS架构

在Nginx里有这么一条配置指令“resolver”,他是用来配置DNS服务器的,如果没有它,那么Nginx就无法查询域名对应的IP,也就无法反向代理到外部的网站:


resolver 8.8.8.8 valid=30s; # 指定 Google 的 DNS,缓存 30 秒


域名的新玩法

域名和IP地址相比,多了很多可以玩的地方。

  1. 重定向
    因为域名代替了IP地址,所以可以让对外服务的域名不变,而主机的IP地址任意变动。当主机有情况需要下线、迁移时,可以更改DNS记录,让域名指向其他机器。
    eg:
    你有一台"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来处理,这样就可以保证业务服务不中断。

  2. 搭建名字服务器
    因为域名是一个名字空间,所以可以使用bind9等开源软件搭建一个在内部使用的DNS,作为名字服务器。这样我们开发的各种内部服务就都用域名来标记,比如数据库服务都用域名“mysql.inner.app”,商品服务都用“goods.inner.app”,发起网络通信时,就不必再使用写死的IP地址了,可以直接用域名,而且这种方式也兼具了第一种玩法的优势。

  3. 基于域名实现的负载均衡
    1)第一种方式,因为域名解析可以返回多个IP地址,所以一个域名可以对应多台主机,客户端收到多个IP地址后,就可以自己使用轮询算法依次向服务器发起请求,实现负载均衡。
    2)第二种方式,域名解析可以配置内部的策略,返回离客户端最近的主机,或者返回当前服务质量最好的主机,这样在DNS端把请求分发到不同的服务器,实现负载均衡。

前面提到的都是可信的DNS,如果有一些不怀好意的DNS,那么他也可以在域名这方面做手脚,弄一些比较恶意的玩法:

  1. 域名屏蔽,对域名直接不解析,返回错误,让你无法拿到IP地址,也就无法访问网址。
  2. 域名劫持/域名污染,你要访问A网站,DNS却给了你B网站。

小结

  1. 域名使用字符串来代替IP地址,方便用户记忆,本质上一个名字空间系统;
  2. DNS就像是我们现实世界里的电话本、查号台,统管着互联网世界里的所有网站,是一个超级大管家;
  3. DNS是一个树状的分布式查询系统,但为了提高查询效率,外围有多级缓存;
  4. 使用DNS可以实现基于域名的负载均衡,既可以在内网,也可以在外网。

额外

  1. 早期的域名系统只支持英文,而且顶级域名被限制在三个字符内,但随着互联网的发展现在已经解除了这些限制,可以使用中文做域名,而且在com, net, gov等之外新增了asia, media, museum等许多新类别的顶级域名。
  2. 域名的总长度限制在253个字符内,而一级域名长度不能超过63个字符。
  3. 域名是大小写无关,但通常都是用小写的形式
  4. 过长的域名或过多的层次关系,也会导致与IP地址同样难于记忆的问题,所以常见的域名大都是两级或三级,四级以上的很少见。
  1. 解析流程: www.不存在.com -> Hosts 文件 -> 操作系统本地缓存 -> 非权威域名服务器查询其缓存 -> 查询根域名、顶级域名、以及域名服务器,当后面的查询得到结果时,将会写入本地缓存
  2. DNS失效会怎么样?: 首先,我们的目标的 IP 地址就会因此无法被正确解析到,因此将无法打开页面,即域名屏蔽;如果 DNS 错误得将域名解析道错误的 IP 地址上,即域名污染。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,711评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,079评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,194评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,089评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,197评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,306评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,338评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,119评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,541评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,846评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,014评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,694评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,322评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,026评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,257评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,863评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,895评论 2 351

推荐阅读更多精彩内容

  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,594评论 2 57
  • 域名(Domain Name),是由一串用 点 分隔的名字 组成的 Internet 上某一台计算机或计算机组的名...
    蓝白自由阅读 2,118评论 1 11
  • 个人认为,Goodboy1881先生的TCP /IP 协议详解学习博客系列博客是一部非常精彩的学习笔记,这虽然只是...
    贰零壹柒_fc10阅读 5,051评论 0 8
  • 1. 基础知识 1.1 3种常见的计算机体系结构划分 OSI分层(7层):物理层、数据链路层、网络层、传输层、会话...
    Mr希灵阅读 19,864评论 6 120
  • 百度百科中的DNS介绍DNS介绍 DNS(Domain Name System,域名系统),万维网上作为域名和i...
    Smi1e_阅读 4,466评论 1 10