特性 HTTP1.0 HTTP1.1 HTTP2.0
持续连接
断点续传
Host 头
请求方法 GETHEADPOST 以上+ OPTIONSPUTDELETETRACECONNECT 以上全部
缓存控制 ExpireLast-ModefiedPragma 以上+ ETagCache-Control 以上全部
二进制分帧
header压缩
多路复用
服务器推送
队头阻塞

持续连接

HTTP1.0每发送一次请求,都得建立一次TCP连接。

HTTP1.1使用了持续连接,能够让服务器在发送响应后仍然在一段时间内保持这条连接,使同一个客户和该服务器可以继续在这条连接上传送后续的HTTP请求报文和响应报文。

HTTP1.1的持续连接有两种工作方式,即非流水线方式和流水线方式。
非流水线方式的特点,是客户在收到前一个响应后才能发出下一个请求。因此,在TCP连接已建立后,客户每访问一次对象都要用去一个往返时间RTT。这比非持续连接要用去两倍RTT的开销,节省了建立TCP连接所需的一个RTT时间。但非流水线方式还是有缺点的,因为服务器在发送完一个对象后,其TCP连接就处于空闲状态,浪费了服务器资源。
流水线方式的特点,是客户在收到HTTP的响应报文之前就能够接着发送新的请求报文。于是一个接一个的请求报文到达服务器后,服务器就可连续发回响应报文。因此,使用流水线方式时,客户访问所有的对象只需花费一个RTT时间。流水线工作方式使TCP连接中的空闲时间减少,提高了下载文档效率。

HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。但是,响应到达的顺序必须和请求发送的顺序一致,本质上还是没有解决队头阻塞。

HTTP1.1使用字段Connection来开启或关闭持续连接,当该字段的值为keep-alive则为开启,值为close则为关闭。

Connection: keep-alive
Keep-Alive: time-out=60        //表示这个TCP连接可以保持60秒,可能有max=X,表示这个最多接收X次请求就断开

断点续传

断点续传需要用到几个字段:RangeIf-RangeContent-RangeAccept-Ranges以及Content-Length

Range用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:

Range: bytes=50-        //从第50个字节开始到最后一个字节
Range: bytes=-70       //最后的70个字节
Range: bytes=50-100    //从第50字节到100字节

If-Range:用于请求头中,用于判断实体是否发生改变,必须与Range配合使用。若实体未被修改,则响应所缺少的那部分;否则,响应整个新的实体。

If-Range: "55dc2dba-14dd5b"                    //Etag
If-Range: Tue, 25 Aug 2015 08:56:26 GMT     //Last-Modified

Content-Range用于响应头,指定整个实体中的一部分的插入位置,也指示了整个实体的长度。一般格式:

Content-Range: bytes M-N/size        //大小为size的文件的第M-N字节范围的内容

Accept-Ranges:用于响应头中,告诉客户端支持断点传输

Accept-Ranges: bytes         //告诉客户端支持断点传输
Accept-Ranges: none         //告诉客户端不支持断点传输

Content-Length:用于响应头中,表示内容长度。

Content-Length: 1900         //文件总大小

断点续传,如果返回文件的一部分,则使用206状态码;如果返回整个文件,则使用200响应码。

实例

请求:

GET /123.zip HTTP/1.1

响应:

HTTP/1.1 200 OK
Accept-Ranges: bytes        //告诉客户端支持断点传输
Content-Length: 1900        //文件总大小
Last-Modified: Tue, 25 Aug 2015 08:56:26 GMT
ETag: "55dc2dba-14dd5b"

中间停止下载,重新发起请求。

请求:

GET /123.zip HTTP/1.1
Range:bytes=580-
If-Range: "55dc2dba-14dd5b"                   //Etag

响应:

HTTP/1.1 206 Partial Content
Accept-Ranges: bytes
Content-Type: image/jpeg                //文件类型
Content-Length: (1900-580)              //长度则不是总长度了,而580到1900共有多少字节。
Content-Range: bytes 580-(1900-1)/1900

