这篇文章主要参考在浏览器中输入URL并回车后都发生了什么?,感兴趣的可以去直接看原文。
简略步骤:
- 浏览器对,
URL
解析,获取到域名地址; - 计算机对
DNS
进行解析,获取到IP
地址; - 浏览器与服务器通过三次握手建立
TCP
连接; - 服务器解析传入的参数字段,通过对应的后台接口,返回结果;
- 浏览器对拿到的数据进行渲染,显示结果;
1. URL
解析
URL
(Universal Resource Locator
):统一资源定位符,也就是我们经常使用的网址。如上图所示,URL
通常由4
部分组成:协议、主机、端口、路径
protocol :// hostname[:port] / path / [;parameters][?query]#fragment
当然还有参数和锚等。
对URL
解析,主要就是通过正则匹配找到所需要的参数,比如域名。
2. DNS解析
在进行DNS解析时,会经历以下步骤:
-
查询浏览器缓存(浏览器会缓存之前拿到的DNS 2-30分钟时间),如果没有找到,
-
检查系统缓存,检查
hosts
文件,这个文件保存了一些以前访问过的网站的域名和IP
的数据。它就像是一个本地的数据库。如果找到就可以直接获取目标主机的IP
地址了。没有找到的话,需要 -
检查路由器缓存,路由器有自己的
DNS
缓存,可能就包括了这在查询的内容;如果没有,要 -
查询ISP DNS 缓存:
ISP
服务商DNS
缓存(本地服务器缓存)那里可能有相关的内容,如果还不行的话,需要, -
递归查询:从根域名服务器到顶级域名服务器再到权限域名服务器依次搜索哦对应目标域名的
IP
。
2.1 【相关问题】DNS 使用的是 TCP 协议还是 UDP协议?
DNS
在进行区域传输的时候使用 TCP
协议,其它时候则使用 UDP
协议。
在DNS
中,有 2 种类型的 DNS
服务器,一个叫主 DNS
服务器,一个叫辅助DNS
服务器。
在一个区中主 DNS 服务器从自己本机的数据文件中读取该区的 DNS
数据信息,而辅助 DNS
服务器则从区的主 DNS
服务器中读取该区的 DNS
数据信息。当一个辅助 DNS
服务器启动时,
它需要与主 DNS
服务器通信,并加载数据信息,这就叫做区域传输。在这个过程使用 TCP
协议进行传输。
区域传输使用 TCP
而不是 UDP
,因为辅域名服务器会定时(一般时 3 小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,则会执行一次区域传送,进行数据同步。而数据同步传送的数据量比一个请求和应答的数据量要多得多。UDP
报文的最大长度为 512
字节,而 TCP
则允许报文长度超过 512
字节,故而在进行区域传输的时候使用TCP
更加合理。
另外,TCP
是一种可靠的连接,保证了数据的准确性。
在客户端向DNS
服务器查询域名时使用 UDP
协议,因为一般返回的内容都不超过 512
字节,用 UDP
传输即可。不用经过 TCP
三次握手,这样 DNS
服务器负载更低,响应更快。虽然从理论上说,客户端也可以指定向 DNS
服务器查询的时候使用 TCP
,但事实上,很多 DNS
服务器进行配置的时候,仅支持 UDP
查询包。
3. 建立TCP
连接
一个TCP
连接必须要经过三次“对话”才能建立起来,其中的过程可以描述为:
SYN
:发起一个新连接。
ACK
:确认序号有效。
上图来自知乎:https://zhuanlan.zhihu.com/p/51560184
第一次握手:一般由客户端发起(SYN=1,seq=J
) 客户端发送一个 TCP
的 SYN
标志为 1
的包,指明客户端打算连接的服务器的端口,以及初始化序列号为 J
,保存在包头的序列号字段中。 发送完毕后客户端进入 SYN_SENT
状态,等待Server
确认。
第二次握手:Server
收到数据包后由标志位SYN=1
知道Client
请求建立连接,服务器会将SYN
标志位和 ACK
标志位均为 1
。服务器选择自己的 ISN
序列号K
,放在 seq
域中,同时将确认序列号(ack
)设置为客户端的 ISN
加 1
,即 J+1
发送完毕后服务器进入 SYN_RCVD
状态。
第三次握手:Client
收到确认后,检查ack
是否为J+1
,ACK
是否为1
,如果正确则将标志位ACK
置为1
,ack=K+1
,并将该数据包发送给Server
,Server
检查ack
是否为K+1
,ACK
是否为1
,如果正确则连接建立成功,Client
和Server
进入ESTABLISHED
状态,完成三次握手,随后Client
与Server
之间可以开始传输数据了。
为什么需要三次握手:
假设不需要三次握手,那么客户端发送一个连接请求到服务器,由于网络延迟,客户端就放弃了这次连接,但是服务器并不知道,就以为客户端需要请求,就一直等待客户端数据,但是此时的连接并没有建立,这样会浪费很多服务器资源。
- 三次握手才可以阻止重复历史连接的初始化
- 三次握手才可以同步双方的初始序列号
- 三次握手才可以避免资源浪费
TCP
建立连接时,通过三次握手能防止历史连接的建立,能减少双方不必要的资源开销,能
帮助双方同步初始化序列号。序列号能够保证数据包不重复、不丢弃和按序传输。
4. 请求和传输数据
5. 浏览器渲染页面
- 浏览器会解析
html
源码,然后创建一个DOM
树。 - 解析
CSS
代码,计算出最终的样式数据,形成css
对象模型CSSOM
。 - 加载
JS
,遇到了js,将立即阻塞DOM树的构建,将控制权移交给 JavaScript 引擎,等到 JavaScript 引擎运行完毕,浏览器才会从中断的地方恢复DOM树的构建。 - 利用
DOM
和CSSOM
构建一个渲染树(rendering tree
)。 - 浏览器就根据渲染树直接把页面绘制到屏幕上。
Thanks