HTTP/1.1 与 HTTP/2.0

HTTP/1.1 持久连接

非持久连接

Fetching HTML and CSS via separate TCP connections

持久连接

Fetching HTML and CSS with connection keepalive

小结
  • 非持久HTTP连接的固定时间成本

    • 至少两次网络往返: 握手、请求和响应
  • 服务处理速度越快,固定延迟的影响就越大
  • 持久连接避免TCP连接时的三次握手,消除TCP的慢启动

HTTP/1.1管道

从上面持久连接的图我们能看到Server处理完HTML后需要response给Client,进而Client发起css的request到Server,这段时间Server是空闲的。
所以使用管道尽早发送请求,不被每次响应阻塞。
Pipelined HTTP requests with server-side FIFO queue

管道并行处理HTTP请求

Pipelined HTTP requests with parallel processing

小结
  • HTTP/1.1 局限性

    • 只能严格串行地返回响应,不允许一个连接上的多个响应交错到达
  • 管道的问题
    • 并行处理请求时,服务器必须缓冲管道中的响应,占用服务器资源
    • 由于失败可能导致重复处理,非幂等的方法不能pipeline化
    • 由于中间代理的兼容性,可能会破坏管道
  • 管道的应用非常有限

HTTP/1.1 协议开销

  • 每个HTTP请求都会携带500~800字节的header
  • 如果使用了cookie,每个HTTP请求会增加几千字节的协议开销
  • HTTP header以纯文本形式发送,不会进行任何压缩
  • 某些时候HTTP header开销会超过实际传输的数据一个数量级
    • 例如访问RESTful API时返回JSON格式的响应

HTTP/1.1性能优化建议

  • 由于HTTP/1.1不支持多路复用

    • 浏览器支持每个主机打开多个连接(例如Chrome是6个)
    • 应用使用多域名,将资源分散到多个子域名
      • 浏览器连接限制针对的是主机名,不是IP地址
  • 缺点
    • 消耗客户端和服务器资源
    • 域名分区增加了额外的DNS查询
    • 避免不了TCP的慢启动
  • 减少请求次数
    • 把多个JavaScript或CSS组合为一个文件
    • 把多张图片组合为一个更大的复合的图片
    • inlining内联,将图片嵌入到CSS或者HTML文件中,减少网络请求次数

以上优化增加应用的复杂度,导致缓存、更新等问题,只是权宜之计

HTTP/2 目标

  • 性能优化

    • 支持请求与响应的多路复用
    • 支持请求优先级和流量控制
    • 支持服务器端推送
    • 压缩HTTP header降低协议开销
  • HTTP的语义不变
    • HTTP方法、header、状态码、URI

HTTP/2 二进制分帧层

  • 引入新的二进制分帧数据层
  • 将传输的信息分割为消息和帧,并采用二进制格式的编码
    HTTP/2 binary framing layer

HTTP/2 核心概念

  • 流(Stream)

    • 已建立的连接上的双向字节流
    • 该字节流可以携带一个或多个消息
  • 消息(Message)
    • 与请求/响应消息对应的一系列完整的数据帧
  • 帧(Frame)
    • 通信的最小单位
    • 每个帧包含帧首部,标识出当前帧所属的流
      HTTP/2 streams, messages, and frames
  • 所有HTTP/2通信都在一个TCP连接上完成
  • 流是连接中的一个虚拟信道,可以承载双向的消息
  • 一个连接可以承载任意数量的流,每个流都有一个唯一的整数标识符(1、2...N)
  • 消息是指逻辑上的HTTP消息,比如请求、响应等
  • 消息由一或多个帧组成,这些帧可以交错发送,然后根据每个帧首部的流标识符重新组装

HTTP/2请求与响应的多路复用

  • HTTP/1.x中,如果客户端想发送多个并行的请求,那么必须使用多个TCP连接
  • HTTP/2中,客户端可以使用多个流发送请求,同时HTTP消息被分解为互不依赖的帧,交错传输,最后在另一端重新组装
    HTTP/2 request and response multiplexing within a shared connection

HTTP/2 请求优先级

  • HTTP/2允许每个流关联一个31bit的优先值

    • 0 最高优先级
    • 2^31 -1 最低优先级
  • 浏览器会基于资源的类型、在页面中的位置等因素,决定请求的优先次序
  • 服务器可以根据流的优先级,控制资源分配,优先将高优先级的帧发送给客户端
  • HTTP/2没有规定具体的优先级算法