Host 头

HostHTTP 1.1 协议中新增的一个请求头,主要用来实现虚拟主机技术。

虚拟主机(virtual hosting)即共享主机(shared web hosting),可以利用虚拟技术把一台完整的服务器分成若干个主机,因此可以在单一主机上运行多个网站或服务。

举个栗子,有一台 ip 地址为 61.135.169.125 的服务器,在这台服务器上部署着谷歌、百度、淘宝的网站。为什么我们访问 https://www.google.com 时,看到的是 Google 的首页而不是百度或者淘宝的首页?原因就是 Host 请求头决定着访问哪个虚拟主机。

缓存控制

HTTP1.0 使用ExpireLast-ModefiedPragma字段来控制缓存策略,HTTP1.1增加了ETagCache-Control字段。
Pragma字段常用Pragme:no-cache来关闭缓存,Cache-Control: no-cache也可以用来关闭缓存。

header压缩

我们知道,HTTP报文是由开始行、首部行、实体主体三部分组成的。 一般而言,实体主体都会经过gzip压缩,或者本身传输的就是压缩过后的二进制文件(如图片、音频等),但是开始行和首部行多是没有经过任何压缩,而是直接以纯文本的方式进行传输的,随着web功能越来越复杂,请求数量越来越多,随之而来的就是头部的流量越来越多。

因此,HTTP2.0提出了对请求和响应的头部进行压缩,即不再只是压缩主题部分,这种压缩方式就是HAPCK

简单的说,HPACK 使用2个索引表(静态索引表和动态索引表)来把头部映射到索引值,并对不存在的头部使用 huffman 编码,并动态缓存到索引,从而达到压缩头部的效果。

二进制分帧

在应用层(HTTP2.0)和传输层(TCP)之间增加一个二进制分帧层。在二进制分帧层中, HTTP2.0 会将所有传输的信息分割为更小的消息和帧,并对它们采用二进制格式的编码 ,其中 HTTP1.x 的首部信息会被封装到 HEADER 帧,而相应的 Request Body 则封装到 DATA 帧里面。

帧:HTTP2.0通信的最小单位,所有帧都共享一个8字节的首部,其中包含帧的长度、类型、标志、还有一个保留位,并且至少有标识出当前帧所属的流的标识符,帧承载着特定类型的数据,如HTTP首部、负荷、等等。
消息:比帧大的通讯单位,是指逻辑上的HTTP消息,比如请求、响应等。由一个或多个帧组成
流:比消息大的通讯单位。是TCP连接中的一个虚拟通道,可以承载双向的消息。每个流都有一个唯一的整数标识符

多路复用

HTTP2.0通信都在一个 TCP 连接上完成,这个连接可以承载任意数量的双向数据流,相应的每个数据流以消息的形式发送。而消息由一或多个帧组成,这些帧可以乱序发送,然后根据每个帧首部的流标识符重新组装。

服务器推送

HTTP 2.0 新增的一个强大的新功能,就是服务器可以对一个客户端请求发送多个响应。换句话说,除了对最初请求的响应外,服务器还可以额外向客户端推送资源,而无需客户端明确地请求。

