1.DNS解析
域名解析,如www.baidu.com我们知道这是百度首页的网址,但是电脑是不认识他的,电脑只能根据IP地址去访问百度的服务器,所以第一步要做的就是把域名解析成IP地址
浏览器首先会查找浏览器自身的缓存,若有则直接访问,若没有则查看系统的缓存,有则访问,没有就去路由器查。。。就这样直到查到顶级ISP一定会找到。
2.三次“握手”建立TCP连接
client和sever都要确认对方能收能发才会建立连接
当clien收到 SYN+ACK 的时候,他就可以确认server能发送信息,由SYN+ACK确认码可以知道server刚刚收到了第一条数据,就此client可以确定server端能收能发
当server收到 第一条数据 SYN时,可以确认client具有发送数据能力,当server收到ACK时,可以确定刚刚client收到了自己发送的数据,就此server可以确定client端能收能发
打个比方就是:
client: 老王你吃了吗?
server:我吃过了,你呢?
client: 我也吃过了
双方都能确定对方吃饭了,这样就建立起一条TCP连接
3.发送http请求
建立连接之后就可以发送请求了,这里的请求就是我们要访问的网站
4.服务器处理请求
服务器收到请求后,就会根据后端代码处理请求,那就看具体业务了
5.返回响应结果
无论服务器怎么处理请求最后都会返回响应结果,如果我们访问www.baidu.com服务器就会返回一个html页面
几个常见的响应码
2xx | 成功 |
3xx | 重定向 |
4xx | 请求错误 |
5xx | 服务器错误 |
6.关闭连接(现在浏览器都是默认keep-alive,是长连接,会在关闭tab时才关闭连接)
当没有数据需要传递时,为了节约网络资源,任意一方都可以发起关闭请求
client和server都要发送关闭请求并要收到对方的确认
打个比方:
client: 我要关闭连接
server: 知道了
server: 我也要关闭连接
client: 知道了
双方都确认后就关闭了TCP连接
7.解析html、渲染页面
当浏览器拿到服务器返回的html文件时,就会对他进行逐行解析最后渲染
- 解析html生成DOM树
- 解析css生成CSSOM规则书
- 讲DOM树与CSSOM规则树合并在一起生成render tree
- 遍历render tree 开始布局, 计算每个节点的大小位置等信息
- 将render tree的每个节点绘制到屏幕上
这就是解析渲染的过程,但是html的解析和渲染并不是一帆风顺的
- css加载会阻塞js执行
- js的加载会阻塞所有动作,html解析DOM构建等,直到js加载并执行完成
但是html给script标签提供里两个属性 defer 和 async可以让js异步加载,也就是加载js时不会阻塞,只有执行js时才会阻塞,但是他们俩还是有区别的
defer: 异步加载脚本,也就是加载时不会阻塞,js脚本会按照出现在html中的顺序在所有元素解析完成后才执行
async: 异步加载脚本,也即是加载时不会阻塞,js脚本会在加载完成后立即执行,并且无序,完全不考虑脚本之间的依赖