用户在浏览器输入URL或者跳转到一个URL后发生了什么
一、从URL到页面渲染的整个过程
1)处理用户输入
2)开始导航
3)读取响应
4)查找渲染进程
5)确认导航
6)渲染页面
二、每一步做了哪些事情
1)处理用户的输入
浏览器的UI 线程处理用户的输入,判断是跳转过来的还是用户自己的输入。
判断依据是请求报文中referer这个参数,值是NUll,用户自己手动输入。
2)开始导航
用户敲了回车之后,监听用户行为的UI线程告诉network线程去获取网页;同时自己进入loading状态。
network线程如何获取网页资源的呢?
2.1)dns域名解析
2.1.1)什么是dns域名解析?怎么进行的域名解析呢?
因为网络通信是基于tcp/IP的,tcp/ip是基于IP地址的,所以对于域名是无法识别的,人们对于超过10位的IP地址记忆起来又有难度,所以就出现了域名;主机上用户配置了域名对应的子目录,当访问对应的域名时,就可以通过解析访问到对应子目录中的文件。
2.1.2)域名解析:
每个PC端或者手机端都是一个DNS客户端。
浏览器将URL中的域名提取出来给DNS客户端;
dns客户端向DNS服务器发起请求报文,报文中包含URL给的主机名;通过一系列的缓存查询和分布式DNS集群查询;
dns客户端收到响应报文,里边包含主机名对应的IP地址;
浏览器获取到IP地址,就可以向IP地址所在的Http服务器发送http请求了。
2.1.3)建立http连接
安全的数据传输必须建立tls连接,经过三次握手完成该项工作。
2.1.4)发起http请求
3)读取响应
当请求响应返回的时候,network 线程会依据 Content-Type 及 MIME Type sniffing 判断响应内容的格式;
常见的有text/html,text/css,text/javascript,image/gif,image/png,等等;
HTML格式文件的处理network线程通知UI线程完成资源获取,UI线程会寻找渲染进程;
其他格式的文件都交给下载管理器来做了,恶意站点和敏感字段的检查也会在该阶段完成。
4)寻找渲染进程,确认导航
network thread 确信浏览器可以导航到请求网页,network thread 会通知 UI thread 数据已经准备好,UI thread 会查找到一个 renderer process 进行网页的渲染。
当 UI 线程发送 URL 请求给 network 线程时,浏览器其实已经知道了将要导航到那个站点。UI thread 会并行的预先查找和启动一个渲染进程,如果一切正常,当 network thread 接收到数据时,渲染进程已经准备就绪了,但是如果遇到重定向,准备好的渲染进程也许就不可用了,这时候就需要重启一个新的渲染进程。
Browser Process 会给 renderer process 发送 IPC 消息来确认导航,一旦 Browser Process 收到 renderer process 的渲染确认消息,导航过程结束,页面加载过程开始。
5)页面渲染
经典的渲染过程