调研HTTP各协议的发展及其原因
摘要:
HTTP协议是浏览器与服务器共同遵守的协议。本文详细介绍了HTTP各协议的发展及其原因。
关键词: HTTP协议 发展 原因
1引言
HTTP协议是如今互联网与服务端技术的基石。HTTP是通用的、无状态的、面向对象的协议,可以支持多媒体信息的传递。HTTP的会话期分为四个步骤:客户端程序与服务器建立连接后,发送请求,服务器进行应答,然后关闭连接。HTTP协议的演进也从侧面反应了互联网技术的快速发展。HTTP协议目前已经历了4个版本的演化,其中1.0、1.1版本在互联网上被广泛使用,2.0版本目前应用很少,是下一代的HTTP协议,3.0版本应用同样也比较少。
2 HTTP协议的发展
- HTTP 0.9
HTTP 0.9是第一个版本的HTTP协议,已过时。它的组成极其简单,只允许客户端发送GET这一种请求,且不支持请求头。由于没有协议头,造成了HTTP 0.9协议只支持一种内容,即纯文本。不过网页仍然支持用HTML语言格式化,同时无法插入图片。
HTTP 0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。一次HTTP 0.9的传输首先要建立一个由客户端到Web服务器的TCP连接,由客户端发起一个请求,然后由Web服务器返回页面内容,然后连接会关闭。如果请求的页面不存在,也不会返回任何错误码。
- HTTP 1.0
HTTP协议的第二个版本,第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用。相对于HTTP 0.9 增加了如下主要特性:
- 请求与响应支持头域
- 响应对象以一个响应状态行开始
- 响应对象不只限于超文本
- 开始支持客户端通过POST方法向Web服务器提交数据,支持GET、HEAD、POST方法
- 支持短连接。每一个请求建立一个TCP连接,请求完毕之后立马断开连接。这里就会带来两个问题:
- 连接无法复用。 连接无法复用会导致每次请求都要经历三次握手和慢启动。三次握手在高延迟的场景下影响较明显,慢启动则对文件类请求影响较大。
- head of line blocking 。 head of line blocking会导致带宽无法被充分利用,以及后续健康请求被阻塞。
- HTTP 1.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推送到客户端,客户端接收到之后,可以缓存起来以备以后使用。
- 优先权和依赖:每一个流都有自己的优先级别,会标明哪个流是最重要的,客户端会指定哪个流是最重要的,有一些依赖参数,这样一个流就可以依赖另外一个流。优先级别可以在运行时动态改变,当用户滚动页面时,可以告诉浏览器哪个图像是最重要的,你也可以在一组流中进行优先筛选,能够抓住重点流。
HTTP/2通过头部压缩、二进制编码、多路复用、服务器推送等新特性大幅度提升了 HTTP/1.1 的性能,但是传输层是 TCP 协议,于是存在以下缺陷:
- 队头阻塞:HTTP/2 多个请求跑在一个 TCP 连接中,如果序列号较低的 TCP 段在网络传输中丢失了,即使序列号较高的 TCP 段已经被接收了,应用层也无法从内核中读取到这部分数据,从 HTTP 视角看,就是多个请求被阻塞了;;
- TCP 与 TLS 的握手时延迟:TCL 三次握手和 TLS 四次握手,共有 3-RTT 的时延;
- 网络迁移需要重新连接:移动设备从 4G 网络环境切换到 WIFI 时,由于 TCP 是基于四元组来确认一条 TCP 连接的,那么网络环境变化后,就会导致 IP 地址或端口变化,于是 TCP 只能断开连接,然后再重新建立连接,切换网络环境的成本高;
- HTTP 3.0
HTTP/3 就将传输层从TCP替换成了UDP,并在UDP协议上开发了QUIC协议,来保证数据的可靠传输。
QUIC功能:
- 实现了类似TCP的流量控制、传输可靠性的功能
- 集成了TLS(Transport Layer Security 传输层安全性协议)加密功能
- 实现了HTTP/2.0中多路复用
不同点是QUIC实现了在同一物理连接上可以有多个独立的逻辑数据流,实现了数据流的单独传输,解决了TCP中队头阻塞问题
- 实现了快速握手功能
QUIC是基于UDP的,所以QUIC可以实现使用0-RTT和1-RTT来建立连接
传输层协议:UDP
存在的挑战:
- 服务器与浏览器端都没有对HTTP/3.0提供较完整的支持
- 部署HTTP/3.0也存在非常大的问题,因为系统对UDP优化还不是很好
- 中间设备僵硬问题,这些设备对UDP的优化程度远低于TCP
3.HTTP协议发展的原因
HTTP协议的演进也从侧面反应了互联网技术的快速发展。因为前面的版本存在瓶颈问题,所以才会出现新的版本来弥补这些瓶颈问题。
作为第一个版本的HTTP协议,HTTP 0.9的最先提出主要是用于学术交流,并且该版本协议也需求简单,主要用来在网络之间传输体积很小的HTML文件。但随着互联网技术的发展,HTTP 0.9遇到了瓶颈及问题:HTTP 0.9只支持HTML文件,其余类型的文件如何传输;文件格式不再仅仅局限于ASCII编码。
随着互联网的发展以及浏览器的出现,单纯的文本内容已经无法满足用户需求了,浏览器希望通过 HTTP 来传输脚本、样式、图片、音频和视频等不同类型的文件,也希望客户端和服务器能更加深入的交流,因而,HTTP 1.0被提出,其引入了请求头和响应头,对文件提供了更良好的支持。但之后其也遇到了瓶颈:HTTP 1.0中每一次进行HTTP通信,都需要建立TCP链接,传输HTTP数据和断开TCPL连接三个阶段,会增加大量无谓的开销;HTTP 1.0中只有前面的请求返回之后才能进行下一次请求,如果某个请求没有及时返回,会引起对头阻塞;HTTP 1.0中,每个域名绑定一个唯一的IP地址,因此一个服务器只能支持一个域名;HTTP 1.0中需要在响应头中设置完整的数据大小,浏览器根据设置的数据大小来接收数据,这种方式对于接收动态生成的内容无能为力;HTTP 1.0中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断电续传功能。
随着互联网的迅速发展,HTTP/1.0 也已经无法满足需求,最核心的就是连接问题。HTTP 1.1提出在一定程度上解决了HTTP 1.0存在的瓶颈问题,但其依旧存在着瓶颈:协议受限于TCP本身机制:TCP的慢启动、同时开启多条TCP连接会竞争固定的带宽;另外,HTTP 1.1依旧会存在着队头阻塞问题。
HTTP 2.0的目的是通过支持请求和响应的多路复用来减少延时,通过压缩HTTP首部字段将协议开销降低,同时增加请求优先级和服务端推送的支持。其存在瓶颈:TCP队头阻塞问题;TCP建立连接的延时。
HTTP 3.0是基于UDP实现,基于UDP实现了类似TCP的多路数据流,传输可靠性等功能,担起依旧存在着一些挑战。
协议版本 | 解决的瓶颈及问题 | 解决方式 |
0.9 | HTML 文件传输 | 确立了客户端请求、服务端响应的通信流程 |
1.0 | 不同类型文件传输 | 设立头部字段 |
1.1 | 创建/断开 TCP 连接开销大 | 建立长连接进行复用 |
2 | 并发数有限 | 二进制分帧 |
3 | TCP 丢包阻塞 | 采用 UDP 协议 |
纵观HTTP发展历史,其发展的根本原因是连接无法复用和head of line blocking。HTTP优化的2个主要因素是带宽和延迟,其中随着网络的发展,带宽基本可以满足,那核心问题就转变为如何降低延迟. 而影响延迟的2个关键在于连接无法复用和head of line blocking。