Web开发学习笔记——浏览器是如何工作的

302 阅读5分钟

Web 开发学习笔记——关于互联网和互联网应用 这篇博客中,我简单介绍了互联网、万维网以及网络应用这些基本概念,这一篇,我来介绍浏览器是如何工作的,或者说,一个经典的面试问题,在浏览器中输入一个网址,按下回车键,在所在地址的网页呈现出来的过程中到底发生了什么?

在接下来的内容中,我将随着以下几个基本概念来解释这个过程,不详之处请各位指正。

  • 网址(URL)
  • IP地址
  • DNS域名系统

网址(URL)的几个部分

在了解整个过程之前,我们有必要先来了解一个网址,也就是 URL 的组成,举个例子,我们以我的 Github 主页地址 github.com/fanyj1994 为例,解剖一下这个网址到底包含了什么。

我们在浏览器的地址栏输入 github.com/fanyj1994,这部分内容就是我们常说的网址,又叫做统一资源定位符,也就是 URL(Uniform Resource Locator),URL 是 URI 的一种常见形式。

那么, URI 又是什么呢?

URI(Unicode Resource Identifier),也叫做统一资源标识符,它是一个用于标识互联网资源的字符串,你可以理解为互联网上每个资源的名字,就像我们每个人的名字一样。除了 URL,还有一种 URI 形式是URN,也叫做统一资源名称,这种形式比较罕见,不多介绍。

在这个 URL 中,https 称为协议,是超文本传输协议的缩写。后面的 github.com 是网站所属的主机名,而后面剩余的部分则是路径。对于一个网站来说,它可能包括很多页面,而这些路径则决定了具体网页所在的位置,有的时候,这些路径会作为子域放到主机的前面。

还有一些网站会加上一些端口号,例如我们常见的80端口,另外,在 GET 模式的窗体下,最后会有以"?"为起点的的查询参数,例如github.com/fanyj1994?t… 中的 tab=repositories 部分则查询的是 tab 为 repositories 的标签页。也就如下图所示:

URL图介

IP地址(Internet Protocol Address)

接下来来介绍一个经常听到的名词:IP 地址

IP 地址是分配给网络上使用网际协议的设备的数字标签,网际协议也就是 IP 协议,IP 协议是TCP/IP 协议中网络层的主要协议,其任务是根据源主机和目的主机的地址传送数据。常见的 IP 地址有 IPv4 和 IPv6 两大类,前者由32位二进制数组成,而后者长度变长,由32位十进制数组成。

也就是说,每一个使用 IP 协议的设备都会有一个独立的 IP 地址,所以,每个网址后面其实也就对应一个独一无二的 IP 地址,来代表网络设备的所在位置。

DNS域名系统(Domain Name System)

我们知道,全世界已经有数百亿台互联网设备,也就是说,已经存在数百亿个 IP 地址,而且这个数字在不断攀升,当输入一个网址,要寻找其对应的 IP 地址就是一项十分艰巨的任务了,而DNS 就是负责这项任务的服务,它是一个域名与 IP 地址相互映射的分布式数据库,它可以将人们不能读懂的 IP 地址转换为相对应的语义化的域名,就像我们看到www.google.com 自然知道这是谷歌搜索,但是看到 216.58.210.142 这串数字并不知道它指向哪里,而事实上这就是 google.com 对应的 IP 地址。

这个查询的基本过程是这样的:客户端(浏览器)会发送一个查询报文(大概是 query google.com 这样的)到 DNS 服务器,DNS 会首先检查自身的缓存,如果已经收录了这个域名,它会直接返回它对应的 IP 地址,如果没有找到,则 DNS 会继续发送查询报文到根域名服务器(最顶级的域名服务器),根域名服务器会返回 .com 域的顶级域名服务器(也即 TLD 服务器 top-level-domain)的地址(人家是顶级的,只管这些顶级域名),得到顶级域名服务器的地址之后,DNS 服务器会接着发送查询报文到这个地址,然后得到 google.com 的权威域名服务器地址,取得这个地址后,DNS 服务器会将这个地址存入自身的缓存(下次再用就不用这么费劲咯)并将结果返回给客户端,然后客户端会根据所得到的 IP 地址,进行定位,并发送请求。

所以 DNS 数据库就像一个具有主观能动性的电话簿,其基本结构如下图。

域名服务器层次图

第二层也就是是权威服务器。

值得注意的是,对于拥有子域名的一些 URL,例如谷歌地图,在 DNS 查询过程中,.com的顶级域名服务器在返回 google.com 的权威域名服务器地址时,会附上它所有子域名(map/translate/play等)的信息,这个过程被形象地称为胶水。

关于更详尽的关于 DNS 系统如何工作,请看这里生动有趣的阐释~

浏览器的工作

了解了这些名词之后,我们正式了解,当在浏览器中输入网址 github.com/fanyj1994 并按下回车后,到拿到这个页面,整个过程发生了什么。

输入地址后,浏览器会通过 DNS 来查找到与这个地址相匹配的 IP 地址 192.30.253.112,发起连接请求(其实就是我们常讲的 TCP 三次握手),等待目标地址(也就是 Github 服务器)确认连接之后,浏览器会发出一个 HTTP 请求(我在下一篇中介绍 HTTP 请求的内容),Github 的服务器收到请求之后,会根据请求进行相关的响应和操作(数据查找之类的),然后会返回一个网页(HTML 页面)或者相应的数据,浏览器接到页面之后,进行解析(CSS 渲染,JS 行为添加等),然后呈现在我们面前。

这就是一次简单的网络访问过程。