当在浏览器中输入一个url地址时,浏览器做了什么?

689 阅读3分钟

一、通过DNS解析url地址,获取url对应的服务器IP地址和端口

1.浏览器在发起请求之前,会在浏览器缓存中查找是否有要请求的文件。如果有的话会取消请求,直接返回该文件。如果没有则进入步骤2。

2.根据url中的域名在DNS(域名系统:用来保存域名和IP的映射关系)中解析出对应的IP地址,浏览器会缓存解析出的结果,以供下次直接使用。

3.如果有特殊端口,端口号一般会直接在url中,如果没有的话,HTTP协议默认是使用80端口。

二、和服务器建立连接

1.准备好IP和端口号后,并不能马上和服务器建立TCP连接(HTTP是基于TCP的)。以Chrome为例,Chrome在同一域名下,同时只允许建立6个TCP连接,如果超过6个,会排队等待。

2.如果当前请求数量少于6个,则会通过“三次握手”与服务器建立TCP连接。

3.如果是HTTPS请求,则还会建立TLS连接。

三、发送HTTP请求

1.向服务器发送数据(请求行、请求头、请求体)

四、服务器处理请求

1.服务器处理请求并返回数据(响应行、响应头、响应体)

2.通过“四次挥手”关闭TCP连接

五、浏览器接收到服务器返回的数据并解析成布局树

1.浏览器的网络进程会判断状态码是否是301或302,如果是的话,则会读取响应头里的location字段,获取重定向地址,然后跳转到步骤一

2.如果状态码是200的话,则表示浏览器可以接着处理返回的数据。先获取响应头中的content-type,判断返回数据的类型。

3.网络进程判断返回的数据类型是HTML,会在渲染进程和网络进程之间建立一个共享数据的管道。⽹络进程接收到数据后就往这个管道⾥⾯放,⽽渲染进程则从管道的另外⼀端不断地读取数据,并将数据交给HTML解析器用来解析。

4.HTML解析器是边读取边解析的,不会等网络进程把数据加载完成

5.在解析HTML过程中,JS和CSS会阻塞HTML的解析CSS会阻塞JS的解析。所以当渲染引擎收到字节流之后,会开启⼀个预解析线程,⽤来分析HTML⽂件中包含的JS、CSS等相关⽂件,解析到相关⽂件之后,预 解析线程会提前下载这些⽂件。另外,如果js中没有操作DOM,可以在script标签中添加defer或async来异步加载JS文件。

6.浏览器解析HTML生成DOM树,解析CSS生成CSSOM,然后会结合二者进行样式计算,为每个DOM元素选择对应的样式信息。然后通过计算布局(即计算每个元素对应的几何位置)生成布局树

六、将布局树渲染成页面

1.分层。渲染引擎需要为特定的节点⽣成专⽤的图层,并⽣成⼀棵对应的图层树。(如PS中的图层)

2.栅格化。因为一个页面可能很长很长,但是我们的屏幕大小是一定的,为了提升用户体验,所以渲染时,会优先渲染屏幕窗口所在的位置。这里,浏览器(合成线程)会将图层划分为图块。合成线程会按照视⼝附近的图块来优先⽣成位图,实际⽣成位图的操作是由栅格化来执⾏的。所谓栅格 化,是指将图块转换为位图。 3.显示。将⻚⾯内容绘制到内存中,最后再将内存显⽰在屏幕上