HTTP协议

HTTP协议,即超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在 TCP 之上。它指定了客户端发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以 ASCII 形式给出,消息内容则使用类似 MIME 的格式。



1. 简介

万维网 WWW(World Wide Web)发源于欧洲日内瓦量子物理实验室 CERN。WWW 技术的出现,使得因特网得以超乎想象的速度迅猛发展。

这项基于 TCP/IP 的技术,在短短的十年时间内迅速成为已经发展了几十年的 Internet 上的规模最大的信息系统,它的成功归结于它的简单实用。

在 WWW 的背后,有一系列的协议和标准支持它完成工作,这就是 Web 协议族,其中就包括 HTTP 超文本传输协议。

在1990年,HTTP 就成为 WWW 的支撑协议。当时由其创始人 WWW 之父蒂姆·贝纳斯·李(Tim Berners-Lee)提出,随后 WWW 联盟(WWW Consortium)成立,组织了IETF(Internet Engineering Task Force)小组进一步完善和发布 HTTP。

HTTP 是应用层协议,同其他应用层协议一样,是为了实现某一类具体应用的协议,并由某一个运行在用户空间的应用程序来实现其功能。

HTTP 是一种协议规范,这种规范记录在文档上,由通过 HTTP 进行通信的 HTTP的程序来实现。

HTTP 是基于 B/S 架构进行通信的,而 HTTP 的服务器端的实现程序有 Apache、Nginx、IIS 等,客户端的实现程序主要是 Web 浏览器,例如:Google Chrome、Internet Explorer、Safari、Firefox、Opera等。此外,客户端的命令行工具还有 elink、curl 等。

Web 服务是基于 TCP 的,因此为了能够随时响应客户端的请求,Web 服务器需要监听在 80/TCP 端口。这样客户端浏览器和 Web 服务器之间就可以通过 HTTP 进行通信。


2. 发展历史

1) 0.9 版本

0.9 协议是适用于各种数据信息的简洁快速协议,但是远不能满足日益发展的各种应用的需要。0.9协议就是一个交换信息的无序协议,仅仅限于文字。由于无法进行内容的协商,在双发的握手和协议中,并有规定双发的内容是什么,也就是图片是无法显示和处理的。

2) 1.0 版本

到了 1.0 协议阶段,也就是在1982年,Tim Berners-Lee 提出了 HTTP/1.0。在此后的不断丰富和发展中,HTTP/1.0 成为最重要的面向事务的应用层协议。该协议对每一次请求/响应建立并拆除一次连接。其特点是简单、易于管理,所以它符合了大家的需要,得到了广泛的应用。

3) 1.1 版本

在 1.0 协议中,双方规定了连接方式和连接类型,这已经极大扩展了 HTTP 的领域,但对于互联网最重要的速度和效率,并没有太多的考虑。毕竟,作为协议的制定者,当时也没有想到 HTTP 会有那么快的普及速度。HTTP 1.1 对此进行了完善。

关于 HTTP 1.1 协议的具体内容可以参考 RFC 2616。

4) 2.0 版本

HTTP 2.0 的前身是 HTTP 1.0 和 HTTP 1.1。虽然之前仅仅只有两个版本,但这两个版本所包含的协议规范之庞大,足以让任何一个有经验的工程师为之头疼。网络协议新版本并不会马上取代旧版本。实际上,1.0 和 1.1 在之后很长的一段时间内一直并存,这是由于网络基础设施更新缓慢所决定的。

关于 HTTP 2.0 协议的具体内容可以参考 RFC 7540。


3. 应用场景

HTTP 诞生之初主要是应用于 WEB 端内容的获取,那时候内容还不像现在这样丰富,排版也没那么精美,用户交互的场景几乎没有。对于这种简单的获取网页内容的场景,HTTP表现得还算不错。

但随着互联网的发展和 WEB2.0 的诞生,更多的内容开始被展示(更多的图片文件),排版变得更精美(更多的 CSS),更复杂的交互也被引入(更多的 JS)。用户打开一个网站首页所加载的数据总量和请求的个数也在不断增加。

另一个广泛的应用是在移动互联网的客户端 app,不同性质的 app 对 HTTP 的使用差异很大。对于电商类 app,加载首页的请求也可能多达10多个。对于微信这类 IM,HTTP 请求可能仅限于语音和图片文件的下载,请求出现的频率并不算高。


4. 报文格式

HTTP报文由从客户机到服务器的请求和从服务器到客户机的响应构成。

1) 请求报文格式

请求行 - 通用信息头 - 请求头 - 实体头 - 报文主体

请求行以方法字段开始,后面分别是URL字段和HTTP协议版本字段,并以CRLF结尾。SP是分隔符。除了在最后的CRLF序列中CF和LF是必需的之外,其他都可以不要。有关通用信息头,请求头和实体头方面的具体内容可以参照相关文件。

2) 应答报文格式

状态行 - 通用信息头 - 响应头 - 实体头 - 报文主体

状态码元由3位数字组成,表示请求是否被理解或被满足。原因分析是对原文的状态码作简短的描述,状态码用来支持自动操作,而原因分析用来供用户使用。客户机无需用来检查或显示语法。有关通用信息头,响应头和实体头方面的具体内容可以参照相关文件。