引言
描述在网页中输入网址,按下enter键到看到整个页面的过程
准备阶段
客户端:
服务端:
此时,买了服务器,把开发的项目源文件传到服务器目录下,网也连了外网IP也有了,域名也买了,接下来就剩域名解析。
【注意】:DNS域名解析服务器是全世界公用的,不用买,有很多DNS,做的是个分布式
还要用IIS,nginx和appache发布web服务,告诉访问哪个域名进来之后找哪个项目。
图中的例子是一台服务器可以放很多项目,通过端口号区分项目
流程
大体流程如下图
【HTTP请求阶段:向服务器发送请求】
- 浏览器首先向DNS域名解析服务器发送请求
- DNS反解析:根据浏览器请求地址中的域名,到DNS服务器中找到对应的IP地址
- 通过找到的外网IP,向对应的服务器发送请求(首先访问的是服务器的WEB站点管理工具:准确来说是我们先基于工具在服务器上创建很多服务,当由客户端访问的时候,服务器会匹配出具体是请求哪个服务)
- 通过URL地址中携带的端口号,找到服务器上对应的服务以及服务所管理的项目源文件
【HTTP响应阶段:服务器把客户端需要的内容准备好并且返回给客户端】
- 服务端根据请求地址中的路径名称,问号传参或者哈希值,把客户端需要的内容进行准备和处理
- 把准备的内容响应给客户端(如果我们请求的是HTML或者CSS等这样的资源文件,服务器返回的是资源文件中的源代码
不是文件本身
)
【浏览器渲染阶段】
- 客户端浏览器接收到服务器返回的源代码,基于自己内部的渲染引擎(内核)开始进行页面的绘制和渲染
->首先计算DOM结构,生成DOM TREE (要画什么)
->自上而下运行代码,加载CSS等资源内容(准备源材料)
->根据获取的CSS生成带样式的 RENDER TREE(想怎么画)
->开始渲染和绘制(开始画)
实例
找个csdn网址实验一下
https://blockchain.csdn.net/
打开network
第一个加载的是当前html页面所有源代码
开始自上而下解析,遇到link/script,再次向服务器发一个请求,还是哪个流程把css/js拿回来。
到一个页面展示完成,要发很多次请求。除了第一次的html,在解析html的时候遇到link,script,img都得再单独发一次,一直到所有资源都拿回来,render tree也完了,浏览器也画完了,才能看见。
名词
-
HTTP事务:一次完整的请求+响应,事务就是完整的一次操作,请求和响应缺一不可
-
一个页面完全加载完成,需要向服务器发起很多HTTP事务操作,一般来说:首先把HTML源代码拿回来,加载HTML的时候遇到link/script/img[src]/iframe/video和audio[没有设置preload=‘none’]…都会重新和服务器端建立HTTP事务交互
-
特殊情况:如果我们做了资源缓存处理(304),而且即将加载的资源在之前已经加载过了,这样的操作和传统的HTTP事务不一样,他们是从服务器和浏览器缓存中读取数据,比传统读取快很多
-
在客户端向服务器发送请求,以及服务器把内容响应给客户端的时候,中间相互传递了很多内容(客户端把一些内容传递给服务器,服务器把一些内容响应给客户端,我们把传递的内容统称为HTTP报文)
-
浏览器是异步的,可以分很多线程拿很多资源,浏览器和服务器建立很多http事务通道,通道越多越发堵塞,后面会说前端性能优化