当在浏览器地址栏输入一个URL并按下回车键后,发生了一系列复杂的过程:
-
DNS解析:浏览器会对输入的URL进行DNS解析,将域名转换为服务器的IP地址。这一过程包括浏览器缓存、操作系统缓存、本地HOST文件配置、本地DNS服务器以及远程DNS服务器的查找。
- 浏览器缓存:浏览器会将之前解析的DNS记录缓存一段时间,以便下次请求相同域名时直接使用缓存记录,而不必重新进行DNS解析。这些缓存通常存储在浏览器的内存中,因此在浏览器关闭后就会被清除。
- 操作系统缓存:如果在浏览器缓存中没有找到对应的DNS记录,则浏览器会向操作系统发起DNS解析请求。操作系统会在自己的DNS缓存中查找记录,如果找到则直接返回给浏览器。操作系统的DNS缓存通常存储在内存中,与浏览器缓存类似,也会在重启后被清除。
- 本地HOST文件:当浏览器缓存和操作系统缓存中找不到对应的域名和IP地址映射关系时,会查找本地HOST文件。如果本地HOST文件中存在对应的映射关系,就会直接使用该IP地址,不再向DNS服务器发送请求,从而提高了DNS解析的效率。如果本地HOST文件中没有对应的映射关系,浏览器才会向DNS服务器发送请求,查找域名对应的IP地址。
- 本地DNS服务器:如果在本地HOST文件中也没有找到对应的DNS记录,则浏览器会向本地DNS服务器发送DNS解析请求。本地DNS服务器通常由网络服务提供商或者企业内部搭建,其缓存可以存储较长时间,从而提高DNS解析的效率。
- 远程DNS服务器:如果在本地DNS服务器中也没有找到对应的DNS记录,则会向远程DNS服务器发送DNS解析请求。远程DNS服务器通常由互联网服务提供商或DNS解析服务提供商提供,它们会负责解析请求,并将结果返回给本地DNS服务器和浏览器。
同时,DNS解析对于保障网络安全、加速网站访问以及提高用户体验都有非常重要的作用:
- 帮助用户快速访问网站:当用户在浏览器中输入网站域名时,DNS会将域名解析为对应的IP地址,使用户能够快速访问该网站。如果DNS解析速度慢或者解析错误,用户将无法访问该网站或者访问速度很慢,这将严重影响用户体验。
- 保障网络安全:DNS解析也可以用来保障网络安全。DNS解析服务提供商可以通过屏蔽恶意域名或者网站来防止恶意软件的传播,从而提高网络的安全性。
- 加速网站访问:CDN(内容分发网络)是基于DNS解析实现的。CDN将网站的内容缓存在离用户较近的服务器上,当用户访问该网站时,DNS服务器会自动选择距离用户最近的服务器提供内容,从而提高网站访问速度。
-
建立TCP连接:浏览器使用解析后的IP地址与服务器建立TCP连接。这一过程涉及TCP的三次握手。客户端会向服务器发送
SYN
(Synchronize Sequence Numbers,同步序列编号)包,服务器回复SYN-ACK
包,客户端再发送ACK
(Acknowledgment,确认序号)包。同时,如果用户访问的是HTTPS网站,则浏览器会对该网站发出的所有请求使用TLS协议进行加密,确保通信的机密性、完整性和真实性。- TCP三次握手的目的是建立起可靠的双向数据传输通道,
SYN
和ACK
是用来在连接建立过程中进行协议交互的标志。简单理解,主要是为了分别检验客户端和服务端的发信、收信能力是否OK。- 客户端发送给服务端SYN包,包含一个随机序号x
- 服务端收到客户端的SYN包,回复一个ACK包,包含x+1, 同时,也会发送给客户端一个SYN包,包含随机序号y;这两个包是在同一次发送的
- 客户端收到服务端的ACK包和SYN包,并回复给服务端一个ACK包,包含y+1
- 服务端收到客户端的ACK包,至此,连接建立
- TCP三次握手的目的是建立起可靠的双向数据传输通道,
-
发送HTTP请求:TCP连接建立后,浏览器根据输入的URL生成HTTP请求,通过已建立的TCP连接发送给服务器。
-
服务器处理请求:服务器接收到浏览器发送的HTTP请求后,会根据请求信息进行处理;处理完成后,服务器会生成一个HTTP响应发送给浏览器。
-
接收HTTP响应:浏览器接收到服务器返回的HTTP响应。
-
解析HTML:浏览器对响应体中的HTML文档进行解析,生成DOM树。这一步中,如果本地缓存中有对应的HTML文件,则会优先使用缓存文件,加快页面加载速度;而不会发起HTTP请求(第3步)。
-
加载资源:浏览器会解析HTML文档中的资源链接(如CSS、JavaScript、图片等),并发起请求获取这些资源。这一步中,如果本地缓存中有对应的资源文件,也会优先使用缓存文件,加快页面加载速度;而不发起加在资源的请求。
-
执行JavaScript:浏览器在加载并解析JavaScript文件后,会执行其代码。JavaScript代码可能会修改DOM树、操作CSS或再次发起请求等。
-
渲染页面:浏览器根据DOM树和CSS样式信息生成渲染树,然后进行布局,将渲染树中的各个节点绘制到屏幕上。
-
处理用户交互:浏览器会监听用户的操作(如点击、滚动等),并根据需要触发JavaScript事件处理函数,更新DOM树和CSS样式,进一步修改页面渲染。在HTTP/1中,先处理用户交互是为了优先响应用户,这是浏览器的核心功能之一;而在HTTP/2中,由于有多路复用的机制,可以复用同一个 TCP 连接的多个请求,因此先处理用户交互,再关闭 TCP 连接可以充分利用这种机制,提高性能。
-
断开TCP连接:当浏览器接收到所有资源并完成渲染后,它会断开与服务器的TCP连接。这个过程涉及TCP的四次挥手,客户端会发送
FIN
包,服务器回复ACK
包和FIN
包,最后客户端回复ACK
包确认连接断开。- 关闭连接时,客户端向服务端发送
FIN
时,仅仅表示客户端不再发送数据了但是还能接收数据。 - 服务端收到客户端的
FIN
报文时,先回一个ACK
应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送FIN
报文给客户端来表示同意现在关闭连接。
总结来说,服务端通常需要等待完成数据的发送和处理,所以服务端的
ACK
和FIN
一般都会分开发送,从而比三次握手多了一次。 - 关闭连接时,客户端向服务端发送
- 缓存:为了提高网站的访问速度,浏览器会将一些资源(如图片、脚本、样式表等)缓存在本地。下次用户再访问该网站时,浏览器会先检查本地缓存是否有相应的资源,有则直接使用本地缓存,不必再次向服务器请求。
参考
- DNS解析顺序是怎样的?
- DNS解析顺序
- DNS or hosts ?
- DNS解析顺序是怎样的?