任选一个浏览器,对于其涉及的请求中的缓存策略展开具体分析————选择的“淘宝”
1 背景知识
什么是HTTP,其基本特点?
- HTTP(Hyper Text Transfer Protocol):超文本传输协议,是一种用于分布式、协作式和超媒体信息系统的应用层协议。简单来说就是一种发布和接收HTML页面的方法,被用于在Web浏览器和网站服务器之间传递消息。
- 应用层协议,默认工作在TCP协议80端口
- 请求响应
- 简单可扩展
- 无状态
什么是HTTPs,其基本特点是什么? - HTTPS(Hypertext Transfer Protocol Secure):超文本传输安全协议,是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。
- HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。
- HTTPS默认工作在TCP协议443端口
HTTP和HTTPS的区别? 参考:zhuanlan.zhihu.com/p/151764515
- 1、安全性不同。https://前缀表明使用SSL(安全套接字)或TSL加密的,电脑与服务器之间收发的信息传输将更加安全。当使用浏览器访问一个HTTP网站的时候,会发现浏览器会对该HTTP网站显示“不安全”的安全警告,提示用户当前所访问的网站可能会存在风险。而当访问的是https网站时,浏览器的地址栏会出现一把“安全锁”的图标。
- 2、网站申请流程不同。https协议需要到CA申请证书,一般免费证书很少,需要缴费,Web服务器启用SSL需要获得一个服务器证书并将该证书与要使用SSL的服务器绑定。
- 3、默认端口不同。http和https使用的是完全不同的连接方式,同时使用的端口也不同,http使用的是80端口,https使用的是443端口。在网络模型中,HTTP工作与应用层,而HTTPS工作在传输层。
简单来说:
- http: 超文本传输协议,明文传输,信息不安全。用的是80端口
- https: 安全套接字超文本传输协议,有ssl/tsl证书,信息安全。用的443端口
2 协议分析
Method:
- Safe(安全的):不会修改服务器的数据的方法 GET HEAD OPTIONS
- Idempotent(幂等):同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的,所有safe的方法都是Idempotent GET HEAD OPTIONS PUT DELETE
状态码:
- 200 OK - 客户端请求成功
- 301 资源被永久转移到其他URL
- 302 临时跳转
- 401 Unauthorized 请求未经授权
- 404 请求资源不存在,可能是输入了错误的URL
- 500 服务器内部发生了不可预期的错误
- 504 Gateway Timeout 网关或者代理的服务器无法在规定时间内获得想要的响应
缓存:
- 强缓存
- 协商缓存
3 常见场景分析(静态资源、登录)-- 淘宝
- 打开microsoft Bing
- 输入www.jd.com/
- 打开控制台
- 右键 -> 检查
- F12
- 切换到network
缓存策略是怎样的?
- 强缓存
- Cache-control:一年
还有什么信息?
- 允许所有域名访问
- 资源类型:css
静态资源
静态资源方案:缓存+CDN+文件名hash
CDN:Content Delivery Network
通过用户就进行和服务器负载的判断,CDN确保内容以一种极为高效的方式为用户的请求提供服务
登录
- 扫码登录
- 账户登录
- 账号密码登录
- 打开控制台-network-勾选preserve log-过滤quick_login
- 观察请求
- 跨域解决方案
- CORS
- 代理服务器
- 同源策略是浏览器的安全策略,不是HTTP的
- dev serve就是webpack解决跨域方案的其中一个
- Iframe
- 诸多不便
- 分析
1、向什么地址做了什么动作?
- 使用GET方法
- 目标域名:seq.jd.com
- 目标:/jseq.html
2、携带了哪些信息,返回了哪些信息?
-
携带信息
- Post body,数据格式为form
- 希望获取的数据格式为json
- 已有的cookie
-
返回信息
- 数据格式json
- 种cookie的信息
技术方式
- SSO(Single Sign On):单点登录
4 实战
浏览器
- Ajax之XHR
- XHR:XMLHttpRequest
- readyState
- 0 UNSENT 代理被创建,但尚未调用open()方法
- 1 OPENED open()方法已经被调用
- 2 HEADERS_RECEIVED send()方法已经被调用,并且头部和状态已经可获得
- 3 LOADING 下载中;responseText属性已经包含部分数据
- 4 DONE 下载操作已完成
- Ajax之Fetch
- XMLHttpRequest的升级版
- 使用Promise
- 模块化设计、Response、Request、Header对象
- 通过数据流处理对象,支持分块读取
node篇
- 标准库:HTTP/HTTPS
- 默认模块,无需安装其他依赖
- 功能有限,不是十分友好
- 常用的请求库:axios
- 支持浏览器、nodejs环境
- 丰富的拦截器
// 全局配置
axios.defaults.baseURL = 'https://api.example.com'
// 添加请求拦截器
axios.interceptors.request.use(function (config){
// 在发送请求之前做些什么
return config
}, function (error){
// 对请求错误做些什么
return Promise.reject(error)
})
// 发送请求
axios({
method:'get',
url:'http://test.com',
responseType:'stream',
}).then(function(response){
response.data.pipe(fs.createWriteStream('ada_lovelace.jpg'))
})
网络优化学习
参考:xiaolincoding.com/network/2_h…
数据传输的HTTP协议转成加密数据传输的HTTPS协议,给应用数据套了个[保护伞],提高安全性的同时也带来了性能消耗。
HTTPS相比HTTP协议多了一个TLS协议握手过程,目的是为了通过非对称加密握手协商或者交换出对称加密密钥,这个过程最长可以花掉2 RTT,接着后续传输的应用数据都得使用对称加密密钥来加密/解密。
多个角度优化HTTPS:
- 分析性能损耗
- TLS协议握手过程
- 握手后的对称加密报文传输
- 硬件优化
- 选择支持AES-NI特性的CPU
- 软件优化
- 升级Linux内核:一般最新版本不仅提供了最新的特性,也优化了以前软件的问题或性能
- 升级OpenSSL
- 会话复用
- Session ID
- Session Ticket
- Pre-shared Key
- 协议优化(对密钥交换过程进行优化)
- 密钥交换算法优化:选用ECDHE
- 使用RSA密钥交换算法的TLS握手过程,不仅慢,而且安全性也不高
- 尽量选用ECDHE密钥交换算法替换RSA算法,因为该算法支持[False Start],即抢跑的意思,客户端可以在TLS协议的第三次握手后,第四次我收钱,发送加密的应用数据,以此将TLS握手的消息往返由2 RTT减少到1 RTT,而且安全性也高,具备前向安全性。
- TLS升级:升级为TLS 1.3
- TLS1.3大幅度简化了握手的步骤,完成TLS握手只要1 RTT,TLS 1.3把Hello和公钥交换这两个消息合并成了一个消息,于是这样就减少到只需1 RTT就能完成TLS握手
- 对于密钥交换算法,废除了不支持前向安全性的RSA和DH算法,只支持ECDHE算法
- 密钥交换算法优化:选用ECDHE
- 证书优化
- 证书传输优化:选用ECDSA证书
- 要让证书更便于传输,那必然是减少证书的大小,可以节约宽带,也能减少客户端的运算量。所以,对于服务器的证书应该选择椭圆曲线(ECDSA)证书,而不是RSA证书,因为在相同安全强度下,ECD密钥长度比RSA短得多。
- 证书验证优化:CRL/OCSP/OCSP Stapling
- 客户端在验证证书时,会走证书链逐级验证,验证的过程不仅需要[用CA公钥解密证书]以及[用签名算法验证证书的完整性],而且为了知道证书是否背CA吊销,客户端有时还会再去访问CA,下载CRL或者OCSP数据,以此确认证书的有效性。
- 证书传输优化:选用ECDSA证书
扩展学习
通信方式
webSocket:
- 浏览器与服务器进行全双工通讯的网络技术
- 典型场景:实时性要求高,例如聊天室
- URL使用ws://或wss://等开头 QUIC:Quick UDP Internet Connection
- 0-RTT建联(首次建联除外)
- 类似TCP的可靠传输
- 类似TLS的加密传输,支持完美前向安全
- 用户空间的拥塞控制,最新的BBR算法
- 支持h2的基于流的多路复用,但没有TCP的HOL问题
- 前向纠错FEC
- 类似MPTCP的Connection migration
总结
在互联网高速发展的时代,大多数网站首页大小都超过了2M,请求数量多达100个。同时,HTTP还会用在移动互联网的客户端app,不同性质的app对HTTP的使用差异也非常大。对于电商类app,加载首页的请求可多达10多个;对于微信这类IM,HTTP请求可能仅限于语音和图片文件的下载,请求出现频率不算高。
在对HTTP的场景应用学习之后,希望能够比之前更加正确高效地使用http进行项目开发。“鱼和熊掌不可兼得”,但考虑到HTTPS具有安全性特点,还是会选择在安全的前提下,通过其他方式提高网络性能。