HTTP/1.1 的优化
HOST域

  • 随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址

长连接

  • 就是多个 http 请求共用一个 tcp 连接; 这样可以减少多次临近 http 请求导致 tcp建立关闭所产生的时间消耗.其中Keep-Alive:timeout=30,max=5, timeout 是两次 http 请求保持的时间(s), max 是这个 tcp 连接最多为几个 http请求重用

    • keep-alive 还有一个有效期,有效期结束后服务端会发侦查帧探查 TCP 是否有效,HTTP 的 keep-alive 是为了让 TCP 活久一点,而 TCP 本身也有一个 keepalive(注意没有横杠哦)机制。这是 TCP 的一种检测连接状况的保活机制,keepalive 是 TCP 保活定时器:TCP 建立后,如果闲置没用,服务器不可能白等下去,闲置一段时间[可设置]后,服务器就会尝试向客户端发送侦测包,来判断 TCP 连接状况,如果没有收到对方的回答(ACK包),就会过一会[可设置]再侦测一次,如果多次[可设置]都没回答,就会丢弃这个 TCP 连接
  • 长连接中的请求依旧是串行处理

HTTP/1.1 的问题
队头阻塞

  • 在 HTTP 请求应答过程中,如果出现了某种情况,导致响应一直未能完成,那后面所有的请求就会一直阻塞着,这种情况叫队头阻塞。
  • 和TCP队头阻塞的区别:TCP传输的单位是数据包,它的队头阻塞表示的是前一个报文没有收到便不会将下一个报文上传给HTTP。而HTTP队头阻塞是在 请求-响应 层面,前一个请求还没有处理完,后面的请求就被阻塞。

低效的 TCP 利用

  • 由于 TCP 慢启动机制,导致每个 TCP 连接在一开始的时候传输速率都不高,在处理多个请求后,才会慢慢达到“合适”的速率。对于请求数据量很小的 HTTP 请求来说,这种情况就是种灾难。

臃肿的消息首部

  • HTTP/1.1 的首部无法压缩,再加上 cookie 的存在,经常会出现首部大小比请求数据大小还大的情况。

受限的优先级设置

  • HTTP/1.1 无法为重要的资源指定优先级,每个 HTTP 请求都是一视同仁。

解析 HTTP/1.1 的请求或响应还会遇到以下问题

  • 一次只能处理一个请求或响应,完成之前不能停止解析。
  • 无法预判解析需要多少内存

HTTP/2 连接建立过程
基于 SSL/TLS 的 HTTP/2 连接建立过程和 HTTPS 差不多。在 SSL/TLS 握手协商过程中,客户端在 ClientHello 消息中设置 ALPN(应用层协议协商)扩展来表明期望使用 HTTP/2 协议,服务器用同样的方式回复。通过这种方式,HTTP/2 在 SSL/TLS 握手协商过程中就建立起来了。

HTTP/2 是基于帧的协议。采用分帧是为了将重要信息封装起来,让协议的解析方可以轻松阅读、解析并还原信息。HTTP/2 有了帧,处理协议的程序就能预先知道会收到什么,并且 HTTP/2 有表示帧长度的字段
帧结构

  • Length:3字节,表示帧负载的长度,取值范围为 (2 的 14 次方)至 (2 的 24 次方 - 1)。(2 的 14 次方) 16384 字节是默认的最大帧大小,如果需要更大的帧,必须在 SETTINGS 帧中设置
  • Type:1字节,当前帧类型
  • Flags:1字节,具体帧类型的标识
  • R:1位,保留位,不要设置,否则可能会带来严重的后果
  • Stream Identifier:31位,每个流的唯一 ID
  • Frame Payload:长度可变真实的帧内容,长度是在 Length 字段中设置的

帧类型

  • HTTP/2 规范对流的定义是:HTTP/2 连接上独立的、双向的帧序列交换。如果客户端想要发出请求,它会开启一个新流,然后服务器在这个流上回复。 由于有分帧,所以多个请求和响应可以交错,而不会互相阻塞。流 ID 用来标识帧所属的流。
  • 客户端到服务器的 HTTP/2 连接建立后,通过发送 HEADERS 帧来启动新的流。如果首部需要跨多个帧,可能还会发送 CONTINUATION 帧。该 HEADERS 帧可能来自请求或响应。 后续流启动的时候,会发送一个带有递增流 ID 的新 HEADERS 帧。
  • 消息由一或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流 ID 重新组装
  • 一个消息至少由 HEADERS 帧(它初始化流)组成,并且可以另外包含 CONTINUATION 和 DATA 帧,以及其他的 HEADERS 帧。

