访问 URL 时发生了什么
status
category
date
summary
slug
icon
tags
password
计算机网络的相关知识非常重要,但《计算机网络》这门专业课在大三下的后半学期开设,这意味着很多学生收到互联网公司研发岗位的 offer 时,他们还没有上过计网专业课。学习方式当然是自学,一本《自顶向下方法》再加上网上流传的面经,也足以了解一些计网的基本概念。但我不是想说学校教学和社会需求脱节,只是说到计网,我首先想到的不是什么几层模型,而是一个经典的问题,这个问题在团队面试时我也问过别人:在浏览器输入一个网址并打开,这个过程发生了什么?
DNS 解析——从域名到 IP
DNS 全称为 Domain Name System,是一个映射域名和 IP 地址的分布式数据库。只有知道了 IP 地址,才能进行网络通信,而 DNS 的作用就是通过域名查找其相应的 IP。这样做的好处有两点:
- 域名比 IP 地址更方便记忆
- 当 IP 地址修改时,只需要修改 DNS 解析记录,域名没有修改,但指向了不同的地址
DNS 解析的指向既可以是 IP 地址,也可以是另一个域名。例如本站在搭建博客时,域名既可以指向自己的服务器 IP,也可以指向自己的 GitPages 域名。DNS 解析有多个步骤,并且会通过缓存来加快解析速度,缓存的有效时间可以通过域名解析时的 TTL(Time to Live) 属性进行设置。当我们在地址栏输入 rimson.top 并按下回车的时候,DNS 的解析一般会经历以下步骤:
- 浏览器缓存:浏览器会将域名解析得到的 IP 地址缓存一段时间,浏览器缓存的时间和 TTL 无关,且不同浏览器的策略各不相同,所以常常出现一些问题。例如本站在迁移时修改了 DNS 解析记录,但修改成功之后我日常使用的 Chrome 浏览器缓存仍然指向旧地址,导致无法打开网址。但是 Safari 可以打开说明 DNS 解析已经更新成功,在清除 Chrome 缓存和历史记录之后才能成功访问新地址。
- 系统缓存:操作系统级别的缓存,缓存的时间会参考 TTL,但并不完全和 TTL 相等。缓存常常记录在本地的 hosts 文件中,病毒可以修改本地 hosts 文件使得域名指向恶意 IP,浏览器不会判断而是直接进行连接。
- 路由器缓存:路由器可能有自己的 DNS 缓存
- 本地 DNS 服务器缓存:由例如中国电信等网络服务商提供,缓存时间一般会严格按照 TTL 参数。阿里云的默认 TTL 为 10 分钟,而 GitPages 最慢可能要到 24 小时。
- 域服务器查询:上面的缓存没有找到或者过期,则开始在域服务器中查询真实且最新的域名 IP 映射关系。
域服务器查询由 本地 DNS 服务器发起,查询 rimson.top 地址大致分为以下步骤:
- 根服务器:全球有 13 台根服务器,根服务器返回了顶级域名 .top 的地址,顶级域名还包括 .com 等等
- 顶级域名服务器:向上一步返回的地址发送请求,查询 rimson.top 的地址。所有的 *.top 的地址(例如 rimson.top 和 rimsonliu.top)都保存在 .top 顶级域名服务器中
- 域服务器:rimson.top 指向的服务器,这时已经获得了真实的 IP 地址,结束查询
本地 DNS 服务器经过上面的查询后,会将域名和 IP 地址的映射写入缓存,以便备查。
HTTP 请求
DNS 解析帮助我们将域名翻译为 IP 地址,然后就向该地址发送 HTTP 请求。
渲染 HTML
HTTP 请求的返回结果,主体是一段 HTML,浏览器负责将这段文本形式的 HTML 渲染为丰富的页面样式。
参考:
Loading...