1.DNS域名解析
1.1 浏览器搜索自己的DNS缓存
1.2 若没有,则搜索操作系统中的DNS缓存
1.3 若没有,则搜索操作系统的hosts文件
1.4 若没有,则操作系统将域名发送至本地域名服务器(递归查找)
1.4.1 若没有,本地域名服务器向根域名服务器发起请求,根域名服务器返回com域的顶级域名服务器的地址
1.4.2 本地域名服务器向com域的顶级域名服务器发起请求,,返回baidu.com权限域名服务器的地址
1.4.3 本地域名服务器向baidu.com的权限域名服务器(保存该区中所有主机域名到IP地址的映射)发起请求,得到www.baidu.com的IP地址
1.5 本地域名服务器将得到的IP地址返回给操作系统,同时自己也将IP地址缓存起来
1.6 操作系统将IP地址返回给浏览器,同时自己也将IP地址缓存起来
1.7 浏览器得到了域名对应的IP地址
2.使用IP协议,ARP协议,OSPF等协议将消息上传到服务器上
ARP协议解决同一个局域网内,主机或路由的IP地址和MAC地址的映射问题(如果源主机和目的主机在一个局域网下内,目标IP和本机IP分别与子网掩码相与的结果相同,那么它们在一个子网,通过ARP找到目的主机的MAC地址;如果不在一个局域网内,用ARP协议找到本网络内的一个路由器的MAC地址,剩下的工作交给该路由器完成)
OSPF:链路状态路由协议,大部分路由将由OSPF协议自动计算生成,无须网络管理员人工配置,当网络拓扑发生变化时,协议自动计算,更新路由,极大方便了网络管理
3.客户端和服务端建立连接
三次招手:
3.1 客户端发送syn给服务端
3.2 服务端收到请求报文后,同意连接,发送一个ack包
3.3 客户端收到确认后,发送ack包给服务端,服务端收到后,双方建立连接
4.客户端发送http请求 5.服务端响应http请求
4.1 http
http:请求结构
1.首行(请求方法,url,版本号)
2.请求报头(键值对)
3.空行(header结束的标记)
4.正文(body,get请求一般没有body,post请求一般有body)
http:响应结构
1.首行(版本号,状态码,状态码描述)
2.响应报头(键值对)
3.空行
4.响应正文(常见的body是html的参数)
4.2 https
4.2.1 基于http协议的一层加密
4.2.2 数据之间通过对称加密来完成,对称加密的密钥是通过客户端产生的,传输给服务器
4.2.3 传输对称加密的密钥的时候,需要再次的加密,这里的加密使用的是非对称加密,非对称加密的密钥是服务器生成的,服务器通过证书把公钥返回给客户端
4.2.4 客户端拿到证书,对证书校验,
4.3 https默认端口是443;http的默认端口是80
6.浏览器解析html代码,并请求html中的资源(css,js,imgs)
6.1 解析html 将html分解并表示为开始标记,结束标记,内容标记,构造dom树
6.2 获取外部资源 遇到外部资源时,解析器提取文件,
6.2.1 在加载css文件时继续运行,但会阻止页面渲染,直到资源加载解析完
6.2.2 在加载js文件时,解析器会停止对html的解析,等到js加载并解析完,
6.2.2.1 采用defer js加载的时候不会阻塞html的解析,并且在文档解析完之后才会被执行
6.2.2.2 采用async js加载的时候不会阻塞html的解析,当js文件加载完后立即执行
6.2.3 与加载资源 link的rel属性的preload值能够在head标签内部书写一些声明式的资源请求,可以指明哪些资源是在页面加载完成之后立即需要的
6.3 解析css 构建cssom树,不能增量方式构建,因为css规则由于特定性而可以在各个不同的点相互覆盖,这就是css阻塞渲染的原因,因为在解析所有css并构建cssom之前,浏览器无法知道每个元素在屏幕上的位置
6.4 执行js
6.4.1 载入事件,加载的js和dom被完全解析并准备就绪后就会触发document.DOMContentLoaded事件,对于需要访问dom的js,优良做法是在js执行前就等待此事件
6.4.2 在其他所有内容完成加载后,将触发window.onload事件
6.5 合并dom和cssom构建渲染树,表示将要渲染到页面上的所有内容(opacity:0;visibility:hidden可以被读取,display:none将不包括任何内容,head等不包含任何视觉信息的标签也会被忽略)浏览器会先从DOM树的根节点开始遍历每个可见节点,然后对每个可见节点找到适配的CSS样式规则并应用
6.6 渲染树生成后,还需要获取到各个节点的位置信息,需要布局的处理,从渲染树的根节点开始遍历,渲染树的每个节点都是一个render Object对象,包括宽高,位置,背景等样式,所以浏览器根据这些信息确定每个节点具体的位置,最终输出的就是盒子模型
6.7 绘制阶段,浏览器会遍历渲染树,调用渲染器的paint()方法在屏幕上显示其内容,渲染树的绘制工作由浏览器的UI后端组件完成
6.7.1 减少reflow、repaint触发次数
用transform做形变和位移可以减少reflow
避免逐个修改节点样式,尽量一次性修改
使用DocumentFragment将需要多次修改的DOM元素缓存,最后一次性append到真实DOM中渲染
可以将需要多次修改的DOM元素设置display:none,操作完再显示。(因为隐藏元素不在render树内,因此修改隐藏元素不会触发回流重绘)
避免多次读取某些属性
通过绝对位移将复杂的节点元素脱离文档流,形成新的Render Layer,降低回流成本
7.断开TCP连接
连接:
http/1.0中默认使用短连接,请求一次资源就建立一个会话,结束后断掉
http/1.1起默认使用长连接,会在响应头加connection: keep-alive ,实际是tcp协议的长连接和短连接,长连接可以省去较多的TCP建立和关闭操作,减少浪费,节约时间,对于频繁请求适合使用长连接
四次挥手:
7.1 客户端发出连接释放报文,停止发送数据
7.2 服务端接收到连接释放报文,发出确认报文ack包,如果还有数据需要发送,则先不断开连接(客户端收到确认请求后,等待服务器发送连接释放报文)
7.3 服务端将最后的数据发送完毕,发送连接释放报文
7.4 客户端收到服务器的连接释放报文后,发出确认报文,等待2ms(最长报文段寿命)后,进入closed状态(服务器只要收到客户端发送的确认报文后,立即进入closed状态,服务器结束tcp连接的时间比客户端早一点)
8.浏览器对页面进行渲染
将HTML文档和CSS文档解析组合并绘制到浏览器窗口上(参考6)