HTTP和HTTPS

作者: 漆先生 | 来源:发表于2022-03-11 20:33 被阅读0次

    参考连接:
    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
    1. Last-Modified标注的最后修改只能精确到秒级,如果某些文件在1秒钟以内,被修改多次的话,它将不能准确标注文件的修改时间

    2. 如果某些文件会被定期生成,当有时内容并没有任何变化,但Last-Modified却改变了,导致文件没法使用缓存

    3. 有可能存在服务器没有准确获取文件修改时间,或者与代理服务器时间不一致等情形

    3.总结

    • 浏览器先根据这个资源的http头信息来判断是否命中强缓存。如果命中则直接加在缓存中的资源,并不会将请求发送到服务器。
    • 如果未命中强缓存,则浏览器会将资源加载请求发送到服务器。服务器来判断浏览器本地缓存是否失效。若可以使用,则服务器并不会返回资源信息,浏览器继续从缓存加载资源。
    • 如果未命中协商缓存,则服务器会将完整的资源返回给浏览器,浏览器加载新资源,并更新缓存。

    三、HTTPS

    HTTPS是一种应用层协议,本质上来说它是HTTP协议的一种变种。HTTPS比HTTP协议安全,因为HTTP是明文传输,而HTTPS是加密传输,加密过程中使用了三种加密手段,分别是证书,对称加密和非对称加密。HTTPS相比于HTTP多了一层SSL/TSL,其构造如下:


    image.png

    四、HTTPS的连接建立流程

    1. 客户端发送请求,包含客户端支持的加密协议及版本,SSL、TLS
    2. 服务器返回协商的加密协议
    3. 服务器返回证书,计算证书摘要,并用私钥加密,跟证书一起发给客户端
    4. 客户端验证证书有效性,客户端用公钥解密证书,并计算摘要,与收到的摘要进行对比
    5. 客户端生成一个随机对称秘钥,用证书中的公钥加密,用Hash算法计算握手信息,使用对称秘钥进行加密,发送到服务器
    6. 服务端用私钥解密,得到客户端的对称秘钥,用对称秘钥解密握手信息,验证Hash值是否一致,使用对称秘钥加密握手信息发送给客户端
    7. 客户端解密并验证握手信息Hash正确,握手结束

    相关文章

      网友评论

        本文标题:HTTP和HTTPS

        本文链接:https://www.haomeiwen.com/subject/jsocdrtx.html