Http2优化

多路复用

  • 在 HTTP/1.1 中,如果客户端想发送多个并行的请求,那么必须使用多个 TCP 连接

  • HTTP/2 是分帧的,请求和响应都可以多路复用,有助于解决类似类似队头阻塞的问题,所有的请求和响应都在同一个 TCP 连接上发送

  • 客户端和服务器把 HTTP 消息分解成多个帧,然后乱序发送,最后在另一端再根据流 ID 重新组合起来。

    • 可以并行交错地发送请求,请求之间互不影响;
    • 可以并行交错地发送响应,响应之间互不干扰;
    • 只使用一个连接即可并行发送多个请求和响应;

优先级

  • 通过 HEADERS 帧和 PRIORITY 帧,客户端可以明确地和服务器沟通它需要什么,以及它需要这些资源的顺序。具体来讲,服务器可以根据流的优先级,控制资源分配(CPU、内存、带宽),而在响应数据准备好之后,优先将最高优先级的帧发送给客户端

流量控制

  • 在同一个 TCP 连接上传输多个数据流,就意味着要共享带宽。标定数据流的优先级有助于按序交付,但只有优先级还不足以确定多个数据流或多个连接间的资源分配。

  • 为解决这个问题,HTTP/2 为数据流和连接的流量控制提供了一个简单的机制:

    • 流量控制基于每一跳进行,而非端到端的控制;
    • 流量控制基于 WINDOW_UPDATE 帧进行,即接收方广播自己准备接收某个数据流的多少字节,以及对整个连接要接收多少字节;
    • 流量控制窗口大小通过 WINDOW_UPDATE 帧更新,这个字段指定了流 ID 和窗口大小递增值;
    • 流量控制有方向性,即接收方可能根据自己的情况为每个流乃至整个连接设置任意窗口大小;
    • 流量控制可以由接收方禁用,包括针对个别的流和针对整个连接
    • HTTP/2 连接建立之后,客户端与服务器交换 SETTINGS 帧,目的是设置双向的流量控制窗口大小。除此之外,任何一端都可以选择禁用个别流或整个连接的流量控制。

服务器推送

  • 服务器可以对一个客户端请求发送多个响应。换句话说,除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。

首部压缩

  • 把相同的首部存储起来,仅发送它们之间不同的部分,就可以节省不少的流量,加快请求的时间。
  • HTTP/2 在客户端和服务器端使用“首部表”来跟踪和存储之前发送的键-值对,对于相同的数据,不再通过每次请求和响应发送。
  1. 假设客户端按顺序发送如下请求首部:
    Header1:foo
    Header2:bar
    Header3:bat

  2. 当客户端发送请求时,它会根据首部值创建一张表:

  3. 如果服务器收到了请求,它会照样创建一张表。

  4. 当客户端发送下一个请求的时候,如果首部相同,它可以直接发送这样的首部块:
    62 63 64

  5. 服务器会查找先前建立的表格,并把这些数字还原成索引对应的完整首部。

取消域名拆分

  • 再多的 HTTP 请求都可以在一个 TCP 连接上发送,所以不需要采取多个域名来突破浏览器 TCP 连接数限制这一规则了。

