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. js求两个数的百分比

    function toPercent(num, total) { return (Math.round(num / total * 10000) / 100.00 + "%");/ ...

  2. 树形dp(最小支配集)

    http://poj.org/problem?id=3659 #include<iostream> #include<cstring> #include<algorith ...

  3. Reading

    Reading一共18min 需要背诵专业学科分类的词汇. 单词上,背四级词汇和托福词汇,达到约1w词汇. 句子上,练习速度和用词准确,其中准确包括含义准确和语序准确.  

  4. Hypothesis Tests for One Population Mean When σ Is Unknown|other

    9.5 Hypothesis Tests for One Population Mean When σ Is Unknown 使用t分布: What If the Assumptions Are No ...

  5. Google DevTools Explanation

    Evaluating network performance The Network panel records information about each network operation in ...

  6. SpringBoot打印MyBatis sql日志输出

    SpringBoot打印MyBatis sql日志输出 默认情况下mybatis是不开启SQL日志输出,需要手动配置 方法一:(在mybatis整合在springboot框架的情况下) 只需要在配置文 ...

  7. A - Divide it! CodeForces - 1176A

    题目: You are given an integer nn. You can perform any of the following operations with this number an ...

  8. iOS(Swift)学习笔记之SwiftyJSON的使用

    本文为原创文章,转载请标明出处 1. 通过CocoaPods安装SwiftyJSON platform :ios, '10.0' target '<Your Target Name>' d ...

  9. Linux Ubuntu 查看IP

    一.第一种方式:ifconfig -a 1.打开命令终端:Crtl + Alt + T 2.执行命令:ifconfig -a 如果你没有安装net-tools工具,则出现如下显示: (没有找到'ifc ...

  10. 中心极限定理|z分布|t分布|卡方分布

    生物统计学 抽样分布:n个样本会得到n个统计量,将这n个统计量作为总体,该总体的分布即是抽样分布 根据辛钦大数定律,从一个非正态分布的总体中抽取的含量主n的样本,当n充分大时,样本平均数渐近服从正态分 ...