`
uule
  • 浏览: 6354232 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

【HTTP1.0 HTTP 1.1 HTTP 2.0主要区别】长头域+多复数压推

 
阅读更多

HTTP/2.0 相比1.0有哪些重大改进?

HTTP概述

 

HTTP1.0~HTTP1.1

长头域

HTTP1.1~HTTP2

多复数压推

 

HTTP1.0 HTTP 1.1主要区别

 

长连接

HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接

HTTP是基于TCP/IP协议的,创建一个TCP连接是需要经过三次握手的,有一定的开销,如果每次通讯都要重新建立连接的话,对性能有影响。因此最好能维持一个长连接,可以用个长连接来发多个请求。

 

节约带宽

HTTP 1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401。客户端如果接受到100,才开始把请求body发送到服务器。

这样当服务器返回401的时候,客户端就可以不用发送请求body了,节约了带宽。

另外HTTP还支持传送内容的一部分。这样当客户端已经有一部分的资源后,只需要跟服务器请求另外的部分资源即可。这是支持文件断点续传的基础。

 

HOST域

现在可以web server例如tomat,设置虚拟站点是非常常见的,也即是说,web server上的多个虚拟站点可以共享同一个ip和端口。

HTTP1.0是没有host域的,HTTP1.1才支持这个参数

 

http1.1协议要求必须加上host,主要是为同一服务器提供两个以上的站点服务。比如www1.fucku.com和www2.fucku.com两个域名IP相同,由同一台服务器支持,服务器可以根据host域,分别提供不同的服务,在客户端看来是两个完全不同的站点。

 

 

HTTP1.1 HTTP 2.0主要区别

 

多路复用+单一长连接

HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级。

当然HTTP1.1也可以多建立几个TCP连接,来支持处理更多并发的请求,但是创建TCP连接本身也是有开销的。

 

在HTTP/2中,客户端向某个域名的服务器请求页面的过程中,只会创建一条TCP连接,即使这页面可能包含上百个资源。  单一的连接应该是HTTP2的主要优势,单一的连接能减少TCP握手带来的时延 。HTTP2中用一条单一的长连接,避免了创建多个TCP连接带来的网络开销,提高了吞吐量

 

HTTP2虽然只有一条TCP连接,但是在逻辑上分成了很多stream。 

HTTP2把要传输的信息分割成一个个二进制帧,首部信息会被封装到HEADER Frame,相应的request body就放到DATA Frame,一个帧你可以看成路上的一辆车,只要给这些车编号,让1号车都走1号门出,2号车都走2号门出,就把不同的http请求或者响应区分开来了。但是,这里要求同一个请求或者响应的帧必须是有有序的,要保证FIFO的,但是不同的请求或者响应帧可以互相穿插。这就是HTTP2的多路复用,是不是充分利用了网络带宽,是不是提高了并发度?

 

数据压缩

HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快。

 

http1.x一直都是plain text,对此我只能想到一个优点,便于阅读和debug。但是,现在很多都走https,SSL也把plain text变成了二进制,那这个优点也没了。于是HTTP2搞了个HPACK压缩来压缩头部,减少报文大小(调试这样的协议将需要curl这样的工具,要进一步地分析网络数据流需要类似Wireshark的http2解析器)。

 

服务器推送(Server Push)

当一个客户端请求资源X,而服务器知道它很可能也需要资源Z的情况下,服务器可以在客户端发送请求前,主动将资源Z推送给客户端。

这个功能帮助客户端将Z放进缓存以备将来之需。

 

 

http2.0的格式定义更接近tcp层的方式,这张二机制的方式十分高效且精简。length定义了整个frame的开始到结束,type定义frame的类型(一共10种),flags用bit位定义一些重要的参数,stream id用作流控制,剩下的payload就是request的正文了。

 

  

虽然看上去协议的格式和http1.x完全不同了,实际上http2.0并没有改变http1.x的语义,只是把原来http1.x的header和body部分用frame重新封装了一层而已。调试的时候浏览器甚至会把http2.0的frame自动还原成http1.x的格式。具体的协议关系可以用下图表示:



 

 

 

 

  • 大小: 41.9 KB
  • 大小: 56.8 KB
分享到:
评论

相关推荐

    TMX320DM816x-DaVinci Digital Media Processors

    - 支持Direct3D Mobile、OpenGL ES 1.1和2.0、OpenVG 1.1、OpenMAX API等图形接口。 - 包括通用可扩展着色引擎和高级几何DMA驱动操作。 6. **内存控制器:** - 内置512KB的片上内存控制器(OCMC)RAM。 - 64KB ...

    dm8168 datasheet

    - 支持Direct3D® Mobile、OpenGL® ES 1.1和2.0、OpenVG™ 1.0、OpenMax™ API。 - 支持高级几何DMA驱动操作。 - 可进行可编程的高质量图像抗锯齿处理。 #### 三、内存与存储 - **512KB片上内存控制器** (OCMC...

    FFT变换及其c实现

    std::complex<double> z = 1.0 + 2.0i; ``` #### 2.2 FFT算法的核心实现 在实现FFT算法时,可以采用递归或非递归的方法。下面是一个简单的非递归实现的示例: ```cpp #include #include #include #include ...

    Perl 语言编程

    - **复数变量**:用于存储多个值,如 `@array` 和 `%hash`。 - **复杂数据结构**:通过数组和哈希组合而成,例如数组中的哈希或哈希中的数组。 - **简单数据结构**:基本的数组和哈希。 - **动词**:在 Perl 中,...

    C和C++ TC函数)

    这里主要涉及的是`ctype.h`库中的字符处理函数以及`math.h`、`stdlib.h`、`string.h`等库中的一些数学计算和数据转换函数。 ### 1. ctype.h 库中的字符处理函数 `ctype.h`库提供了多种用于字符分类和转换的函数,...

    Perl语言编程

    - **1.2.3 复数变量**:数组和哈希表可以存储多个值。 - 数组:`@array = (1, 2, 3);` - 哈希表:`%hash = ("one" => 1, "two" => 2, "three" => 3);` - **1.2.4 复杂数据结构**:通过组合数组和哈希表可以构建...

    Perl 语言编程 全面讲解Perl各个部分

    **1.1 从头开始** Perl 是一种高级编程语言,以其灵活性和高效性著称。它最初由 Larry Wall 开发,旨在简化文本处理任务。Perl 的设计哲学强调程序员的幸福,这体现在其简洁的语法和强大的内置功能上。 **1.2 自然...

    programming perl

    **1.1 从头开始** Perl是一种高级脚本语言,广泛应用于系统管理、Web开发、网络编程、图形用户界面开发等领域。Perl的设计理念是“让程序员的生活更轻松”,这使得它在处理文本和数据时异常强大。 **1.2 自然语言...

    PERL语言编程

    **1.1 从头开始** Perl是一种高级脚本语言,被广泛应用于系统管理、Web开发、文本处理等多个领域。Perl的设计灵感来源于C语言,同时吸收了Shell Script、awk、sed等语言的特点,形成了自己独特的风格。 **1.2 自然...

    perl programing 编程基础版本

    **1.1 从头开始** Perl是一种高级脚本语言,广泛应用于系统管理、Web开发、网络编程等领域。它以其强大的文本处理能力而闻名,同时也支持面向对象编程。Perl的设计目标是使编程变得更加简单和高效。 **1.2 自然...

    Perl高级教程人称“大骆驼”(免费)

    1.1 从头开始..........................................................................................................................10 1.2 自然语言与人工语言............................................

Global site tag (gtag.js) - Google Analytics