当我们在浏览器中输入URL后,背后发生了很多巧妙的处理和数据的传递。这个知识点在面试的时候经常被问到,因为它不仅仅考察了求职人员前端技术水平,更查验了他对整个网络通信知识体系的宏观理解。
1、针对域名进行DNS解析
如果输入的URL是域名而不是IP,会进行这一步的DNS解析操作。解析的目的是为了将域名转换成IP,然后再使用TCP/IP来进行寻址访问。
浏览器解析DNS主要会经过以下几步:
- 检查浏览器自身DNS记录
- 检查操作系统DNS记录(hosts文件)
- 通信服务商(ISP)DNS记录
- 查询域名服务器
在查询域名服务器之前还有一步是查询ISP的DNS记录,这里面存放了许多的DNS缓存条目。这些条目会不定期的刷新,会是一小时也可能会是一整天。所以一般我们新注册的域名绑定IP后,很快就能够解析成功,是因为直接去到域名服务器上查询,而如果是更改域名记录则会需要等待一定的时间才能解析成功。
2、TCP三次握手建立通信
当域名解析成功获得IP地址后,会通过TCP和目标服务器建立TCP通信。建立通信的条件就是客户机与服务器进行三次握手成功:

客户端发送一个带有SYN标志的数据包给服务端,服务端收到后,回传一个带有SYN/ACK标志的数据包以示传达确认信息,最后客户端再回传一个带ACK标志的数据包,代表握手结束,连接成功。
3、HTTP请求与响应
当客户机和服务器之间的TCP链路建立成功之后,客户机便会开始发送HTTP请求报文,请求报文主要由报文首部和报文主体组成:
- 报文首部(URL、请求方法、HTTP版本等信息)
- 报文主体(formdata等数据)
在服务器接收到请求后会进行一系列处理后将数据通过HTTP响应报文的形式返回,格式与请求报文相同。
4、TCP四次挥手断开连接
HTTP是一种无状态协议,在每一次通信完毕之后会将TCP连接关闭。但是在实际情况下,一个网页发起HTTP请求是非常频繁的,一张图片、一个文本、一段数据,而建立TCP连接的开销又是非常耗费资源且没有必要的。所以在HTTP1.1中,对这种短连接进行了改善,增加了长连接的特性。这里的长连接并不是说像WebSocket一样持久连接,而是客户机和服务器之间的TCP连接会在数据传输之后维持一段时间,若再次发生数据传递,则会就地取材利用该链路进行传输,反之则将TCP连接关闭。
在TCP关闭连接的时候,也需要经历四次挥手:

总结来说,上述提到建立TCP连接的三次握手,是用来保障通讯双方有通信的基础,断开时的四次挥手,用来保障通讯双方可以安全的回收TCP通信的系统资源。
5、浏览器解析渲染
浏览器在接收到HTTP响应数据后,会首先进行解析。在HTTP1.1中,数据是采用字符串来进行传输的,也就意味着浏览器从HTTP响应报文的报文主体中取到的是字符串。
以html文件为例,浏览器会将字符串解析成若干个节点(Node),再将节点组合成DOM Tree。在解析html文件的过程中如果遇到外链的CSS或Script文件,则会去异步请求这些资源。
在CSS文件响应完毕后,会在解析DOM Tree的同时将CSS解析成CSS Tree。之后会把两者合并成Render Tree。随后渲染引擎将基于此来进行布局和渲染。
在浏览器处理URL的过程中,还有很多值得深入学习的地方,比如HTTPS、加密技术、JS引擎等,本文只是从宏观的角度来对这个过程进行简要的介绍。