http 各版本问题和优化相关推荐

  1. 2023最新站长必备在线工具箱系统源码 含上百款工具 带后台版本 自适应模板 优化修复版

    简介: 2023最新站长必备在线工具箱系统源码 含上百款工具 带后台版本 自适应模板 优化修复版 刀客搭建看了一下,系统一切正常可用,就是后台登录方式这一块使用的是QQ扫码登录的,建议有能力的可以改一 ...

  2. fastjson 1.1.71.android 版本发布,优化部分场景性能

    百度智能云 云生态狂欢季 热门云产品1折起>>>   fastjson 1.1.71.android 版本已发布.这是一个例行维护版本,修复 2 个 bug,增加一个 1.2.x 兼 ...

  3. 最新站长必备在线工具箱系统源码/含上百款工具/带后台版本/自适应模板/优化修复版

    最新站长必备在线工具箱系统源码,基于Thinkphp内核开发,含上百款工具,带后台版本:自适应模板,优化修复版.站长搭建看了一下,系统一切正常可用,就是后台登录方式这一块使用的是QQ扫码登录的,建议有 ...

  4. Vivaldi连发两个snapshot版本:重点优化截图功能

    Vivaldi浏览器连续推出了两个snapshots版本,Ruarí degaard表示本次更新重点针对截图工具带来各种改善.根据Vivaldi用户的反馈和要求,在1.7.721.3版本中对全新截图工 ...

  5. Discuz!论坛各版本通用SEO优化设置教程

    网址伪静态设置 后台->全局->SEO设置->URL静态化,如下图: 开启各个模块的伪静态之后,可以点击"查看当前的Rewrite规则",根据自己服务器的情况设置 ...

  6. lotus 开源C2优化版本

    lotus 开源C2优化版本 开源C2优化 lotus 开源C2优化 显卡3090 git clone https://github.com/jackoelv/bellperson.git cd be ...

  7. 优化版本 穿越火线(CF) FPS AI 自瞄 代码 权重 数据集(下面有链接)

    更新初衷 本人在制作过程中,有一些爱钻研的朋友来问以及提出增加一些新的功能点回会更好,本着学习研究态度,在第一个版本上进行优化,增加一些内容 不喜欢看过程的小伙伴直接看最下面 界面 解决问题: 1.进 ...

  8. Android9.0 P 电源管理android各版本电量优化功能策略

    针对电量优化android的改动 在最近几个android版本中已存在的电量优化功能基础上,Android 9 引入了一些新功能来持续改进设备电源管理,以确保将系统资源提供给最需要它们的应用. 近几个 ...

  9. VS.Net中程序集的Debug版本和Release版本的区别

    作者:未知   请作者速与本人联系 前几天看到豆腐的文章介绍如何知道程序集是Debug版还是Release版,之前只知道某些软件从功能上有企业版.标准版之分,却从不知道.Net程序集还有Debug和R ...

最新文章

  1. HBase的安装、写入和查询操作
  2. Nginx模块之———— RTMP 模块的在线统计功能 stat 数据流数据的获取(不同节点则获取的方式不同)...
  3. python题目推荐_python题目
  4. 泡泡玛特回应与肯德基联名引发炒作:暂停食品行业的定制盲盒业务
  5. web报表工具FineReport最经常用到部分函数详解
  6. php - 获取数组头尾元素
  7. [USACO 6.4.2] Electric Fences
  8. 很多免费的编程电子书
  9. 今天通过了QCC评审
  10. windows11桌面删除ie图标
  11. 洛谷 P1911 L国的战斗之排兵布阵
  12. 搜狗校招编程题-建房子
  13. 网课答案题库系统 内含接口使用
  14. cubemx—编码器测速(其中遇到的问题分析以及部分解决办法)
  15. python程序实验教程_20192428 实验一《Python程序设计》实验报告
  16. Virtualbox和VMWare的主要区别体现在哪里
  17. bash和vim的使用-1
  18. 雨流计数与载荷寿命之间的关系
  19. 小巧灵敏的驻极体话筒
  20. s7300的db块详细说明_如何使用S7-300的DB块

热门文章

  1. Android 接入google pay
  2. t-star腾讯安全高校挑战赛2022 writeup
  3. 【Activity学习五】--基于SSM整合Activiti之请假流程实现(二)
  4. 计算机网络—— DNS和CDN那些事
  5. 有中国电信手机一定要看。CTWAP和CTNET是什么意思?有什么区别?
  6. 荣耀Magicbook14 BIOS更新无法开机
  7. 关于便携式打印机程序开发(一、原生安卓蓝牙调用)
  8. [数据科学]000.我为什么当数据科学家
  9. This Apple ID has not yet been used in the ITunes Store/此Apple ID尚未在iTunes Store使用过
  10. win10清理_教你一招win10如何彻底清理C盘垃圾