透视HTTP协议
罗剑锋(Chrono)
奇虎360技术专家,Nginx/OpenResty开源项目贡献者
立即订阅
6077 人已学习
课程目录
已完结 44 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词|To Be a HTTP Hero
免费
破冰篇 (7讲)
01 | 时势与英雄:HTTP的前世今生
02 | HTTP是什么?HTTP又不是什么?
03 | HTTP世界全览(上):与HTTP相关的各种概念
04 | HTTP世界全览(下):与HTTP相关的各种协议
05 | 常说的“四层”和“七层”到底是什么?“五层”“六层”哪去了?
06 | 域名里有哪些门道?
07 | 自己动手,搭建HTTP实验环境
基础篇 (7讲)
08 | 键入网址再按下回车,后面究竟发生了什么?
09 | HTTP报文是什么样子的?
10 | 应该如何理解请求方法?
11 | 你能写出正确的网址吗?
12 | 响应状态码该怎么用?
13 | HTTP有哪些特点?
14 | HTTP有哪些优点?又有哪些缺点?
进阶篇 (8讲)
15 | 海纳百川:HTTP的实体数据
16 | 把大象装进冰箱:HTTP传输大文件的方法
17 | 排队也要讲效率:HTTP的连接管理
18 | 四通八达:HTTP的重定向和跳转
19 | 让我知道你是谁:HTTP的Cookie机制
20 | 生鲜速递:HTTP的缓存控制
21 | 良心中间商:HTTP的代理服务
22 | 冷链周转:HTTP的缓存代理
安全篇 (7讲)
23 | HTTPS是什么?SSL/TLS又是什么?
24 | 固若金汤的根本(上):对称加密与非对称加密
25 | 固若金汤的根本(下):数字签名与证书
26 | 信任始于握手:TLS1.2连接过程解析
27 | 更好更快的握手:TLS1.3特性解析
28 | 连接太慢该怎么办:HTTPS的优化
29 | 我应该迁移到HTTPS吗?
飞翔篇 (4讲)
30 | 时代之风(上):HTTP/2特性概览
31 | 时代之风(下):HTTP/2内核剖析
32 | 未来之路:HTTP/3展望
33 | 我应该迁移到HTTP/2吗?
探索篇 (5讲)
34 | Nginx:高性能的Web服务器
35 | OpenResty:更灵活的Web服务器
36 | WAF:保护我们的网络服务
37 | CDN:加速我们的网络服务
38 | WebSocket:沙盒里的TCP
总结篇 (2讲)
39 | HTTP性能优化面面观(上)
40 | HTTP性能优化面面观(下)
答疑篇 (2讲)
41 | Linux/Mac实验环境搭建与URI查询参数
42 | DHE/ECDHE算法的原理
结束语 (1讲)
结束语 | 做兴趣使然的Hero
透视HTTP协议
登录|注册

06 | 域名里有哪些门道?

Chrono 2019-06-10
在上一讲里,我们学习了 HTTP 协议使用的 TCP/IP 协议栈,知道了 HTTP 协议是运行在 TCP/IP 上的。
IP 协议的职责是“网际互连”,它在 MAC 层之上,使用 IP 地址把 MAC 编号转换成了四位数字,这就对物理网卡的 MAC 地址做了一层抽象,发展出了许多的“新玩法”。
例如,分为 A、B、C、D、E 五种类型,公有地址和私有地址,掩码分割子网等。只要每个小网络在 IP 地址这个概念上达成一致,不管它在 MAC 层有多大的差异,都可以接入 TCP/IP 协议栈,最终汇合进整个互联网。
但接入互联网的计算机越来越多,IP 地址的缺点也就暴露出来了,最主要的是它“对人不友好”,虽然比 MAC 的 16 进制数要好一点,但还是难于记忆和输入。
怎么解决这个问题呢?
那就“以其人之道还治其人之身”,在 IP 地址之上再来一次抽象,把数字形式的 IP 地址转换成更有意义更好记的名字,在字符串的层面上再增加“新玩法”。于是,DNS 域名系统就这么出现了。

域名的形式