HTTP/2 流量控制

  • 流量控制有方向性,即接收方可能根据自己的情况为每个流,乃至整个连接设置任意窗口大小
  • 连接建立后,客户端与服务器交换SETTINGS帧,设置 双向的流量控制窗口大小
  • 流量控制窗口大小通过WINDOW_UPDATE帧更新
  • HTTP/2流量控制和TCP流量控制的机制相同,但TCP流量控制不能对同一个连接内的多个流实施差异化策略

HTTP/2 服务器端推送

  • 服务器可以对一个客户端请求发送多个响应
  • 服务器通过发送PUSH_PROMISE帧来发起推送流
  • 客户端可以使用HTTP header向服务器发送信号,列出它希望推送的资源
  • 服务器可以智能分析客户端的需求,自动推送关键资源
    Server initiates new streams (promises) for push resources

HTTP header压缩

  • HTTP/2使用HPACK压缩格式压缩请求/响应头

    • 通过静态霍夫曼码对发送的header字段进行编码,减小了它们的传输大小
    • 客户端和服务器使用索引表来维护和更新header字段。对于相同的数据,不再重复发送
      HPACK: Header Compression for HTTP/2

参考链接:
https://hpbn.co/http1x/
https://hpbn.co/http2/
https://github.com/mz1999/blog/blob/master/docs/http2.md

HTTP/1.1 与 HTTP/2.0的更多相关文章

  1. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  2. ZAM 3D 制作3D动画字幕 用于Xaml导出

    原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...

  3. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  4. osg编译日志

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

  5. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  6. Elasticsearch 5.0 中term 查询和match 查询的认识

    Elasticsearch 5.0 关于term query和match query的认识 一.基本情况 前言:term query和match query牵扯的东西比较多,例如分词器.mapping ...

  7. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  8. vue2.0实践的一些细节

    最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...

  9. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part3:db安装和升级 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 5.安装Database软件 5. ...

  10. Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作

    Linux平台 Oracle 10gR2(10.2.0.5)RAC安装 Part1:准备工作 环境:OEL 5.7 + Oracle 10.2.0.5 RAC 1.实施前准备工作 1.1 服务器安装操 ...

随机推荐

  1. [LC] 66. Plus One

    Given a non-empty array of digits representing a non-negative integer, plus one to the integer. The ...

  2. Javascript 表达式中连续的 && 和 || 之赋值区别

    为了区分赋值表达式中出现的连续的 ‘&&’和 ‘||’的不同的赋值含义,做了一个小测试,代码如下: function write(msg){     for(var i = 0; i ...

  3. Html 的生命周期

    零.序言 vue 用多了,自然离不开生命周期.最近突发奇想,加上之前看过的文章中关于 script 标签中的 async 和 defer 的捣糨糊,决定整理一下,攻克这个模糊点. 当然,最多的还是与 ...

  4. 吴裕雄--天生自然python学习笔记:Python3 输入和输出

    输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数. 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用. 如果你希望输出的 ...

  5. 为什么有这么多人呼吁要取代Facebook?

    扎克伯格这段时间算是栽了,身为人生大赢家的他或许正在遭受最为灰暗的时刻.因为泄露5000万用户数据这一事件,Facebook股价暴跌且扎克伯格身家缩水.被英国与美国相关部门调查.#删除Facebook ...

  6. cas单点登录打包时下载慢!

    环境:win10 百度网盘下载 版本:  cas-overlay-template-5.3  提取码    d1b6 添加阿里的到pom.xml    注意添加到第一列 <!--阿里云仓库--& ...

  7. unittest(9)- 使用ddt给测试用例传参

    # 1. http_request.py import requests class HttpRequest: def http_request(self, url, method, data=Non ...

  8. MariaDB 命令

    1.账号登入 mysql -u root -p 上述命令,“root” 是登入账号,上述命令回车后,则进行密码的输入 登入成功后如下: 2.创建用户命令 create user 'new_user'@ ...

  9. 将js进行到底:node学习10

    node.js数据库篇--MySQL NoSQL大行其道的如今,MySQL这样的关系型数据库依然有着不可撼动的位置,对于中型,大型面向对象的项目,关系型数据库依然是首选,真正的项目,应当是将数据库的任 ...

  10. 关于sql拼接的知识点 where1=1

    String sql="select * from tab_route where 1 = 1 "; 这样不会报错,而且可以根据情况,再去拼接sql 可以使用if(){}else{ ...