先上结论
- 用户输入网址
- DNS解析
- TCP连接
- 服务器处理请求
- 浏览器解析html为dom树
- 解析css为cssom树
- dom+cssom生成渲染树
- 加载js并执行
输入URL
-
定义:url是统一资源定位系统,指定信息位置,生活中一般称之为网站网址
-
url组成
- https:协议,https=http+ssl(ssl用于加密,保证http传输通道安全)
- juele.cn:主机
- 433:端口号
- 5562/search:路径
- query=url组成:查询参数,比如百度搜索 ”url参数“,当你在输入框里输入它并回车后,百度的地址栏中就会显示你的查询参数
- #bottom:锚点,用于页面跳转时定位到相应内容。比如在页面html文件底部的某元素上加上属性 ”id=”bottom“,则别的网页携带bottom锚点跳转到该网页后就会直接下拉到底部相应位置
https://juele.cn: 433/5562/search?query=url组成/#bottom
-
URL解析
- 输入URL后,浏览器会解析出上述信息,并发送http请求
- 发送请求前,会检查是否命中强制缓存,没有则继续检查是否命中协商缓存,还没有的话再发送请求从服务器获取资源(缓存通俗说,是之前的访问记录,如果访问过该网址并有记录,则直接用该记录,不去服务器请求资源,更高效)
DNS解析
-
发送http请求前,浏览器得获取要访问的网页的ip地址
-
DNS指域名系统,比如www.baidu.com就是一个域名;IP地址是一个32位的二进制数,通常被分为4个8位的二进制数。比如百度的ip为202.108.22.5
-
DNS解析就是将域名解析为ip地址
-
域名和ip一般都是用于表示主机或网络地址的,前者便于人们理解,后者便于机器理解,所以便出现了两种形式,之间还得转换(也就是解析)
TCP连接
-
既然浏览器识别了IP地址,那么就得和它建立联系了。
-
这里就牵扯到了最常见的TCP连接方式:三次握手
- 不讲复杂的东西,就谈通俗理解。用户(客户端)想访问网页(服务端),给网页发送 “建立连接请求”(一次握手),网页收到消息后,告诉用户 “你的消息我收到了,可以建立连接”(二次握手),用户再发一次消息 “你的消息我也收到了,即将建立连接”(三次握手),然后TCP连接便建立了
- **为什么要三次握手呢?**根本原因:TCP是可靠传输,得保证可靠性。首先用户得确认网页是否可以建立连接(一次),网站收到消息后,告诉用户可以(二次),此时用户知道了自己的发送和接收功能都没问题,然后告诉网页可以建立连接了(三次),网页收到消息后就知道了自己的发送和接收功能也没问题,然后就可以放心的建立连接了
HTTP请求
- TCP连接建立后,就可以发送请求(请求报文)了
- 请求报文包括报文首部、空行、报文主体,报文首部包含了请求方法、请求URL、HTTP协议版本,比较关键
- 请求方法:get、head、post、put、delete、trace、options
服务端处理请求
-
服务器解析报文
-
返回响应报文,其包含报文首部、空行、报文主体
-
就前端知识来说,服务器一般返回先html文件,如果浏览器加载html文件时遇到引入的css文件,会再次向服务器请求对应的文件
-
响应时的http状态码:1xx(临时响应)、2xx(成功响应)、3xx(已重定向:跳转到其他网页)、4xx(客户端请求错误)、5xx(服务端错误)
TCP关闭请求(四次挥手)
- 通俗理解:用户(客户端)想关闭网页(服务端),给网页发送 “关闭连接请求”(一次挥手),网页收到消息后,告诉用户 “你的消息我收到了”(二次挥手),如果网页准备好了关闭连接则再次向用户发送消息“可以关闭连接”(三次挥手),用户再发一次消息 “你的消息我也收到了,同意关闭连接”(四次挥手),然后TCP连接便完全关闭了
- **为什么比三次握手多了一次?**显然,第二次握手相当于二次、三次挥手的结合,这里没有一步到位是因为,关闭连接时,网页得先检查并确定自己不再有需要发送的数据,才能告诉用户 “可以关闭连接”
解析html为dom树
- 转换:浏览器将读取的HTML内容,按照指定的编码他们转换为各个字符(例如utf-8编码,将 ”郭沫若“ 转换为 “郭沫若”)
- 令牌化:浏览器将字符串转换成各种令牌
- 词法分析:令牌转换成定义其属性和规则的 “对象”
- DOM构建:按照html节点间的关系,创建的对象链接在一个树(数据结构)内,比如html对象是body对象的父节点,以此类推
解析css为cssom树
- 流程和dom树生成差不多,转换、令牌化、词法分析、cssom构建
生成渲染树(render-tree)
- dom树与cssom树结合生成渲染树
- 渲染树只包含渲染可见节点(比如被css隐藏的节点就不可见)
- 布局,计算每个对象的精确位置和大小
- 绘制,使用最终渲染树将像素渲染到屏幕上
加载js
- 创建window对象:window是全局执行环境,所有的全局变量和函数都是它的属性和方法。而dom树也会映射在它的document对象上,dom操作也都是通过这个对象操作
- 加载文件
- 预编译(执行Script代码前)
- 全局预编译:全局函数提前声明、全局变量提前声明,全都挂载到window上
- 局部预编译:类似全局预编译
- 解释执行