# 浏览器输入地址后到看到页面发生了什么?
-
对
URL进行DNS解析得到对应的IP地址
DNS域名解析采用的是递归查询,顺序为:
先找DNS缓存=>根域名服务器=>继续查找下一级
找到之后给浏览器缓存查找顺序大概是:
浏览器DNS缓存=>系统DNS缓存=>host文件查找=>递归去服务器查找 -
根据
IP地址找到对应的服务器并发起TCP三次握手
TCP是一个端到端的可靠的面向链接的协议,HTTP基于传输层TCP协议不用担心数据传输的各种问题,如会错传重传等问题。 建立一个TCP链接时需要客户端和服务端共发送三个包:
(a). 客户端发送一个包到服务器并等待确认
(b). 服务器收到客户端的包,并向客户端发送一个确认包
(c). 客户端接收到服务端的确认包,三次握手,TCP链接成功 -
建立
TCP链接后发送HTTP请求(请求头和请求体) -
服务器响应
HTTP请求,返回响应的数据包
服务器收到处理的请求开始做负载均衡和跨域等
文件处理完毕生成响应数据包(响应头和响应体)并返回 -
经过网络传输文件被下载到本地客户端,浏览器收到
HTTP响应,客户端开始加载 -
浏览器得到
HTML代码后开始解析,并请求HTML代码中的资源,如CSS、JS和图片 -
浏览器开始对页面进行渲染并呈现给用户
(1). 解析HTML文件是自上问下即先是头部后是Body
(2). 当解析到头部CSS/JS外部链接时,同步下载
(3). 接着解析Body部分,将HTML文件解析成DOM树
(4). 同时等待CSS文件下载完成后解析成CSSOM树
(5). DOM树和CSSOM树就组成了Render Tree渲染树
(6). CSS文件加载不会阻塞HTML的解析,但是会阻塞DOM的渲染及后面JS语句的执行
(7). 在下载JS时会阻塞HTML的解析和渲染,有分几种情况\- (a). 没有defer和async标签的script会立即加载并执行
- (b). 有async属性会异步下载,完成后立即执行,且不一定按顺序,有可能会阻塞HTML渲染。
- (c). 有defer属性会异步下载,完成会等到DOM生成以后再按顺序执行,不会阻塞HTML解析和渲染。
(8). 渲染树一旦有了结构模型,就会同步计算渲染树节点的布局位置
(9). 计算出渲染坐标后开始同步渲染
(10). 进行过程中如遇到图片则跳过去,渲染下面的内容,等图片下载成功后返回来再渲染原来图片的位置
(11). 如果渲过程中出现JS代码调整DOM树结构的情况,会再次从修改DOM开始
(12). 最终所有节点和资源全都渲染完成,页面渲染结束
-
服务器关闭TCP链接,TCP四次挥手
# 一个 TCP 链接能发几个 HTTP 请求
HTTP 1.0一般情况下不支持长连接,因此在每次请求发送完毕之后,TCP 连接会立即断开
故此HTTP 1.0 一个 TCP 发送一个 HTTP 请求。
但是通过在请求头带上Connection: Keep-Alive将一条TCP连接保持在活跃状态,并且客户端和服务端都支持的情况下,其实也可以发送多条,不过此方式也有限制。
HTTP 1.1支持了长连接,HTTP 2.0版本协议支持了多用复用。
故此只要不断开TCP的连接,HTTP请求数也是可以没有上限地持续发送。
# HTTP 与 HTTPS 的区别
HTTP是超文本传输协议,设计目的是为了提供一种发布和接收HTML页面的方法
HTTPS是以数据保密性完整性和身份校验安全性为目标的HTTP安全版
之间区别具有以下几种:
-
传输信息安全不同
HTTP 是超文本传输协议,明文传输
HTTPS 是SSL机密传输协议,密文传输 -
端口不同
HTTP 默认是80,HTTPS 默认是443 \ -
链接方式不同
HTTP 是无状态链接
HTTPS 是SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,安全性更高 -
证书申请方式不同
HTTP 协议免费,HTTPS 需要CA证书,一般需要付费
与 HTTP 相比 HTTPS 有哪些改进:
- 双向的身份认证
- 数据传输的机密性
- 防止重放攻击
HTTPS 优点:
- 可认证用户和服务器,确保数据发送到正确的客户机和服务器
- 是由
SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全 - 是现行架构下最安全的解决方案(
虽然不是绝对安全)
HTTPS 缺点
- 握手阶段比较费时,使页面加载时间延长
- HTTPS 连接缓存不如 HTTP 高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响
- SSL 证书需要钱,功能越强大费用越高,且 SSL 证书通常需要绑定 IP,不能在同一 IP上绑定多个域名
# GET请求 和 POST请求的 区别
-
从安全性讲两者都不安全
GET请求参数在URL地址上直接暴露
POST请求的参数Body部分按F12也暴露了 -
GET请求因为是向URL添加数据,不同的浏览器厂商、代理服务以及web服务器都可能会有自己的长度限制,而POST请求没有长度限制。
-
GET请求一般不具有请求体,因此只能进行URL编码,而POST请求支持多种编码。
-
GET请求可以收藏为书签,POST请求不可以收藏为书签。
-
GET请求可以被缓存,POST请求不可以被缓存
-
GET生产一个TCP数据包,POST产生两个数据包
(GET):浏览器回吧Http header 和 data一并发出去,服务器响应200
(POST):浏览器先发送Header,服务器响应100 continue,浏览器再发送data服务器响应200。
# 如何进行Web性能监控
Web的性能一定程度上影响了用户留存率,经有关研究表明:如果一个移动端页面加载时常超过3秒,用户就会舍弃离开,并且网页加载时常每增加1秒用户就会流失10%。
具体监控什么可以用Google提出的RAIL模型来衡量性能:Response、Animation、Idle、Load,并指出最好的性能指标是:
- 100ms内响应用户的输入
- 动画或者滚动需在10ms内产生下一帧
- 最大化空闲时间
- 页面加载时长不烧过5秒
RAIL主要思想
- 以用户为中心:最终目标不是让网站在任何特定的设备上都能运行很快,而是让用户满意
- 立即响应用户:在100ms以内确认用户输入
- 设置动画或滚动时:在10ms以内生成帧
- 最大程度增加主线程的空闲时间
- 持续吸引用户:在1000ms以内呈现交互内容
具体可分为三个方面
- 响应速度:页面初始访问速度 + 交互响应速度
- 页面稳定性:页面出错率
- 外部服务调用:网络请求访问速度
监控分两类
- 合成监控采用Web浏览器模拟器来加载网页:
Lighthouse、PageSpeed、WebPageTest、Pingdom - 真实用户监控是一种服务,可通过SDK方式接入,收集用户真实数据:
oneapm、datadog、frontJs
# HTTPS 工作原理
-
首先HTTPS请求服务端生成证书,客户端对证书的有效期、合法性、域名是否与请求域名一直以及证书公钥(RSA加密)等进行校验。
-
客户端如果校验通过后,就根据证书的公钥有效期生成随机数,随机数使用公钥进行加密(RSA加密)
-
消息体产生后对它的摘要进行MD5加密/SHA1算法加密,此时就得到了RSA签名
-
发送服务端,此时只有服务端(RAS私钥)能解密
-
解密得到的随机数再用AES加密作为秘钥,此时的秘钥只有客户端和服务端知道
# 常见的HTTP相应状态码
200:请求被正常处理
204:请求被受理但没有资源可以返回
301:永久性重定向
302:临时重定向
303:与302功能相似,只是它希望客户端在请求一个URL时,能通过GET方法重定向到另一个URL上
304:发送附带条件的请求时,条件不满足时返回,与重定向无关
307:临时重定向,与302类似,只是强制要求使用POST方法
400:请求报文语法有误,服务器无法识别
401:请求需要认证
403:请求的对应资源禁止被访问
404:服务器无法找到对应资源
500:服务器内部错误
503:服务器正忙