在第 4 讲曾经说过,域名是一个有层次的结构,是一串用“.”分隔的多个单词,最右边的被称为“顶级域名”,然后是“二级域名”,层级关系向左依次降低。
最左边的是主机名,通常用来表明主机的用途,比如“www”表示提供万维网服务、“mail”表示提供邮件服务,不过这也不是绝对的,名字的关键是要让我们容易记忆。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《透视HTTP协议》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(45)

  • stormyif
    GFW就是使用了这些恶意的DNS

    作者回复: ……

    2019-06-10
    5
    70
  • 肥low
    老师好!

    第一个问题:
        1、检查本地dns缓存是否存在解析"www.不存在.com"域名的ip
        2、如果没有找到继续查找本地hosts文件内是否有对应的固定记录
        3、如果hosts中还是没有那就根据本地网卡被分配的 dns server ip 来进行解析,dns server ip 一般是“非官方”的ip,比如谷歌的“8.8.8.8”,本身它也会对查找的域名解析结果进行缓存,如果它没有缓存或者缓存失效,则先去顶级域名服务器“com”去查找“不存在.com”的域名服务器ip,结果发现不存在,于是直接返回告诉浏览器域名解析错误,当然这两次查找过程是基于udp协议

    第二个问题:如果dns失效或出错,那就访问不了了呗,我现在有个域名在国外某些国家每天都有不少访问失败的http请求,客户端直接报“Failed host lookup”的错误

    作者回复: √

    2019-06-13
    1
    13
  • 何用
    为何全世界只有 13 组根域名服务器呢?

    作者回复: 细节原因不好解释,简单来说是因为dns协议还有udp协议里包大小的限制,只有512字节,再除以dns记录长度,最多15组,再去掉buffer。

    2019-06-10
    10
  • Wendy
    比如你有一个网站要上线,你在域名注册商那里申请了abc.com,那么你的域名A记录就保存在这个域名注册商的DNS服务器上,该DNS服务器称为权威域名服务器。当客户端访问abc.com时,先查找浏览器DNS缓存,没有则查找操作系统DNS缓存,在这一阶段是操作系统dnscache clinet 服务进行DNS缓存的(你在任务管理器里面可以看到一个dns客户端进程,就是这玩意实现缓存的),如果还是没有则查找hosts文件中的域名记录。然后依然没有的话则访问电脑上设置的DNS服务器IP,比如三大营运商的dns服务器或者谷歌的8.8.8.8,此时这一层的DNS服务器称为“野生DNS缓存服务器”,也就是非权威域名服务器。如果还是没有则非权威域名服务器会去查找 根域名服务器-顶级域名服务器-二级域名服务器-权威域名服务器 ,这样客户端就在权威域名服务器上找到了abc.com对应的IP了,这个IP可以是多个,每次客户端请求的时候域名服务器会根据负载均衡算法分配一个IP给你。当DNS缓存失效了,则重新开始新一轮的域名请求。
    总结如下:
    浏览器缓存->操作系统dnscache ->hosts文件->非权威域名服务器->根域名服务器->顶级域名服务器->二级域名服务器->权威域名服务器。
    其中非权威域名服务器还包括LDNS(企业内网DNS服务器),三大营运商DNS,谷歌公开的DNS,微软公开的DNS等。
    另外DNS请求有两种方式:递归查询和迭代查询,这方面大家可以网上了解一下。LDNS往后面查询一般是递归查询,因为公司内网是有防火墙的,全部请求通过LDNS来递归查询然后把结果给内网用户。
    以上为自己理解整理的,若有错误还请大家指正。

    作者回复: 整理的非常完善非常好,感谢补充!

    2019-08-31
    9
  • Chuan
    老师好:
    对于DNS解析的过程:浏览器DNS缓存->操作系统缓存->Hosts文件->非权威域名服务器->根域名服务器->顶级域名服务器->权威域名服务器。一直对浏览器/本机如何知道根服务器地址存在疑惑。
    在查阅《计算机网络自顶向下方法》后发现,我们在连接某个ISP时,ISP一般会给我们提供一个IP地址,同时该地址拥有一台或多台DNS服务器地址(通过DHCP)。所以我们在Hosts文件中找不到时,会去查询这个局域网DNS服务器,如果没有查到,它会帮我们去查询根NDS服务器、顶级域名服务器和权威域名服务器,然后返回给本机,同时进行缓存。
    个人认为,如果我们自己配置了非权威DNS服务器,如8.8.8.8,它应该也会帮我们去查询根NDS服务器、顶级域名服务器和权威域名服务器。
    这些远程查询都是基于UDP协议,通常使用53号端口。
    不知道以上理解是否正确?

    作者回复: 是的,你学习的很仔细。

    一般上网的时候都会有默认dns,都配置好了,所以通常都感觉不到。

    但默认dns有的时候性能不好,所以才会有很多的免费dns。

    2019-06-28
    1
    8
  • 初音未来
    应该是先查找本地hosts文件,在查找缓存吧

    作者回复: 浏览器缓存->操作系统缓存->hosts->dns

    2019-06-12
    7
  • 梦倚栏杆
    老师好,我有两个疑问:
    1.终极dns的解析是有谁实现的或者谁规定的:
    比如乔布斯有个苹果域名:www.apple.com,苹果电脑的官网;张三也想为水果苹果申请个域名(www.apple.com)来展示他的苹果;结果我们几乎可以猜测到,他是申请失败的,原因已经有一个苹果存在了,谁来评判这个苹果域名已经被占用了呢?判断逻辑是如何来的,如果两个申请发生在同时呢?
    2. ip地址的分配和身份证号一样吗?有地址在里面吗?
    比如1-45属于美国的网段,或者属于哪个超大公司的网段。如果有,那是不是就以为着预分配,也就意味着部分ip段的浪费,如果没有,那ip地址从一个地方查找另外一个地方怎么找呢?莫非每个初始的线路都需要访问到根DNS

    作者回复: 域名由专门的域名注册机构管理,终极的是ICANN。
    IP地址的分配也由ICANN管理,当然有浪费,美国是互联网的发明国,所以占用ip地址最多。

    ip地址查找由专门的协议,比如arp。

    这些比较偏底层,离http比较远,可以再找其他资料学习。。

    2019-06-10
    5
  • zjajxzg
    1、操作系统缓存→本地hosts文件→非核心dns服务器→根域名服务器地址→顶级域名服务器地址→二级域名服务器地址。。。
    2、无法访问相应的资源

    作者回复: 第一个没说完,第二个问题可以再说的详细一些。

    2019-06-10
    5
  •        鸟人
    修改hosts绕过gfw
    2019-06-14
    1
    3
  • Reco
    老师您好,之前碰到过这样一个问题
    域名解析返回两个IP地址,其中一个IP无法正常访问。
    Safari可以自动切换到正常的IP地址继续访问
    Chrome会尝试TCP连接不正常的IP,大约1分多钟之后会连接另一个IP
    最终导致Chrome页面访问速度缓慢。想问下这种问题是属于浏览器问题,还是DNS的问题呢?

    作者回复: 这个应该是浏览器的重连策略问题,dsn解析结果已经出来了,就已经跟dns无关了。

    2019-06-10
    1
    3
  • -W.LI-
    老师好!1.2.3.4改成5.6.7.8后访问不到浏览器会自动重试解析DNS是么?从事的时候使用野生还是专业的有啥策略?重试几次,DNS集群的域名是最终一致还是强一致。
    1.操作系统缓存不存在,host文件不存在,访问DNS服务器,根域名解析成功,二级域名解析失败,重试还是失败。浏览器返回错误。
    2走失败策略,最终还是失败的就错误页面。

    作者回复: dns解析出ip后访问失败就不会再解析了。
    浏览器的重试策略跟具体实现有关,这个我也不清楚。
    dns是最终一致。

    2019-06-10
    2
  • - shadow -
    想问问老师,域名的“新玩法”的第一种和第三种在现实环境中真的会使用吗?主要是各级缓存的存在,可能会导致找不到最新的IP,而拿到的是旧的IP呢?

    作者回复: 域名的这些用法在现实中都有用到,但网站服务器变更时不会立即下线,而是等一段时间,当过了dns缓存有效期,新的dns解析结果全网生效时再把旧服务器下线,这时旧服务器已经没有dns解析后的流量了。

    2019-09-27
    1
    1
  • Even
    有个疑问,操作系统的dns缓存存在哪里?内存还是硬盘?为什么有hosts文件还需要操作系统的dns缓存。

    作者回复:
    1.具体不清楚,应该是都有

    2.hosts文件是方便用户自己添加dns解析,与操作系统的目的不同,它不是缓存,而是一个简单的dns解析器。

    2019-08-05
    1
  • missing~~
    nginx中的resolve配置dns服务器,这个没太理解,我一直以为是先通过域名解析到ip之后,才找到相应的主机,加载nginx配置。老师,请教一下这个顺序关系

    作者回复: Nginx的里的resolver是给连接后端服务器用的,如果Nginx配置反向代理,用域名的方式指定后端服务器,就必须要用resolver把域名转换成ip地址。

    这个指令不影响客户端,客户端是用本地dns解析出服务器的ip地址,连接网站。

    2019-07-03
    1
  • 小美
    1. www.不存在.com -> Hosts 文件 -> 操作系统本地缓存 -> 非权威域名服务器查询其缓存 -> 查询根域名、顶级域名、以及域名服务器,当后面的查询得到结果时,将会写入本地缓存
    2. - 首先,我们的目标的 IP 地址就会因此无法被正确解析到,因此将无法打开页面,即域名屏蔽;如果 DNS 错误得将域名解析道错误的 IP 地址上,即域名污染。

    提问一下,浏览器本身是不是也会对 DNS 缓存以提高访问速度?

    作者回复: 回答的基本正确。

    是的,课程里好像说了,浏览器内部也会缓存dns的。

    2019-06-12
    1
  • 团结屯儿王二狗他二大爺
    建议把每节的课后作业,在下一节中,把答案给大家说一下。毕竟有说的不对的地方,也算个参考

    作者回复: 我个人觉得还是自己想出答案比较好,统一的“标准答案”反而不利于学习,其实留言里的很多都回答的挺好的。

    2019-06-11
    1
  • pyhhou
    思考题:
    1、操作系统首先会在其缓存和 HOST 文件中去找域名对应的 IP 地址,如果本地中没有记录,则会去 DNS 服务器中查找,按照 DNS 服务器的树状结构,层级进行访问查找,对于 “www.” 这样的请求,在第一层,也就是根域名服务器中是找不到下一层的域名服务器的,于是就返回错误给客户端,不继续往下找
    2、看 DNS 服务器的返回错误内容吧,如果是返回错误请求或者内部错误告知的话,客户端这边可以相应地做一些响应异常处理;还有一种情况是 DNS 返回一个不存在的 IP 地址,或者是映射到错误的 IP 地址,个人认为前者的影响会小一些,顶多是请求页面 404 报错,后者的话则会误导用户,比如你输入了 “www.apple.com”,弹出的是 Google 搜索栏

    这里想请教老师几个问题,可能有点超出 HTTP 的范畴,但是还是比较好奇
    1、如果说我们应用域名的一些技术,比如文中说的重定向,负载均衡等等,这些技术都涉及到了域名和 IP 映射关系的改变,那么这些改变只是在其对应的 DNS 代理服务器上改变吗,还是说代理服务器立刻会将该改变内容发送到 DNS 核心服务器去?
    2、另外就是操作系统的缓存和 HOST 文件是不是需要定期的人工检查,排除域名和 IP 对应的改变?

    作者回复: “野生”dns服务器本质上只是缓存,它不能影响核心dns系统,而是核心dns改变它的值。

    如果你自己搭dns服务器那么就没有这些问题了。

    第二个,hosts文件需要人工维护,可以自己添加,而操作系统缓存是自动管理的。通常都不需要做修改,除非有些特殊域名被“攻击”,只能手动改hosts实现解析。

    2019-06-11
    1
  • 极客时间
    这句话不是太明白 “第一种方式,因为域名解析可以返回多个 IP 地址,所以一个域...

    域名不是只能绑定一个ip地址吗?为什么解析的时候会返回多个ip呢? 我是哪里读漏了吗?

    作者回复: 一个域名可以对应多个ip地址,不一定是一个,所以域名能够实现负载均衡。

    2019-06-11
    1
  • 我行我素
    老师,想请问下,当域名所对应的ip发生变化的时候,因为本地或者"野生"域名服务器上的ip是怎么发生变化的呢?因为在域名所对应的ip发生变化的时候应该是通知的权威域名服务器吧

    作者回复: 域名解析有个ttl有效期,到期就会去上一级dns重新获取,当然也可以主动刷新。

    2019-06-10
    1
  • keep it simple
    老师,学完这课我有两个疑问:
    1.大企业为什么要建设8.8.8.8这样的DNS服务器,他们有什么好处?是否是搜集更多用户流量,为自己的产品运营做大数据分析?
    2.基于DNS的负载均衡中,比如一个域名同时返回两个IP,哪个在前哪个在后有关系吗?不同客户端是不是都会选择排在前面的那个IP来访问呢?

    作者回复:
    1.的确有很多公司会搭建公共dns,给广大网民免费使用,出发点有很多,不能妄自猜测,但确实可以收集到数据。

    2.dns解析域名可以内部定制策略,设置权重按优先级返回ip地址,但除非特殊说明,这些ip地址都是平等的。客户端也可以任意选择,双方都有各自的主动权。

    2019-11-20
收起评论
45
返回
顶部