What happens when (一)DNS
访问网站时,从输入 URL 到显示页面间发生了什么?
这是个老生常谈的话题。大一时在科创社有次分享就是围绕这个展开。想想某个简单的功能背后是如何实现的,这就是 What happen when 问题。
众所周知,访问网页的流程是:输入网址敲回车->查 DNS->找到 IP 地址->通过 TCP 三次握手建立连接->浏览器发送 Http 请求->收到回应->浏览器渲染页面->结束连接
但是具体细节如 DNS 怎么查,TCP/IP 中各个协议间的关系,三次握手四次挥手的目的,http 与 https,长连接与短连接的问题,就不太能说清了。本系列将会梳理整个过程涉及到的知识点。这次从 DNS 说起。
一、概述
**DNS(Domain Name System)**,用来将域名翻译为 IP 地址。最早的地址是手动分配的:
“在工作时间内,通过电话联系SRI的NIC(网络信息中心),将自己的主机名与地址告诉他们,写入集中式主机表。”
这时候有了域的概念,如教育机构的计算机应该属于 edu.
域。后来,手动维护一个集中主机表变得越来越复杂,于是有了 DNS 协议。DNS 在 1983 年 11 月在因特网标准草案 RFC822
发布。原文地址: https://tools.ietf.org/html/rfc882
域名空间采用树结构, 全球 13 组根域名服务器以英文字母 A 到 M 依序命名。
在域名中 com. org. cn. 这些是顶级域名,结尾的.号可以省略,URL 再往前是二级域名、三级域名。
二、查询域名过程
查询域名的IP,第一步是检查浏览器的本地缓存,之后检查本机缓存(host),在 Windows 中为C:\Windows\System32\drivers\etc\hosts
,在 Linux 中是 /etc/hosts
。接下来是本地 DNS 服务器缓存,也就是 LDNS,使用递归查找。本地 DNS 服务器若还没找到,则去请求根域名服务器,从树的顶点迭代向下查,找到顶级域名服务器地址,继续查找,直到找到。如图所示:
dns.ip.cn 这里列出了一些公共 DNS 服务器的IP地址,有我们熟悉的114.114.114.114,8.8.8.8以及各大运营商的各省 DNS 服务器。
DNS 主要在端口号 53 上使用 UDP 来完成请求。DNS 查询由客户端的单个 UDP 请求和服务器的单个 UDP 响应组成。当答案的长度超过 512 字节时,若客户端和服务器均支持 EDNS 时,将使用较大的UDP数据包。否则,将使用 TCP 再次发送。
三、DNS 记录
在官方网站,可以看到根域名服务器的顶级域名文件 https://www.iana.org/domains/root/files ,下载来的 root.zone 文件只有2.09MB。根 DNS 服务器的记录,截止目前共有 22016 行,每一个顶级域名都会有若干条记录,比如 me. 这个顶级域名,前五行指向了五个 me. 顶级域名的 DNS 服务器域名,他们的 IP 地址在后续记录,每个都支持 IPV4 与 IPV6.
记录有 A、CNAME、MX、NS、TXT、SPF 等多种类型,位于倒数第二列。其中:
A/AAAA: IPv4 与 IPv6 地址
CNAME: 别名,指向原名
MX: 邮件路由记录,指向邮件服务器
NS: 指向域名解析服务器
DS: TXT: 说明性的字符
SPF: TXT 的一种运用,发信侧在 SPF 记录备注规则(如自身 IP),接收方可以通过查询,决定是否接受
四、DNS 负载均衡: CDN (内容分发网络)
仅仅一台服务器很难应付高并发、远距离的可靠连接,故而需要负载均衡技术。CDN 使用了 DNS 负载均衡:
①当用户点击网站页面上的内容 URL,经过本地 DNS 系统解析,DNS 系统会最终将域名的解析权交给CNAME指向的 CDN 专用 DNS 服务器。
②CDN 的 DNS 服务器将 CDN 的全局负载均衡设备 IP 地址返回用户。
③用户向 CDN 的全局负载均衡设备发起内容 URL 访问请求。
④CDN 全局负载均衡设备根据用户IP地址,以及用户请求的内容 URL,选择一台用户所属区域的区域负载均衡设备,告诉用户向这台设备发起请求。
⑤区域负载均衡设备会为用户选择一台合适的缓存服务器提供服务,选择的依据包括:根据用户IP地址,判断哪一台服务器距用户最近;根据用户所请求的 URL 中携带的内容名称,判断哪一台服务器上有用户所需内容;查询各个服务器当前的负载情况,判断哪一台服务器尚有服务能力。基于以上这些条件的综合分析之后,区域负载均衡设备会向全局负载均衡设备返回一台缓存服务器的IP地址。
⑥全局负载均衡设备把服务器的 IP 地址返回给用户。
⑦用户向缓存服务器发起请求,缓存服务器响应用户请求,将用户所需内容传送到用户终端。如果这台缓存服务器上并没有用户想要的内容,而区域均衡设备依然将它分配给了用户,那么这台服务器就要向它的上一级缓存服务器请求内容,直至追溯到网站的源服务器将内容拉到本地。
—— 《CDN 技术详解》
在 Linux 下用 dig
命令看看 DNS 如何解析饿了么官网 ele.me
1 |
|
找到 me. 的五顶级域名服务器,选一个看:
1 |
|
获得两个阿里巴巴的 DNS 域名,ns1.alibabadns.com
与 ns2.alibabadns.com
,继续查
1 |
|
找到了饿了么的两个 IP 地址。也可以使用 nslookup 命令查询,在 Windows 下分别查询 ele.me 与 www.ele.me:
1 |
|
试一试访问 ele.me 会发生什么。首先是302的状态码,把我们重定向至 www.ele.me 。
之后是访问 www.ele.me 的地址 47.92.21.245 ,获得了一些 js 文件。
文件让我们继续访问 https://shadow.elemecdn.com/god/WEB://www.ele.me 。
地址是 113.200.15.85,根据域名判断,显然是它的一个 CDN 服务器。
原本打算一次写完,结果一个 DNS 就写了好多。先到这里吧。
参考资料:
https://segmentfault.com/a/1190000002578457 利用dns解析来实现网站的负载均衡
https://www.jianshu.com/p/b483300378af DNS的A、CNAME、MX、NS、TXT、SPF记录