一个页面从输入URL到加载显示完成,发生了什么?
面试经典题——URL加载
一、涉及基本知识点:
1. 计算机网络
五层因特尔协议栈:
- 应用层(dns、http):DNS解析成IP并完成http请求发送;
- 传输层(tcp、udp):三次握手四次挥手模式建立tcp连接;
- 网络层(IP、ARP):IP寻址;
- 数据链路层(PPP):将请求数据封装成帧;
- 物理层:利用物理介质传输比特流(传输的时候通过双绞线、电磁波等)
- OIS七层框架:多了两层即,会话层(处理两个通信系统中交换信息的表示方式)和表示层(管理不同用户和进程之间的对话)。
get和post的区别:
- get产生一个tcp数据包,post产生两个
- get请求时会把headers和data数据一起发送出去;
- post请求时,浏览器先发送headers,服务器100继续,浏览器再发送data。
DNS查询得到IP
- 请求信息:首先查看域名的本地DNS缓存,该缓存存储计算机最近检索到的信息,如果计算机不知道答案,那么就需要执行一个DNS查询来查找答案;
询问递归式DNS服务器:
- 如果信息不存储在本地,计算机会联系您的ISP(网络提供商)的递归DNS服务器;
- 这些专用计算机会为你执行一个DNS查询工作;
- 递归服务器有自己的缓存,所以这个查询过程通常在这里完成,并将信息还回给用户;
询问根域名服务器
- 如果递归服务器没有答案,他们会查询根域名服务器;
- 根域名服务器是一种计算机,它扮演着一种DNS的电话接线员的角色,他们不知道答案,但可以将我们的疑问指向知道在哪里可以找到答案的人。
询问TLD域名服务器:
- 根域名服务器将查看请求的第一部分,按从右到左的顺序,从www.dyn.com中找到.com,并将请求指向.com对应的顶级域名服务器(TLD).com;
- 每个TLD,如(.com,.org,.us)都有自己的顶级域名服务器,
- 这些服务器没有我们需要的信息,但他们可以直接将我们引导到有信息的服务器。
询问权威的DNS服务器
- TLD域名服务器会继续检查请求的下一部分(dyn)www.dyn.com,并将查询指向负责此特定域名的服务器;
- 这些权威的服务器将负责了解关于特定域的所有信息,并将信息存储在DNS记录。
找回记录:
-递归服务器从权威服务器中检索dyn.com的记录,并将记录存储在本地缓存;- 如果其他任何人请求dyn.com的主机记录,递归服务器已经有答案了,并不需要再次进行查找;
- 所有记录都有一个期限,一段时间后,递归服务器将需要要求一个新的记录副本,以确保信息不回过时。
接收答案:
- 有了答案,递归服务器将记录返回到计算机,
- 您的计算机将记录存储在缓存中,从记录中读取IP地址,然后将这些信息传递给浏览器;
- 然后浏览器就可以根据IP地址和服务器进行连接建立。
TCPIP请求
- http的本质就是TCPIP请求;
- 需要经历3次握手建立连接,4次挥手断开连接;
- TCP将http长报文划分为短报文,通过三次握手与服务器端建立连接,进行可靠传输。
三次握手:
- 客户端:你是XXX服务端吗?
- 服务端: 我是XXX服务端,你是客户端吗?
- 客服端: 是的,我是客户端
- 建立连接成功后,接下来就可以进行正式的传输数据。
四次挥手断开连接
- 主动方:我已经关闭了向你那边的信息发送通道,只能被动接受信息了;
- 被动方: 收到通道关闭的信息;
- 被动方: 我现在也关闭了向你那边发送信息的通道
- 主动方: 左后收到信息,连接断开,之后双方无法通信
TCP/IP的并发限制:
- 浏览器对同一个域名下并发的TCP连接是有限制的(2-10个不等)
- 而且在http1.0中往往一个资源的下载就需要一个tcp/ip请求
2. 浏览器机制
(1)进程和线程的概念
- 进程是CPU资源分配的最小单位,是能拥有资源和独立运行的最小单位;
- 线程是CPU调度的最小单位,线程是建立在进程的基础上的一次程序运行单位,一个进程可以拥有多个线程;
- 通俗的讲:进程是一个工厂,工厂有它独立的资源,工厂之间相互独立->进程之间相互独立,线程是工厂中的工人,多个工人之间可以协作完成任务,工厂内有一个或多个工人,工人之间共享空间。
(2)多进程的浏览器
浏览器是多进程的,有一个主控进程,以及每一个tab页面都会开一个进程(某些情况下多个tab由于优化策略会合并)
- 浏览器主要进程:
Browser进程:浏览器的主进程,负责协调、主控,只有一个,作用:
- 负责浏览器界面的显示、与用户交互(如前进、后退等)
- 负责各个页面的管理,创建和销毁其他进程;
- 将Renderer进程得到的内存中的Bitmap绘制到用户界面上
- 网络资源的管理和下载等
- 第三方插件进程: 每种类型的插件对应一个进程,仅当该插件使用时才创建;
- GPU进程: 最多一个,用于3D绘制等;
浏览器渲染进程(Renderer进程、浏览器内核、内部是多线程):
- 默认没打开一个tab页面,就会启动一个Renderer进程;
- 负责页面的渲染,脚本的执行,事件的处理。
浏览器多进程的优势
- 避免单个page crash影响整个浏览器;
- 避免第三方插件crash影响整个浏览器
- 多进程充分利用多核优势;
- 方便使用沙盒模型隔离插件等进程,提高浏览器稳定性
简单点理解:如果浏览器是单进程,那么某个tab页或第三方插件崩溃了,就会导致整个浏览器崩溃,体验度极差,不过多进程内存消耗会更大,有点用空间换时间。
浏览器内核(渲染进程)
- 浏览器渲染进程内部是多线程,包含主要线程有:
1.GUI渲染线程:
- (1)负责浏览器界面的渲染,解析HTML、CSS,构建DOM树和RenderObject树,布局和绘制等;
- (2) 当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时该线程会执行;
- 注意:GUI渲染线程和JS引擎线程是互斥的,当JS引擎执行时GUI线程会被挂起,GUI更新会保存在一个队列中等JS引擎空闲时立即执行。
2.JS引擎线程:
- JS内核,负责处理JavaScript脚本程序(V8引擎)
- 负责解析JavaScript脚本,运行代码;
- JS引擎一直等待着任务队列中的任务到来,然后加以处理,一个tab页面(renderer进程)中无论什么时候都只有一个JS线程在运行JS程序;
- 注意:由于GUI渲染线程和JS引擎线程是互斥的,所以如果JS程序运行时间过长,这样会导致页面渲染不连贯,导致页面渲染加载阻塞;
3.事件触发线程:
- 归属于浏览器,而不是JS引擎,用来控制事件循环;
- 当JS引擎执行代码块如setTimeOut时(也可以来自浏览器内核的其他线程,如鼠标单击事件、AJAX异步请求等),会将对应的任务添加到事件线程中;
- 当对应的事件符合触发条件被触发时,该线程就会把事件添加到JS的待处理队列的队尾,等待JS引擎的处理;
- 注意:由于JS的单线程的关系所以这些待处理队列中的事件都得排队等待JS引擎处理(当JS引擎空闲时才会去执行)。
4.定时触发器线程:
- setTimeOut与setInterval所在的线程;
- 浏览器的定时计数器并不是由JavaScript引擎计数的,(因为JavaScript是单线程,如果处于阻塞状态就会影响计时的准确)因此通过单独的线程来计时并触发定时(计时完毕后,添加到事件队列,等待JS引擎空闲时执行)
5.异步http请求线程:
- 在XMLHttpRequest在连接后是通过浏览器新开一个线程请求的
- 将检测到状态变更时,如果设置有回调函数,异步线程就将产生状态变更事件,将这个回调在放到事件队列中,再由JavaScript引擎执行。
一、 一个页面从输入URL到加载显示完成,这个过程发生了什么?
简洁版:
- 浏览器根据请求的URL交给DNS域名解析,找到真实的IP,向服务器发起请求;
- 服务器交给后台处理完成后返回数据,浏览器接收文件(HTML、CSS、JavaScript等);
- 浏览器对加载到的资源(HTML、CSS、JavaScript等)进行语法解析,构建相应的内部数据结构(DOM树、CSS树、render树等);
- 载入解析到的资源文件、渲染页面、完成。
详细版:
- 首先浏览器开启一个线程来处理这个请求,对URL分析判断,如果是http协议就按照Web方式来处理;
- 其次浏览器会对URL进行解析,一般包括(协议头、主机域名或IP地址、端口号、请求路径、查询参数、hash等),然后开启网络线程发出一个完整到http请求;
- 当然一般我们输入的URL是服务器域名,这时就需要DNS通过域名查询得到对应的IP;
- DNS首先会查看浏览器DNS缓存,没有就查询计算机本地DNS缓存,还没有就询问递归式DNS服务器(即网络提供商,一般这个服务器都会有自己的缓存,所以IP查询一般在这里完成),如果没有缓存,那就需要通过根域名和TLD域名服务器指到对应的权威DNS服务器找回记录,并缓存到递归式服务器,然后递归服务器在将记录返回给本地。
- 有了IP地址,此时网络层便会通过IP地址寻的对应服务器的物理地址
- 寻得服务器地址,客户端在网络传输层便可以和服务器通过三次握手建立tcpip连接
- 连接建立后网络数据链路层将数据包装成帧;
- 最后物理层利用物理介质进行传输;
- 到了服务器,就会通过相反的方式将数据一层一层的还原回去;
- 请求到了后台服务器,一般会有统一的验证,如安全验证、跨域验证等,验证未通过就直接返回相应的http报文
- 验证通过后,就会进入后台代码,此时程序收到请求,然后执行对应的操作(如查询数据库等);
- 如果浏览器访问过,且缓存上有对应的资源,便会与服务器最后修改时间对比,一致便返回304,告诉浏览器可使用本地缓存;
- 前端浏览器接收到响应成功的报文后便开始下载网页
下载完的网页将被交给浏览器内核(渲染进程)进行处理:
- 根据顶部定义的DTD类型进行对应的解析方式;
- 渲染进程内部是多线程的,网页的解析将会被交给内部的GUI渲染线程处理;
- 首先渲染线程中的HTML解释器,将HTML网页和资源从字节流解释转换成字符流;
- 再通过词法分析器将字符流解释成词语;
- 之后经过语法分析器根据词语构建成节点;最后通过这些节点组建一个DOM树;
- 这个过程中,如果遇到的DOM节点是JavaScript代码,就会调用JavaScript引擎对JavaScript代码进行解释执行,此时由JavaScript引擎和GUI渲染线程的互斥,GUI渲染线程就会被挂起,渲染过程停止;如果JavaScript代码的运行中对DOM树进行了修改,那么DOM的构建需要从新开始;
- 如果节点需要依赖其他资源,如(图片,CSS等),便会调用网络模块的资源加载器来加载它们,但它们是异步的,不会阻塞当前DOM树的构建;
- 如果遇到的是JavaScript资源URL(没有标记异步),则需要停止当前DOM的构建,直到JavaScript的资源加载并被JavaScript引擎执行后才继续构建DOM;
- 对于CSS,CSS解释器会将CSS文件解释成内部表示结构,生成CSS规则树;
- 然后合并CSS规则树和DOM树,生成render渲染树;
- 最后对render树进行布局和绘制,并将结果通过IO线程传递给Browser控制进程进行显示。
原文地址:https://segmentfault.com/a/1190000014872028
一个页面从输入URL到加载显示完成,发生了什么?的更多相关文章
- 一个页面从输入url到加载完成的过程都发生了什么,请详细说明
1.首先,在浏览器地址栏中输入url 2.浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容.若没有,则跳到第三步操作 3.在发送http请求前,需要域名解析(DN ...
- 一个页面从输入url到加载到内容,这个过程经历了什么
首先,当浏览器接收到url,会查看本地缓存(浏览器缓存-系统缓存-路由器缓存)中是否有,有则直接显示 没有则进行DNS域名解析,将域名解析成IP地址,通过ip地址去访问相应的服务器, 浏览器访问服务器 ...
- 一个页面从输入url到页面加载显示完成,中间都经历了什么
第一种解释: 一般会经历以下几个过程: 1.首先,在浏览器地址栏中输入url 2.浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容.若没有,则跳到第三步操作. 3 ...
- 一个页面从输入URL到页面加载完成发生了...待细化
一个页面从输入URL到页面加载完成发生了... 1.查找浏览器缓存 2.寻址:DNS解析 查找该域名对应的IP地址, 如果需要重定向(301),则再次发起请求 3. 进行HTTP协议会话 4.客户端发 ...
- 一个页面从输入URL到页面加载显示完成,这个过程都发生了什么?
对于网址栏的URL不同的操作方式有不同的加载资源.获取数据的方式,下面的详细过程针对"在地址栏输入URL,按enter(回车)键加载资源"此种操作方式做解析,其它的方式的过程大同小 ...
- 一个页面从输入url到页面加载完成究竟经历了些什么
本人经参考谢希仁著<计算机网络(第 5版)>.<HTTP权威指南>和网络上关于浏览器渲染原理的介绍,结合自己理解,整理出以下结论,如有不正确或者不完善之处欢迎指正: 当用户在浏 ...
- 一个页面从输入URL 到页面加载显示完成的过程中都发生了什么
前端面试/笔试必考问题,越详细越好 先简单得讲: 浏览器根据请求的URL交给DNS域名解析,找到真实IP,向服务器发起请求: 服务器交给后台处理完成后返回数据,浏览器接收文件(HTML.JS.CSS. ...
- 一个页面从输入URL到页面加载显示完成的详细过程
下面以访问baidu页面来做一个过程分析 输入 URL:http://www.baidu.com DNS 域名解析 计算机无法识别域名,计算机与计算机之间要想进行通信,必须通过ip地址用来定位该计算机 ...
- 8.一个页面从输入 URL 到页面加载显示完成,这个过程中都发生了什么?
注:这题胜在区分度高,知识点覆盖广,再不懂的人,也能答出几句, 而高手可以根据自己擅长的领域自由发挥,从URL规范.HTTP协议.DNS.CDN.数据库查询. 到浏览器流式解析.CSS规则构建.lay ...
随机推荐
- Codeforces Round #325D (Div. 2) (DP)
题目链接: D. Phillip and Trains 分析:dp 我们先初始化,dp[i]表示当前列第i行是否可达,r[i]表示上一个dp值,接下来从头搜到尾 如果该位置满足s[i+1]=='.'且 ...
- Linux 常用命令九 tar
一.tar命令 tar命令用于打包,解包. gzip命令用于压缩,解压缩. bzip2命令用于压缩,解压缩. 这三个是在linux中常用的,还有一些不常用的. tar打包: wang@wang:~/w ...
- python 面向对象四 继承和多态
一.继承 class Animal(object): def run(self): print('Animal is running...') class Dog(Animal): def run(s ...
- python 高阶函数二 map()和reduce()
一.map()函数 map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回. >>> fro ...
- bzoj 3270: 博物馆【dp+高斯消元】
好像是高斯消元解互相推(?)的dp的例子 首先考虑dp,设f[i][j]为一人在i一人在j的概率,点i答案显然就是f[i][i]: 然后根据题意,得到转移是 \[ f[i][j]=f[i][j]*p_ ...
- bzoj 4824: [Cqoi2017]老C的键盘【树形dp】
参考:https://www.cnblogs.com/FallDream/p/bzoj4824.html 画一画就会发现关系形成了一棵二叉树(其实看到n-1就能想到 然后dp,设f[i][j]为点i在 ...
- 51nod 1237 最大公约数之和 V3【欧拉函数||莫比乌斯反演+杜教筛】
用mu写lcm那道卡常卡成狗(然而最后也没卡过去,于是写一下gcd冷静一下 首先推一下式子 \[ \sum_{i=1}^{n}\sum_{j=1}^{n}gcd(i,j) \] \[ \sum_{i= ...
- 图的遍历---------开始开始-------o(∩_∩)o 哈哈
图的遍历 深度优先搜索(Depth First Search , DFS) --深度优先搜索--我的理解就是分身术的另一种实现方法---用分身术将所有能看到的路都走一遍----这就是深度搜索--- 下 ...
- the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf
一:开始Nginx的SSL模块 1.1 Nginx如果未开启SSL模块,配置Https时提示错误 原因也很简单,nginx缺少http_ssl_module模块,编译安装的时候带上--with-htt ...
- Spring @requestBody
页面提交请求参数有两种,一种是form格式,一种是json格式 jQuery的$.post方法虽然也可以传递json格式数据,但实际上是用的form格式提交,jquery会帮你把json转成form格 ...