你要访问 www.apple.com
,就要进行下面的三次查询:
-
访问
根域名服务器
,它会告诉你com
顶级域名服务器的地址; -
访问
com
顶级域名服务器,它再告诉你apple.com
域名服务器的地址; -
最后访问
apple.com
域名服务器,就得到了www.apple.com
的地址
操作系统里也会对 DNS 解析结果做缓存,如果你之前访问过 www.apple.com
,那么下一次在浏览器里再输入这个网址的时候就不会再跑到 DNS 那里去问了,直接在操作系统里就可以拿到 IP 地址。
键入网址再按下回车,后面究竟发生了什么?
- 浏览器从地址栏的输入中获得服务器的 IP 地址和端口号;
如果浏览器看到了网址是
www.chrono.com
,发现它不是数字形式的 IP 地址,那就肯定是域名了,于是就会发起域名解析动作,通过访问一系列的域名解析服务器,试图把这个域名翻译成 TCP/IP 协议里的 IP 地址。
-
浏览器用 TCP 的三次握手与服务器建立连接;
-
浏览器向服务器发送拼好的报文;
-
服务器收到报文后处理请求,同样拼好报文再发给浏览器;
-
浏览器解析报文,渲染输出页面。
在域名解析的过程中会有多级的缓存,浏览器首先看一下自己的缓存里有没有,如果没有就向操作系统的缓存要,还没有就检查本机域名解析文件 hosts。
做个总结:
-
HTTP 协议基于底层的 TCP/IP 协议,所以必须要用 IP 地址建立连接;
-
如果不知道 IP 地址,就要用 DNS 协议去解析得到 IP 地址,否则就会连接失败;
-
建立 TCP 连接后会顺序收发数据,请求方和应答方都必须依据 HTTP 规范构建和解析报文;
-
为了减少响应时间,整个过程中的每一个环节都会有缓存,能够实现“短路”操作;
比如 CDN,因为 CDN 会缓存网站的大部分资源,比如图片、CSS 样式表,所以有的 HTTP 请求就不需要再发到目标服务器,CDN 就可以直接响应你的请求,把数据发给你。
思考:如果访问的是一个不存在的域名,那么浏览器的工作流程会是怎么样的呢?
首先浏览器判断是不是 IP 地址,不是则进行域名解析,依次通过
浏览器缓存 -> 系统缓存 -> host文件
,还是没找到(域名映射的 IP 地址),则请求 DNS 服务器获取 IP 解析(解析失败的浏览器尝试换别的 DNS 服务器,最终失败的进入错误页面),如果某 CDN 服务器获取到了 IP 地址,访问 CDN 时先看是否缓存了,缓存了则直接响应用户,无缓存或者缓存失效,则回源到服务器。经过防火墙外网网管路由到 Nginx 接入层。Nginx 缓存中存在的直接返回,不存在的负载到 Web 服务器。Web 服务器接受到请后处理,路径不存在404。存在的直接返回结果。原路返回,CDN 加入缓存响应用户。
网友评论