HTTP协议简介
HTTP(超文本传输协议,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议,最初的目的是为了提供一种发布和接收STML页面的方法,即用于从WWW服务器传输超文本到本地浏览器的传输协议。所有的WWW都必须遵守这个标准。而且HTTP连接使用的是“请求-----响应”的方式,不仅在请求时需要先建立连接,而且需要客户端向服务器发出请求后,服务端才能回复数据。
另外, 超文本传输协议(HTTP,HyperText Transfer Protocol) 也是一种无状态的协议,它位于OSI七层模型的传输层。HTTP客户端会根据需要构建合适的HTTP请求方法,而HTTP服务器会根据不同的HTTP请求方法做出不同的回应。
【关于HTTP请求方法的介绍:((https://blog.csdn.net/weixin_43939593/article/details/103479464)】
HTTP 0.9是第一个版本的HTTP协议。 它的组成及其简单,只允许客户端发送GET这一种请求,且不支持请求头, 因为没有协议头,造成了HTTP 0.9协议只支持一种内容,即纯文本。不过网页仍支持用HTML语言格式化, 同时无法插入图片。
HTTP0.9 具有典型的无状态性,每个事物独立进行处理,事物结束之后就释放这个连接。由此可见, HTTP协议的网状态特点在其第一个版本0.9中已经成型。一次HTTP0.9的传输要建立一个由客户端到Web服务器的TCP连接,由客户端发起第一个请求,然后由Web服务器返回页面内容, 然后连接会关闭。 如果请求的页面存在,也不会返回任何错误码。
HTTP协议的第二个版本, 第一个在通讯中指定版本号HTTP协议版本,至今仍被广泛采用相对于HTTP0.9增加了如下的主要特性:
- 请求与相应支持头域
- 响应对象以一个响应状态行开始
- 响应对象不只限于超文本
- 开始支持客户端通过POST方法向Web服务器提交数据, 支持GET、HEAD、POST方法
- 支持短连接。 每一个请求建立一个TCP连接,请求完毕之后立马断开连接。这里就会带来两个问题。
- 连接无法复用。 连接无法复用会导致每次请求都要经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类请求影响较大
- head of line blocking 。 head of line blocking 会导致带宽无法被充分利用,以及后续健康请求被阻塞
也即是说HHTP1.0规定浏览器与服务器只保持短暂的连接,浏览器每次的请求都与服务器建立一个TCP连接,服务器完成请求处理后就立即断开TCP连接。多次请求就消耗较多时间
HTTP协议的第三个版本是HTTP1.1, 是目前使用最广泛的协议版本。 HTTP1.1是目前主流的HTTP协议版本, 所以我们就详细的来了解一下HTTP1.1的特性。
HTTP 1.1 引入了许多的关键性能优化:keepalive连接, chunked编码传输, 字节范围请求, 请求流水线等
-
Persistent Connection (keepalive连接): 允许HTTP设备在事物处理结束之后将TCP连接保持在打开的状态 以便未来的HTTP请求重现现在的连接, 知道客户端或服务器决定将其关闭为止。 在HTTP1.0中使用长连接需要添加请求头 Connection: Keep-Alive, 而在HTTP
1.1所有的连接默认都是长连接,除非特殊声明不支持(HTTP请求报文首部加上Connection:close)。 服务器按照FIFO原则来处理不同的Request。 -
chunked编码传输
该编码将实体分块传送并逐块注明长度,直到长度为0块表示传输结束,这在实体长度未知时特别有用(比如由数据库动态产生的数据) -
字节范围请求: HTTP1.1支持传送内容的一部分。比方说,当客户端已经有内容的一部分,为了字节省带宽, 可以只向服务器请求一部分。该功能通过消息中引入range头域来实现,它允许只请求资源的某个部分。在响应消息中Content-Range头域声明了返回的这部分对象的偏移值和长度。如果服务器相应地返回了对象所请求范围的内容,则响应码206(Partial Content)
-
Pipelining (请求流水线)
另外, HTTP 1.1还新增了如下的特性:
- 请求消息和相应消息都支持的Host头域
在HTTP1.0中认为每台服务器都绑定着一个唯一的IP地址,因此,请求消息中的URL可以没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-hoed Web Servers), 并且它们共享一个ip地址。因此Host头的引入就很有必要了 - 新增了一批请求方法 :OPTIONS, PUT, DELETE , TRACE , CONNECT方法
- 缓存处理 : HTTP/1.1在1.0的基础上加入了一些cache的新特性, 引入了实体标签, 一般称为 e-tags , 新增更为强大的Cache-Control头
- HTTP 2.0
HTTP 2.0是下一代HTTP协议, 目前应用还非常少。 主要特点有:
-
多路复用(二进制分帧)。HTTP 2.0最大的特点是:不会改动HTTP的语义,HTTP方法、状态码、URI及首部字段,等等这些核心概念上一如往常,却致力于突破上一代标准的性能限制,改进传输性能,实现低延迟和高吞吐量。而之所以叫2.0,是在于新增的二进制分帧层。在二进制分帧层上,HTTP2.0会将所有的信息分割成为更小的信息和帧,并对它们采用二进制格式的编码,其中HTTP1.0 ,HTTP1.1的首部信息都会被封装到Headers帧,而我们的request body则封装到Data帧里面。
-
HTTP 2.0通信都是在一个连接上完成的, 这个连接可以承载任意数量的双向数据流。相应地,每个数据流以消息的形式发送,而消息由一个或多个帧组成,这些帧可以乱序发送,然后再根据每个帧首部的流标识符重新组装。
-
头部压缩:当一个客户端向相同服务器请求许多资源时,像来自同一个网页的图像,将会有大量的请求看上去几乎是同样的,这就需要压缩技术对付这种几乎相同的信息。
-
随时复位:HTTP1.1的一个缺点是当HTTP信息有一定大小的数据传输时,你不能方便地随时停止它,中断TCP连接的代价是非常昂贵的。使用HTTP2.0的RST_STREAM将能方便地停止一个信息传输,启用新的信息,在不中断连接的情况下提高带宽利用效率。
-
服务端推送流:Server Push. 客户端请求一个资源X,服务器端判断客户端还需要资源Z,在无需事先询问客户端的情况下将资源Z推送到客户端,客户端接收到之后,可以缓存起来以备以后使用。
-
优先权和依赖:每一个流都有自己的优先级别,会标明哪个流是最重要的,客户端会指定哪个流是最重要的,有一些依赖参数,这样一个流就可以依赖另外一个流。优先级别可以在运行时动态改变,当用户滚动页面时,可以告诉浏览器哪个图像是最重要的,你也可以在一组流中进行优先筛选,能够抓住重点流。