从输入URL到页面展示,中间都发生了什么?

281 阅读4分钟

大概经历的阶段:

1.浏览器构建请求、
2.查找缓存、
3.DNS解析(准备IP和端口)、
4.等待TCP队列、
5.建立TCP链接、
6.发起HTTP请求、
7.服务器处理请求、
8.服务器响应请求、
9.断开TCP链接

详细的工作过程:

1.浏览器根据用户输入的内容判断是搜索还是网址,如果是搜索,就将搜索+默认浏览器搜索引擎合成新的URL,如果符合网址规则,就将这段内容前面加上合法的协议合成URL

2.按下回车,页面会有一个loading状态,此时呈现的是之前页面的内容,这是因为页面内容还没有获得。

3.浏览器进程构建请求行信息 GET /index.html HTTP1.1,通过进程间通信(IPC)将URL转交给网络进程

4.网络进程获取到URL后,先去浏览器缓存检查该资源是否被缓存,如果有缓存,拦截本次请求,直接返回200。如果没有缓存,发起网络请求流程,网络进程请求流程如下:

4.1 网络进程先去DNS发送请求得到目标服务器IP和端口号,端口号未指定默认是80,若是https,默认端口号是443,https还需要建立TLS连接
4.2 IP和端口号去和目标服务器建立TCP连接,但并非直接能够建立连接。http1.x协议在chrome浏览器下,一个域名下一次最多建立6TCP请求,如果当前有10个资源,那么剩下4个需要列入到TCP待请求队列中
4.3 TCP三次握手建立连接,http请求加上TCP头部(源端口号,目的端口号,校验数据完整性的端口号),向下层传输
4.4 网络层在数据包上加上IP头信息(源IP,目的IP),继续向下层传输
4.5 底层通过物理层将数据包传输到目的服务器主机
4.6 目的服务器主机网络层收到数据包,解析出IP头和数据部分,将解开的数据部分继续向上传输到传输层
4.7 目的服务器主机传输层收到数据后,解析出TCP头部和数据部分,将解开的数据部分向上传输到应用层
4.8 应用层HTTP解析请求头和请求体,如果需要重定向,服务器将会返回301或者302,并在location字段附上重定向的地址。如果不需要重定向,服务器会根据if-none-match字段判断资源是否被更新,如果没有更新就返回304,相当于告诉浏览器缓存资源还可以用。否则,返回新的数据,并返回200,如果想要浏览器有缓存的话,就在相应头中加入Cache-Control:max-age:2000

5.网络进程解析响应流程:

5.1检查状态码,如果是301/302,则需要重定向,就去location字段取重定向地址,重复第4步。如果是200,则继续处理请求

5.2检查响应类型Content-Type,如果是字节流类型(application/...stream),就交给浏览器下载管理器,结束当前导航过程。如果是text/html类型,就通知浏览器进程获取文档准备渲染

6.浏览器进程获取到通知,根据当前页面B是否是从页面A打开的,并且是否和A是同一个站点,如果是从页面B打开的并且和A是同一个站点,就使用原有渲染进程打开B页面,否则创建单独的渲染进程

7.浏览器进程向渲染进程发出‘提交文档’信息,渲染进程收到消息后,会和网络进程建立通道,进行文件数据传输,数据传输完成后,渲染进程会发送‘确认提交’的消息给浏览器进程

8.浏览器进程接收到渲染进程的提交消息后,会更新浏览器前进后退历史状态、安全状态、地址栏URl信息以及Web页面内容,此时web页面会是空白

9.渲染进程对文档页面进行解析和子资源加载,将HTML解析成DoM tree,CSS解析成CSSOM tree,执行javascript并绘制出页面布局,元素,位置,颜色等,最后显示在屏幕上。

10.当页面生成后,渲染进程会给浏览器进程发送信号,浏览器会停止页面的标签动画加载,如下图: