HTTP和HTTPS
参考连接:
http://events.jianshu.io/p/cd70b8e90d00
https://www.cnblogs.com/ranyonsue/p/8918908.html
https://blog.csdn.net/seujava_er/article/details/90018326
https://www.cnblogs.com/liyuhui-Z/p/7844880.html
一、HTTP版本
1.0版本
- 无状态,无连接;
- 短连接:每次发送请求都要重新建立tcp请求,即三次握手,非常浪费性能;
- 无host头域,也就是http请求头里的host;
- 不允许断点续传,而且不能只传输对象的一部分,要求传输整个对象。
1.1版本
- 长连接,流水线,使用connection:keep-alive使用长连接;
- 请求管道化;
- 增加缓存处理(新的字段如cache-control);
- 增加Host字段,支持断点传输等;
- 由于长连接会给服务器造成压力
2.0版本
- 二进制分帧;
- 多路复用(或连接共享),使用多个stream,每个stream又分帧传输,使得一个tcp连接能够处理多个http请求;
- 头部压缩,双方各自维护一个header的索引表,使得不需要直接发送值,通过发送key缩减头部大小;
- 服务器推送(Sever push)
3.0版本
- 基于google的QUIC协议,而quic协议是使用udp实现的;
- 减少了tcp三次握手时间,以及tls握手时间;
- 解决了http 2.0中前一个stream丢包导致后一个stream被阻塞的问题;
- 优化了重传策略,重传包和原包的编号不同,降低后续重传计算的消耗;
- 连接迁移,不再用tcp四元组确定一个连接,而是用一个64位随机数来确定这个连接;
- 更合适的流量控制。
二、HTTP缓存机制
1.强缓存
游览器不会发送请求给服务器。利用http的返回头中的Expires或者Cache-Control两个字段来控制的,用来表示资源的缓存时间。Cache-Control的优先级比Expires高。
Expires
缓存过期时间,用来指定资源到期的时间,是服务器端的具体的时间点。当客户端本地时间被修改以后,服务器与客户端时间偏差变大以后,就会导致缓存混乱。
Cache-Control
Cache-Control是一个相对时间,Cache-Control:max-age指定,由于是相对时间,且都是和客户端时间比较,客户端和服务器有时间偏差也不会导致问题。
2.协商缓存
游览器发送请求给服务器。根据http头信息中的Last-Modify/If-Modify-Since或Etag/If-None-Match来判断是否命中协商缓存。如果命中,则http返回码为304,浏览器从缓存中加载资源。
Last-Modify/If-Modify-Since
服务器返回的header中会加上Last-Modify,Last-modify是一个时间标识该资源的最后修改时间,再次发起请求时,发送的请求头中会包含If-Modify-Since,该值是之前返回的Last-Modify。服务器收到If-Modify-Since后,根据资源最后修改时间判断是否命中缓存。问题是,有时候通过最后修改时间来判断资源是否修改还是不太准确,资源变化了最后修改时间也可以一致。
ETag/If-None-Match
与Last-Modify/If-Modify-Since不同的是,Etag/If-None-Match返回的是一个校验码(ETag: entity tag)。ETag可以保证每一个资源是唯一的,资源变化都会导致ETag变化。ETag值的变更则说明资源状态已经被修改。服务器根据浏览器上发送的If-None-Match值来判断是否命中缓存。
有Last-Modified为何还要ETag
-
Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间
-
如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存
-
有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形
3.总结
- 浏览器先根据这个资源的http头信息来判断是否命中强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。
- 如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。
- 如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。
三、HTTPS
HTTPS是一种应用层协议,本质上来说它是HTTP协议的一种变种。HTTPS比HTTP协议安全,因为HTTP是明文传输,而HTTPS是加密传输,加密过程中使用了三种加密手段,分别是证书,对称加密和非对称加密。HTTPS相比于HTTP多了一层SSL/TSL,其构造如下:
image.png
四、HTTPS的连接建立流程
- 客户端发送请求,包含客户端支持的加密协议及版本,SSL、TLS
- 服务器返回协商的加密协议
- 服务器返回证书,计算证书摘要,并用私钥加密,跟证书一起发给客户端
- 客户端验证证书有效性,客户端用公钥解密证书,并计算摘要,与收到的摘要进行对比
- 客户端生成一个随机对称秘钥,用证书中的公钥加密,用Hash算法计算握手信息,使用对称秘钥进行加密,发送到服务器
- 服务端用私钥解密,得到客户端的对称秘钥,用对称秘钥解密握手信息,验证Hash值是否一致,使用对称秘钥加密握手信息发送给客户端
- 客户端解密并验证握手信息Hash正确,握手结束