从输入url到浏览器显示页面,发生了什么?(网络通信篇)

这是很出名的一道题,我们分成两部分来看这道题:网络通信浏览器渲染。本篇将只介绍网络通信,浏览器渲染留待下文。

TCP/IP 协议族

计算机与网络设备要互相通信,双方就必须基于相同的规则。比如如何探测通信目标、由哪一边先发起通信、用哪种语言进行通信、硬件如何通信,所有的一切都需要有一个规则。我们把这种规则称为协议(protocol)。

需要建立规则的事务很多,每种事务都有其对应的规则(协议)。而这所有互联网相关的协议集合我们称作 TCP/IP 协议族。

TCP/IP是互联网相关的各类协议族的总称

TCP/IP 通信传输流

TCP/IP 分为四层: 应用层、传输层、网络层、数据链路层。发送端从应用层往下走,接收端则从链路层往上走。

从下面这张图我们可以看出 TCP/IP 协议族中包含着 HTTP、TCP、IP 协议,其实还有很多。我们网页从输入 URL 到浏览器能渲染这中间的通信过程就是以下图传输流进行通信的。

TCP/IP 通信传输流

好了,说了这么多,我们来逐步了解一下通信过程。

通信过程

  1. 在浏览器中输入URL

    好,在这里我们有必要了解一下 URIURL 的区别。

    URI 全称: Uniform Resource Identifier,就是说用某种协议来表示资源的定位标识符。 URL 表示资源的位置。所以说 URL 只是 URI 的一部分。

    我们再来看一下 URI 的格式。

    URI 的格式

  2. 应用层DNS进行域名解析

    DNS 和 HTTP 协议一样,也处于应用层。它负责将域名解析成 IP地址

    DNS 查询的顺序如下: 浏览器缓存 –> 系统缓存 –> 路由器缓存 –> ISP(网络服务提供商) DNS 缓存 (第一次访问服务商 DNS 服务器查询 IP 地址时会有一个缓存) –> 递归搜索

    DNS 通过域名解析IP

  3. 应用层客户端发送一个想看某页面的HTTP请求

    HTTP 请求分为请求头和请求主体。请求主体就是客户端要发送给服务器或者服务器返回给客户端的内容,请求头包含 通信方式(POST/GET/INPUT/DELETE…)、URI、协议版本号以及请求首部方法(Accept、Cache-Control…)。

    如果是响应的话,响应头就由 协议版本号、状态码、状态码原因短语以及首部方法(Set-Cookie、Allow…)组成。

  4. 传输层TCP传输报文

    为了传输方便,在传输层(TCP协议)把从应用层处接收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号以及端口号(默认80)后转发给网络层。

    TCP 为了确认无误地将数据送达目标处,采用了三次握手(three-way handshaking)策略。发送端想送一个带 SYN 标志的数据包给对方,接收端收到后,会穿一个带有 SYN/ACK 标志的数据包来传达确认信息。最后,发送端再回传一个带有 ACK 标志的数据包,代表 “握手” 结束。

    TCP 三次握手

  5. 网络层IP协议查询MAC地址进行数据包的传输

    IP协议负责把各种数据包传送给对方。如果要保证确实能传输到对方,需要确定接收方的 MAC地址IP地址 是指节点被分配到的地址,可变, MAC地址 是指网卡所属的固定地址,一般不会变。IP地址 可以和 MAC地址 通过映射表一一配对上的,而 IPMAC 的解析过程则依赖于 ARP 协议,它可以根据通信方的 IP地址 反查出对应的 MAC地址

    而一般通信双方是无法直接进行通信的(除非在同一局域网),会经过多台计算机或路由器来进行中转,所以也就需要 ARP 来一路确认下一个中转站,协助数据包的传输。

    ARP传输

  6. 链路层进行数据传输

    找到对方的 MAC地址 后,就会将数据发送到链路层,通过链路层来进行数据最终传输。此时,客户端发送请求阶段结束。

  7. 服务器接收数据

    接收端的服务器在链路层接收到数据包,再层层向上直到应用层。这过程中包括在运输层通过TCP协议将分段的数据包重新组成原来的HTTP请求报文(发送端TCP分割数据时打上的序号就是用来还原的)。

  8. 服务器响应请求

    前面说过,响应请求头包括 协议版本号、状态码、状态码原因短语以及响应首部方法。状态码分为五类:

    状态码

    其中常见的包括 200 OK——成功, 301 (URL)——重定向, 404 Not Found——客户请求资源找不到。

    值得一提的是,目前很多网站都会有一个重定向功能,比如你省去了 www.,它会给你重定向来添加上。这也就意味着初次请求 HTML 的过程中我们需要发起两次请求。

    这样做的原因在于搜索引擎会认为 www.xx.comxx.com 是两个网站,从而造成网站排名下降。还有如果两个地址都有打开过,会造成多余(双倍)的浏览器缓存。

  9. 服务器返回相应文件

    请求成功后,服务器会返回相应的HTML文件


接下来就到了页面的渲染阶段了。

热评文章