从输入URL到页面展示,这中间发生了什么?
Posted zhswater
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从输入URL到页面展示,这中间发生了什么?相关的知识,希望对你有一定的参考价值。
备注:Chrome包括:1个浏览器主进程、1个GPU进程、1个网络进程、多个渲染进程、多个插件进程
1.用户输入URL,浏览器会根据用户输入的信息判断是搜索还是网址,如果是搜索内容,就将搜索内容+默认搜索引擎合成新的URL;如果用户输入的内容符合URL规则,浏览器就会根据URL协议,在这段内容加上协议合成合法的URL。
2.用户输入完内容,按下回车键,浏览器导航栏显示loading状态,但是页面还是呈现前一个页面,这是因为新页面的响应数据还没有获得。
3.浏览器进程构建请求行信息,会通过进程间通信(IPC)把URL请求发送给网络进程 GET /index.html HTTP1.1
4.网络进程获取到URL,先去本地缓存中查找是否有缓存文件,如果有,拦截请求,直接200返回;否则,进入网络请求过程。
5.网络进程请求DNS返回域名所对应的IP地址和端口号,如果之前DNS数据缓存服务缓存过当前域名信息,就会直接返回缓存信息;否则,发起获取根据域名解析出来的IP和端口号,如果没有端口号,http默认80,https默认443.如果是https请求,还需要建立TLS连接。
6.Chrome有个机制,同一个域名同时最多只能创建6个TCP连接,如果在同一个域名下同时有10个请求发生,那么其中4个请求会进入排队等待状态,直至进行中的请求完成。如果当前请求数量少于6个,会直接建立TCP连接
7.TCP三次握手建立连接,http请求加上TCP头部---包括源端口号、目的程序端口号和用于校验数据完整性的序号,向下传输。
8.网络层在数据包上加上IP头部---包括源IP地址和目的IP地址,继续向下传输到底层
9.底层通过物理网络传输给目的服务器主机
10.目的服务器主机网络层接收到数据包,解析出IP头部,识别出数据部分,将解开的数据包向上传输到传输层
11.目的服务器主机传输层获取到数据包,解析出TCP头部,识别端口,将解开的数据包向上传输到应用层
12.应用层HTTP解析请求头和请求体,如果需要重定向,HTTP直接返回HTTP响应数据的状态code301或302,同时在请求头的Location字段中附上重定向的地址,浏览器会根据code和Location进行重定向操作;如果不是重定向,首先服务器会根据请求头中的IF-None-Match的值来判断请求的资源是否被更新,如果没有更新,就返回304状态码,相当于告送浏览器之前的缓存还可以使用,就不返回新数据了;否则,返回新数据,200的状态码,并且如果想要浏览器缓存数据的话,就在相应头中加入字段:Cache-Control:Max-age=2000响应数据又顺着应用层--传输层--网络层---网络层--传输层--应用层的顺序返回到网络进程。
13.数据传输完成,TCP四次挥手断开连接。如果,浏览器或者服务器在HTTP头部加上如下信息,TCP就一直保持连接。保持TCP连接可以省下下次需要建立连接的时间,提示资源加载速度Connection:Keep-Alive
14.网络进程将获取到的数据包进行解析,根据响应头中的Content-type来判断响应数据的类型,如果是字节流类型,就将该请求交给下载管理器,该导航流程结束,不再进行;如果是text/html类型,就通知浏览器进程获取到文档准备渲染。
15.浏览器进程获取到通知,根据当前页面B是否是从A页面打开的并且和页面A是否是同一站点(根域名和协议一样就被认为是同一个站点),如果满足上述条件,就复用之前网页的进程,否则,新创建一个单独的渲染进程
16.浏览器会发出“提交文档”的消息给渲染进程,渲染进程收到消息后,会和网络进程建立传输数据的“管道”,文档数据传输完成后,渲染进程会返回“确认提交”的消息给浏览器进程。
17.浏览器收到“确认提交”的消息后,会更新浏览器的页面状态,包括了安全状态、地址栏的URL、前进后退的历史状态、并跟新web页面,此时的web页面是空白页。
18.渲染进程对文档进行页面解析和子资源加载,HTML通过HTML解析器转成DOM Tree(二叉树类似结构的东西),CSS按照CSS规则和CSS解释器转成CSSOM Tree,两个tree结合,形成render tree(不包含HTML的具体元素和元素要画的具体位置),通过Layout可以计算出每个元素具体的宽高颜色位置,结合起来,开始绘制,最后显示在屏幕中,新页面显示出来。
以上是关于从输入URL到页面展示,这中间发生了什么?的主要内容,如果未能解决你的问题,请参考以下文章