杂谈:HTTP1.1 与 HTTP2.0 知多少?
qiyuwang 2024-10-08 10:34 11 浏览 0 评论
HTTP是应用层协议,是基于TCP底层协议而来。
TCP的机制限定,每建立一个连接需要3次握手,断开连接则需要4次挥手。
HTTP协议采用“请求-应答”模式,HTTP1.0下,HTTP1.1非Keep-Alive模式下,每个请求都要新建一个连接,完成之后立即断开连接。如果有新的请求,则要重新创建请求连接(HTTP协议为无连接的协议)。
这样不免造成了网络传输数据一定的延迟,1999年推出HTTP1.1,虽然可以通过设置延迟时间,让连接延迟关闭。但仍然有线头阻塞,max-connection最大连接限制了并行请求数量等痛点,难以应对日益增长的大数据实时传输。
新一代HTTP2.0协议应运而生,提高HTTP应对高并发场景下的数据传输能力。
杂谈:HTTP1.1 与 HTTP2.0 知多少?
「 HTTP1.1」
Pipelining管道化
提出管道化方案解决连接延迟,服务端可设置Keep-Alive来让连接延迟关闭时间,但因为浏览器自身的Max-Connection最大连接限制,同一个域名 (host) 下的请求连接限制(同域下谷歌浏览器是一次限制最多6个连接),只能通过多开域名来实现,这也就是我们的静态资源选择放到CDN上或其它域名下,来提高资源加载速度。
pipelining方案需要前后端支持,但绝大部分的HTTP代理器对pipelining的支持并不友好。
只支持GET/HEAD
pipelining只支持GET/HEAD方式传送数据,不支持POST等其它方式传输。
头部信息冗余
HTTP是无状态的,客户端/服务端只能通过HEAD的数据维护获取状态信息,这样就造成每次连接请求时都会携带大量冗余的头部信息,头部信息包括COOKIE信息等。
超文本协议
HTTP1.X是超文本协议传输。超文本协议传输,发送请求时会找出数据的开头和结尾帧的位置,并去除多余空格,选择最优方式传输。如果使用了HTTPS,那么还会对数据进行加密处理,一定程度上会造成传输速度上的损耗。
线头阻塞
pipelining通过延迟连接关闭的方案,虽然可同时发起对服务端的多个请求,但服务端的response依旧遵循FIFO(first in first out)规则 依次返回。
举个例子客户端发送了1、2、3、4四个请求,如果1没返回给客户端,那么2,3,4也不会返回。这就是所谓的线头阻塞。高并发高延迟的场景下阻塞明显。
HTTP1.X传输优化方法
- 多个资源合并成一个请求连接,如前端Spriting雪碧图,JS/CSS压缩成一个文件等
- Inlining内联的方式,采用inline css/inline js等并入html中,减少对css/js文件的请求
- CDN资源多域名转发,静态资源分布存储在多个域下。
以上三种三种方法虽然能使HTTP1.X协议传输速度提高,但也有对应的不足。
- 如雪碧图,将多个小图合并成一张大图,降低多张小图请求的高延迟,但是如果我只想要两个icon小图,却需要加载一整张大图,就会造成资源冗余。合并的JS/CSS文件也有类似的问题。
- 内联的方式,会让我们的代码变得难以维护,让html文件变得更大,代码混合严重。
- 多域名下可缓解Max-Connection,但不同域会让Cookie信息无法彼此共享。
了解完HTTP1.1的痛点,接下来就是我们新一代的HTTP协议HTTP2.0
「 HTTP2.0」
前身SPDY
SPDY是2012年谷歌推出的是基于SSL/TLS的传输协议,SPDY有降低延迟,多路复用,头部压缩,服务端推送等特点,这些特点也称为了后续HTTP2.0的功能基石,HTTP2.0是SPDY/3 draft的优化版。
HTTP2.0 与 SPDY的区别:
- HTTP2.0 头部压缩采用HPACK, 而SPDY采用DELEFT。
- HTTP2.0 理论上支持明文HTTP传输,而SPDY强制使用HTTPS。
多路复用
(一个域只要一个TCP连接)实现真正的并发请求,降低延时,提高了带宽的利用率。
头部压缩
客户端/服务端进行渐进更新维护,采用HPACK压缩,节省了报文头占用流量。
- 相同的头部信息不会通过请求发送,延用之前请求携带的头部信息。
- 新增/修改的头部信息会被加入到HEAD中,两端渐进更新。
两端会共同维护一个head list,每次请求时都会进行检查。
该list包括:
- static (既定的头部信息)
- dynamic (自定义的头部信息)
请求优先级
每个流都有自己的优先级别,客户端可指定优先级。并可以做流量控制。因为HTTP2.0的传世允许请求并发,但是应用场景中我们要处理一些主要文件的优先级权重,以及资源模块依赖等。所以我们可通过设置优先级来提高主要文件的权重,使其优先加载请求。
服务端推送
请求不是来自客户端“明确”的请求,是从服务端PUSH_PROMISE帧中提供。例如我们加载index.html, 我们可能还需要index.js, index.css等文件。传统的请求只有当拿到index.html,解析html中对index.js/index.css的引入才会再请求资源加载,但是通过服务端数据,可以提前将资源推送给客户端,这样客户端要用到的时候直接调用即可,不用再发送请求。
- push的资源能缓存在浏览器中
- 不同的网页能使用该缓存,不用重新发起
- push的资源通过multiplexed进行传输
- push的资源能够进行priority标识
- client有权取消push资源的加载
- push的资源必须同域
二进制协议
HTTP2.0 传输协议采用二进制协议,区别与HTTP1.X的超文本协议。更易于帧,数据包的发送接收。HTTP2.0是运行在TCP连接上的应用层协议,接受服务器或发送请求时,会自动将头部信息/request body分成HEAD帧和DATA帧。
客户端/服务端发送/接收数据时,会将数据打散乱序发送,接收数据时接收一端再通过streamID标识来将数据合并。
HTTP2.0环境要求
HTTP2.0理论上支持明文HTTP传输,但因为其前身SPDY是在TLS上,他们的主人Google 和 Firefox 都支持TLS架构,所以需要搭建HTTP2.0 + TLS成了标准。
- Nginx > 1.10
- OpenSSL > 1.0.2
- CA证书
相关推荐
- 铭说 | 一句话木马的多种变形方式
-
今天来和大家聊一聊,一句话木马...
- 某教程学习笔记(一):13、脚本木马原理
-
我和她说,如果有天你要离开我,你就跟我掰手腕,赢了你就让你走,她说我那么瘦小怎么会赢。后来她真的要和我分手,我把右手放在桌子上,眼看我要赢的时候,她把左手放到右手上,我抬头看她咬着牙眼里含着泪,我知道...
- 年中盘点:详细分析2019年上半年爆发的macOS恶意软件
-
概述自从我们在去年12月对2018年的macOS恶意软件进行年终盘点以来,我们发现新型macOS恶意软件的爆发数量有所增加。一些旧恶意软件家族产生了新的变种,一些恶意软件使用了新的技巧,同时还产生了一...
- Webshell免杀研究(webshell免杀马)
-
前言不想当将军的士兵不是好士兵,不想getshell的Hacker不是好Hacker~有时候我们在做攻防对抗时经常会碰到可以上传webshell的地方,但是经常会被安全狗、D盾、护卫神、云锁等安全软件...
- 一个合格的seoer应该掌握的基本技能和知识点!
-
1.301重定向2.404错误页面3.url表转化4.三导航5.树桩结构6.网站目录优化7.网站内连接8.更新带动器9.Gzip压缩技术的意义!10.http状态码是否正常11.URL静态化12.网站...
- Cacti监控服务器配置教程(基于CentOS+Nginx+MySQL+PHP环境搭建)
-
具体案例:局域网内有两台主机,一台Linux、一台Windows,现在需要配置一台Cacti监控服务器对这两台主机进行监控...
- php opcache 的工作原理(php aop 实现原理)
-
opcachePHP扩展实现了各种功能,以透明的方式加速PHP。顾名思义,它的起源和主要目的是操作码缓存,但现在它还包含一个优化器和即时编译器。然而,这篇博文将只关注操作码缓存方面。...
- win7下apache+mysql+php安装配置(mysql在win7下安装)
-
一.首先下载好要用的apache版本:http://httpd.apache.org/download.cgimysql版本:http://dev.mysql.com/downloads/mys...
- Ubuntu linux 上的 Nginx 和 Php 安装
-
教程-在UbuntuLinux上安装Nginx1.安装Nginx服务器和所需的包。apt-getupdatebrapt-getinstallnginx...
- 只需要四步,就能完成PHP搭建(如何搭建php运行环境)
-
搭建php的方法主要分为独立安装和集成安装两种,独立安装需要分别下载apache,mysql和php,而集成只需要下载一个软件安装包,比较简单,很适合新手。集成安装包有WampServer、appse...
- 判断元素是否在数组内的几种方法对比
-
数组是很常用的一个数据结构,而且经常需要判断某个元素是否在数组中,这在...
- 如何从 PHP 过渡到 Golang?(php转go还是java)
-
我是PHP开发者,转Go两个月了吧,记录一下使用Golang怎么一步步开发新项目。本着有坑填坑,有错改错的宗旨,从零开始,开始学习。因为我司没有专门的Golang大牛,所以我也只能一步步自己去...
- Thinkphp3.2.3及以下版本漏洞整理
-
欢迎搜索公众号:白帽子左一每天分享更多黑客技能,工具及体系化视频教程...
- 【php学习笔记】php中str_split()方法使用笔记
-
PHP是一种广泛应用的编程语言,它有许多内置函数和方法,用来方便我们对数据进行处理和操作。其中,字符串处理是PHP中常见的任务之一。str_split()是PHP中的一个字符串方法,它用来将字符串分割...
- Redis中BitMap是如何储存的,以及PHP如何处理
-
setbit,getbit这些命令在redis是如何储存和获取的呢?直接通过get获取到的值我们如何判断对应的位是0或者1?...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- navicat无法连接mysql服务器 (65)
- 下横线怎么打 (71)
- flash插件怎么安装 (60)
- lol体验服怎么进 (66)
- ae插件怎么安装 (62)
- yum卸载 (75)
- .key文件 (63)
- cad一打开就致命错误是怎么回事 (61)
- rpm文件怎么安装 (66)
- linux取消挂载 (81)
- ie代理配置错误 (61)
- ajax error (67)
- centos7 重启网络 (67)
- centos6下载 (58)
- mysql 外网访问权限 (69)
- centos查看内核版本 (61)
- ps错误16 (66)
- nodejs读取json文件 (64)
- centos7 1810 (59)
- 加载com加载项时运行错误 (67)
- php打乱数组顺序 (68)
- cad安装失败怎么解决 (58)
- 因文件头错误而不能打开怎么解决 (68)
- js判断字符串为空 (62)
- centos查看端口 (64)