• 01HTTP的前世今生


    互联网构建超链接文档系统的构想,三项关键技术:

    • URI   统一资源标识符
    • HTML  超文本标记语言
    • HTTP  超文本传输协议

    HTTP/0.9

      网络上绝大多数的资源都是纯文本格式。(因为起初 蒂姆·伯纳斯-李最初设想的系统里的文档都是只读的),所以只允许用“GET”动作从服务器获取HTML文档,并在响应请求之后立即关闭连接。

    •   纯文本格式传输
    •   只有GET方法

    HTTP/1.0 

      于是在这些已有实践的基础上,经过一系列的草案,HTTP/1.0 版本在 1996 年正式发布。它在多方面增强了 0.9 版,形式上已经和我们现在的 HTTP 差别不大了,例如:

    1. 增加了 HEAD、POST 等新方法;
    2. 增加了响应状态码,标记可能的错误原因;
    3. 引入了协议版本号概念;
    4. 引入了 HTTP Header(头部)的概念,让 HTTP 处理请求和响应更加灵活;
    5. 传输的数据不再仅限于文本。(因为1992年发明了JPEG图像格式,1995年发明了MP3音乐格式)

    但 HTTP/1.0 并不是一个“标准”,只是记录已有实践和模式的一份参考文档,不具有实际的约束力,相当于一个“备忘录”

    HTTP/1.1--正式的标准

      1995 年,网景的 Netscape Navigator 和微软的 Internet Explorer 开始了著名的“浏览器大战”,都希望在互联网上占据主导地位。最后IE取得了决定性的胜利。后来网景凭借 Mozilla Filefox 又扳回一局。

      不过,说 HTTP/1.1 是“小幅度修正”也不太确切,它还是有很多实质性进步的。毕竟经过了多年的实战检验,比起 0.9/1.0 少了“学术气”,更加“接地气”,同时表述也更加严谨。HTTP/1.1 主要的变更点有:

    1. ’增加了 PUT、DELETE 等新的方法;
    2. 增加了缓存管理和控制;
    3. 明确了连接管理,允许持久连接(keep-Alive);
    4. 允许响应数据分块(chunked),利于传输大文件;
    5. 强制要求 Host 头,让互联网主机托管成为可能。

    出现的问题:请求队列出现队头阻塞。

    HTTP/2

      HTTP/1.1 发布之后,整个互联网世界呈现出了爆发式的增长,度过了十多年的“快乐时光”,更涌现出了 Facebook、Twitter、淘宝、京东等互联网新贵。

      这期间也出现了一些对 HTTP 不满的意见,主要就是连接慢,无法跟上迅猛发展的互联网,但 HTTP/1.1 标准一直“岿然不动”,无奈之下人们只好发明各式各样的“小花招”来缓解这些问题,比如以前常见的切图、JS 合并等网页优化手段

      Google 首先开发了自己的浏览器 Chrome,然后推出了新的 SPDY 协议。Google 借此顺势把 SPDY 推上了标准的宝座,互联网标准化组织以 SPDY 为基础开始制定新版本的 HTTP 协议,最终在 2015 年发布了 HTTP/2,RFC 编号 7540。

      HTTP/2 的制定充分考虑了现今互联网的现状:宽带、移动、不安全,在高度兼容 HTTP/1.1 的同时在性能改善方面做了很大努力,主要的特点有:

    1. 二进制协议,不再是纯文本;
    2. 可发起多个请求,废弃了 1.1 里的管道;
      1. http1.1的长久连接,出现了队头阻塞,后来为了解决队头阻塞,提出了并发连接
      2. 并发多个请求,必须使用多个 TCP 链接,且浏览器为了控制资源,还会对单个域名有 6-8个的TCP链接请求限制
      3. 最后一种性能优化:域名分片。
    3. 使用专用算法压缩头部,减少数据传输量;
    4. 允许服务器主动向客户端推送数据;增强了安全性,“事实上”要求加密通信;
      1. 服务端可以在发送页面HTML时主动推送其它资源,而不用等到浏览器解析到相应位置,发起请求再响应。

    HTTP/3

      在 HTTP/2 还处于草案之时,Google 又发明了一个新的协议,叫做 QUIC。

    总结:

      HTTP发展的原动力:用户的需求,以用户体验为核心,更快,更安全,更稳定。

    注:

      本文纯属学习笔记,参考罗剑锋老师的《透视HTTP协议》

  • 相关阅读:
    MySQL GROUP_CONCAT 限制
    java 正则表达式匹配${xxx}
    记一次引用maven插件报错解决方法
    [Linux] Ubuntu修改时区
    【Linux】 无密码SCP在Crontab中失效的解决办法
    [Docker] Docker Hub加速
    [MySQL] MySQL中关于外键报错的解决和建议
    [Linux] 一次SSH认证失败引发的关于通过日志查错误的思考
    Tomcat Jboss Glassfish 三种常见web容器比较
    [Linux]运维三十六计--腾讯两位大神的总结
  • 原文地址:https://www.cnblogs.com/jiox/p/14379774.html
Copyright © 2020-2023  润新知