这是很出名的一道题,我们分成两部分来看这道题:网络通信和浏览器渲染。本篇将只介绍网络通信,浏览器渲染留待下文。
TCP/IP 协议族
计算机与网络设备要互相通信,双方就必须基于相同的规则。比如如何探测通信目标、由哪一边先发起通信、用哪种语言进行通信、硬件如何通信,所有的一切都需要有一个规则。我们把这种规则称为协议(protocol)。
需要建立规则的事务很多,每种事务都有其对应的规则(协议)。而这所有互联网相关的协议集合我们称作 TCP/IP
协议族。
TCP/IP 通信传输流
TCP/IP
分为四层: 应用层、传输层、网络层、数据链路层。发送端从应用层往下走,接收端则从链路层往上走。
从下面这张图我们可以看出 TCP/IP
协议族中包含着 HTTP、TCP、IP
协议,其实还有很多。我们网页从输入 URL
到浏览器能渲染这中间的通信过程就是以下图传输流进行通信的。
好了,说了这么多,我们来逐步了解一下通信过程。
通信过程
在浏览器中输入URL。
好,在这里我们有必要了解一下
URI
和URL
的区别。URI
全称:Uniform Resource Identifier
,就是说用某种协议来表示资源的定位标识符。URL
表示资源的位置。所以说URL
只是URI
的一部分。我们再来看一下
URI
的格式。应用层DNS进行域名解析
DNS
和 HTTP 协议一样,也处于应用层。它负责将域名解析成IP地址
。DNS
查询的顺序如下: 浏览器缓存 –> 系统缓存 –> 路由器缓存 –>ISP
(网络服务提供商)DNS
缓存 (第一次访问服务商DNS
服务器查询IP
地址时会有一个缓存) –> 递归搜索应用层客户端发送一个想看某页面的HTTP请求
HTTP
请求分为请求头和请求主体。请求主体就是客户端要发送给服务器或者服务器返回给客户端的内容,请求头包含 通信方式(POST/GET/INPUT/DELETE…)、URI、协议版本号以及请求首部方法(Accept、Cache-Control…)。如果是响应的话,响应头就由 协议版本号、状态码、状态码原因短语以及首部方法(Set-Cookie、Allow…)组成。
传输层TCP传输报文
为了传输方便,在传输层(TCP协议)把从应用层处接收到的数据(HTTP请求报文)进行分割,并在各个报文上打上标记序号以及端口号(默认80)后转发给网络层。
TCP
为了确认无误地将数据送达目标处,采用了三次握手(three-way handshaking)策略。发送端想送一个带 SYN 标志的数据包给对方,接收端收到后,会穿一个带有 SYN/ACK 标志的数据包来传达确认信息。最后,发送端再回传一个带有 ACK 标志的数据包,代表 “握手” 结束。网络层IP协议查询MAC地址进行数据包的传输
IP协议负责把各种数据包传送给对方。如果要保证确实能传输到对方,需要确定接收方的
MAC地址
。IP地址
是指节点被分配到的地址,可变,MAC地址
是指网卡所属的固定地址,一般不会变。IP地址
可以和MAC地址
通过映射表一一配对上的,而IP
到MAC
的解析过程则依赖于 ARP 协议,它可以根据通信方的IP地址
反查出对应的MAC地址
。而一般通信双方是无法直接进行通信的(除非在同一局域网),会经过多台计算机或路由器来进行中转,所以也就需要
ARP
来一路确认下一个中转站,协助数据包的传输。链路层进行数据传输
找到对方的
MAC地址
后,就会将数据发送到链路层,通过链路层来进行数据最终传输。此时,客户端发送请求阶段结束。服务器接收数据
接收端的服务器在链路层接收到数据包,再层层向上直到应用层。这过程中包括在运输层通过TCP协议将分段的数据包重新组成原来的HTTP请求报文(发送端TCP分割数据时打上的序号就是用来还原的)。
服务器响应请求
前面说过,响应请求头包括 协议版本号、状态码、状态码原因短语以及响应首部方法。状态码分为五类:
其中常见的包括 200 OK——成功, 301 (URL)——重定向, 404 Not Found——客户请求资源找不到。
值得一提的是,目前很多网站都会有一个重定向功能,比如你省去了
www.
,它会给你重定向来添加上。这也就意味着初次请求HTML
的过程中我们需要发起两次请求。这样做的原因在于搜索引擎会认为
www.xx.com
和xx.com
是两个网站,从而造成网站排名下降。还有如果两个地址都有打开过,会造成多余(双倍)的浏览器缓存。服务器返回相应文件
请求成功后,服务器会返回相应的HTML文件
接下来就到了页面的渲染阶段了。