HTTP1.0、HTTP1.1和HTTP2.0相关推荐

  1. HTTP1.0,HTTP1.1,HTTPS和HTTP2.0的区别

    HTTP1.0和HTTP1.1的一些区别 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控 ...

  2. HTTP1.0、HTTP1.1 、SPDY、HTTP2.0之演变过程和优化

    一.协议的演变过程和时间 HTTP1.0(1996年) -> HTTP1.1(1999年) -> SPDY(2012年google提出了SPDY的方案) -> HTTP2.0(201 ...

  3. HTTP长相随--期盼已久的HTTP2.0、WebDAV协议、 QUICHTTP3.0

    期盼已久的HTTP2.0 HTTP2.0性能增强的核心:二进制分帧 HTTP2.0首部压缩: HTTP2.0多路复用 : 单链接多资源的优势: 可以减少服务链接压力,内存占用少了,链接吞吐量大了 由于 ...

  4. Http2.0那点事

    此文转自:http://www.open-open.com/lib/view/open1455796649605.html 在我们所处的互联网世界中,HTTP协议算得上是使用最广泛的网络协议.最近ht ...

  5. 实现HTTP2.0方式

    一.采用nginx反向代理实现http2.0 1.nginx安装配置http2.0 软件要求: nginx 版本1.9.5以上 nginx http://nginx.org/en/download.h ...

  6. HTTP的前世今生(HTTP1.1,HTTPS,SPDY,HTTP2.0,QUIC,HTTP3.0)

    本文将从HTTP不断发展的时间线来讲解与其相关的知识点,其中包括HTTP1.1,HTTPS,SPDY,HTTP2.0,QUIC,HTTP3.0等,文章中内容涉及面较广,属于扫盲级别,不会特别深入某个知 ...

  7. HTTP1.0、HTTP1.1和HTTP2.0的区别

    HTTP1.0.HTTP1.1和HTTP2.0的区别 文章目录 HTTP1.0.HTTP1.1和HTTP2.0的区别 一.HTTP的历史 二.HTTP的基本优化 三.HTTP1.0和HTTP1.1的区 ...

  8. http1.0 http1.1 http2 之间的区别

    一.HTTP基础 1.1 HTTP定义 HTTP协议(HyperTextTransferProtocol,超文本传输协议)是用于从WWW服务器传输超文本到本地浏览器的传输协议. 1.2 HTTP发展史 ...

  9. HTTP1.0 HTTP1.1 HTTP2.0总结

    https://mp.weixin.qq.com/s/GICbiyJpINrHZ41u_4zT-A https://blog.csdn.net/striveb/article/details/8423 ...

  10. HTTP1.0 、 HTTP1.1、HTTP2.0的主要区别

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

最新文章

  1. Linux tcpdump命令
  2. matlab深度学习_matlab使用贝叶斯优化的深度学习
  3. Ubuntu:查询计算机软硬件信息
  4. python paas_Python paasword包_程序模块 - PyPI - Python中文网
  5. Nonlinear Projection Based Gradient Estimation for Query Efficient Blackbox Attacks论文解读
  6. JavaScript 事件流
  7. 【JavaEE】CH10 JDBC
  8. 佳能mp288清零软件,非常好用@
  9. Altium Designer20 PCB封装库制作
  10. 物联网控制的智能LED灯带(1):WS2812灯带控制(WS2812/2811,ESP32,NODE-RED)
  11. 我的关于 **Mermaid** 语法
  12. VIM技巧及使用vim开发android应用
  13. cs1.6一直连接服务器,CS1.6连接不上服务器解决办法
  14. 百度地图使用之基本功能
  15. 博客赚钱也疯狂--个人博客如何赚钱
  16. Multi-Task Video Captioning with Video and Entailment Generation阅读笔记
  17. mysql45讲--09-44实践篇总结
  18. BXA&ONEROOT,创新纪元
  19. C++ 实现判断插入USB的设备是U盘,移动硬盘,光驱
  20. 2012-11-1小光棍节【就在今天,我们进行了这学期的第一次考试】下面写下今天的考试心得~!

热门文章

  1. Vue method与computed的区别
  2. Linux远程桌面工具Xming+Putty的搭建
  3. servlet容器开发要点
  4. easyuI企业管理系统-实战四 上传图片
  5. ListView 条目加载上滑下滑首尾缩放动画实现
  6. Tomcat的结构概述
  7. NoSQL 数据库 简介
  8. eclipse 输入卡顿_解决eclipse卡顿
  9. python文件操作的方法_python文件操作的方法介绍
  10. 【工程项目经验】之C语言或汇编语言宏展开