从这一篇文档开始,我们来说说 HTTP 协议,因为这是当前计算机网络中距离我们生活最近的协议,每天都用到的协议,也是相对比较简单的协议。
什么是协议
在说 HTTP 协议之前,我们先要说明什么是协议?一纸文本而已,和我们日常生活中各种协议(例如借款协议)没有任何区别。所以,不要把计算机协议当成很是很晦涩的概念。
为什么很多人会觉得计算机协议很晦涩难懂呢?因为这所谓的一纸协议是使用 English 编写的,而且出于协议的严谨性,用语都不容易理解,在很多时候还会出现语意的分歧。
另外,虽然协议只是一纸文本,但某些协议涉及的计算机概念却非常底层,难懂。但就协议本身而言,就一纸文本,没什么好畏惧的。
顺便说一下,什么是协议簇?把好多相关的协议装订成一本,这就是协议簇。简单的理解,协议簇就是很多协议。
协议有什么作用
从现实生活出发,协议有什么作用?比如说借款协议?那是为了约束借款双方的责任义务的。计算机中的协议也一样,最根本的目的就是为了使用文本来约束协议各方的责任的。
比如说,我们在访问某个网址的时候,一般不填写 80 端口,浏览器会默认帮我们添加 80 端口,这是为什么呢?因为在协议里规定了这件事情:
If the port is empty or not given, port 80 is assumed. —— rfc2616#section-3.2
但计算机中的协议和现实生活中的协议在保障实施层面是不太一样的。现实中的大部分协议是由法律保障的,而法律又由国家强制力(警察甚至是军队)作为依托的。 计算机体系中的协议并没有强制约束力,也就是说你大可违反协议,甚至自定义协议内容 。
在比如说,我们使用不同的浏览器访问同样的网页,经常会出现呈现的网页样式不一致,或者是按钮不可用,或者干脆显示不出来,这是为什么呢?可能有以下这些原因:
- 浏览器厂商没有实现 HTTP 协议
- 浏览器厂商对 HTTP 协议中的某些文本有不同的解释,导致了不同的实现
- 浏览器厂商没有遵守部分 HTTP 协议中的规定,可能是它对协议的这部分规定有所不满
- 浏览器的缺陷
所以我们说,协议是可以违反的, 但也是有后果的。现实中,你违反了协议,可能收到法院的传票,甚至是被司法机关强制执行。计算机协议中违反了规范,可能可以自成一体形成新的规范(如果你的规范更优秀),也可能你基于自己规范做出的软件件产品会被市场抛弃(你的规范不如别人的规范更合理、更优秀)。
协议的制定者,你可以是你自己,也可以是软硬件厂商,还有就是一些行业组织或者国际标准组织等。比如我们常说的 5G 通信协议,其实各个大国、大国下的大厂都在努力设计自己的协议,因为协议也是话语权的体现。如果能将自己的协议标准化,那么 5G 相关的软硬件厂商,都会以自己的协议为标准去生产硬件和软件,自己就会有更大的发言权。
什么是 HTTP 协议
HTTP 协议离不开协议的本质,就是一纸文本,文本的截图如下:

那么协议应该由制定者?HTTP 协议的制定者 IETF(The Internet Engineering Task Force, 国际互联网工程任务组), 这是一个公开性质的大型民间国际团体,汇聚很多业内学者专家,负责互联网相关标准的制定和研发工作。
而目前,所有主流的浏览器厂商都支持 HTTP 协议,换句话说,浏览器厂商以 IETF 制定的 HTTP 协议为蓝本去开发自己的浏览器产品,来满足全世界互联网用户浏览器网页的需求。他们会对每个协议对应的版本进行编号,其中 HTTP/1.1 协议的编号为 RFC 2616(版本在更新,编号也会更新)。
HTTP 也称之为超文本传输协议,这是一个创举。如果说互联网是将一台台计算机通过路由器这类的网络设备连接在了一起,那么 HTTP 协议就是将一个个网络上的资源通过互联网连接在了一起。
HTTP 协议版本
HTTP 协议支持很多请求方式(专业点说叫做请求谓词,请求动词),比如说: GET、POST、DELETE、OPTION 等等。但是你知道吗?这是现在的版本所支持, 早期版本并不支持。所以说, HTTP 经过那么多年,也衍生出好几个版本了。如下所示:
| 版本 | 描述 |
|---|---|
| HTTP/0.9 | 已经废弃不用了。只支持 GET 方式的请求,不支持 POST 等其他的请求谓词。所以也不能传输很多的数据。 |
| HTTP/1.0 | 这是第一个再通讯中指定版本号的 HTTP 协议版本。引入了 Http Header 的概念。传输也不局限于文本。增加了 HEAD、POST 等方法。 |
| HTTP/1.1 | 这是目前大面积使用的版本。 |
| HTTP/2.0 | 这是目前最新的版本,于 2015 年 5 月发布,逐步替换 HTTP 1.1 版本,应该还需要些年头。 |
关于 HTTP/0.9 版本为什么只有 GET 请求呢?受限于当时的网络速度,当初的设想也是将网络上的这些文档作为一种资源共享的方式,都是只读的。而到了现在,随着网络速度的提升、硬件的发展,已经不再局限于只读了,而是近乎实时的交互了。我们可以轻而易举地提交一个表单,发表我们的想法或是一片文章。 这是一个重要的版本,验证了 Web 服务的可行性 。
而 1.0 版本和之后的 1.1 版本已经相差不多了,这得益于在 90年代初 JPEG 格式的图片以及 MP3 格式的音乐的发明。以及 NCSA(美国国家超级计算机应用中心)开发了 Mosaic 浏览器,它可以显示图文的混排。到了 95年又开发出了 Apache Web 服务器,简化了 HTTP 服务器的搭建工作。
而 1.1 是一个传奇,它延续了十多年,一直到现在。这来源于在九十年代末的浏览器大战,以网景公司的 Netscape Navigator 和微软的 IE 的相互竞争,推动了 Web 的发展。现在 IE 也已经没落了,Chrome 大行其道(市场占有率超过了 60%),而 HTTP/1.1 仍然支撑着这个互联网的繁荣。 HTTP 1.1 增加了以下这些特性:
- 增加了 PUT、DELETE 等新的方法
- 增加了缓存管理和控制
- 明确了连接管理,允许持久连接
- 允许响应数据分块,利于传输大文件
- 强制要求 Host 头,让互联网主机托管成为可能
接着是 HTTP/2.0, 这个协议版本的推出是 Google 退出了 Chrome 浏览器并且取得了第二次浏览器大战的胜利,终结了 IE 浏览器。目前微软也放弃了 IE 浏览器,而是使用 Chrome 二次开发了 Edge 浏览器。
由于 Google Chrome 的胜利,退出了 SPDY 协议。由于 Chrome 庞大的用户群体,互联网标准化组织以 SPDY 为基础开始制定新版本的 HTTP 协议,在 2015 年发布了 HTTP/2。其带来了如下这些变革:
- 二进制协议,不再是纯文本
- 可发起多个请求,废弃了 HTTP/1.1 里的管道
- 使用专用算法压缩头部,减少数据传输量
- 允许服务器主动向客户端推送数据
- 增强了安全性,要求加密通信
HTTP 版本号的规定
在 HTTP 协议中,规定了其版本号采用了两段式: <主版本号>.<小版本号> 。如果是 HTTP 协议的消息格式都发生了变化,那就会改变主版本号,如果只是新增了一些请求或响应的字段,则只改变小版本号。

从这一点来看,我们也可以了解到,协议只是一纸文本,规定了一些事项来约束协议参与者的行为,统一标准罢了。
HTTP 协议的作用
HTTP 协议采用 C/S 架构,即客户端和服务端架构。由客户端向服务端发送请求,而服务端返回响应。约束了浏览器和服务端(比如 Nginx、Apache 这样实现了 HTTP 协议的应用服务器)之间的行为。比如,传输文本的格式、如何保存用户的状态等。
HTTP 协议(Hypertext transfer Protocol, 超文本传输协议)。就起作用而言,简单地说就是我们可以通过网页来呈现信息,通过网页中的 超链接 来跳转不同的网页。比如我们这个文档,就是通过网页的形式呈现的,你可以通过这个文档网页上的超链接来跳转到 HTTP 协议的网页: RFC 2616 Hypertext transfer Protocal - 1.1.
所以,我们可以通过 HTTP 协议中的相关定义,生产浏览器软件、应用服务器软件,通过浏览器呈现网页,通过不同的链接来向应用服务器请求不同的资源,来实现资源的获取,信息的传递。
HTTP 协议的更新
HTTP 协议在不断的更新中,上文中我们引述的资料都是源于 RFC 2616 版本。由于 HTTP/1.1 过于庞大复杂,所以在 2014 年又做了一次修订,原来的 RFC 2616 被拆解成了六份小的文档,优化了细节,编号为 7230-7235。
- RFC 7230 - Message Syntax and routing
- RFC 7231 - Semantics and Content
- RFC 7232 - Conditional Request
- RFC 7233 - Range Requests
- RFC 7234 - Caching
- RFC 7235 - Authentication
2015 年, HTTP/2 发布,协议文档编号为 RFC 7540。
Google 是一家可敬的互联网公司,它并没有止步于自家推出的 HTTP/2,它继续推出了 QUIC 协议,并且在 2018 年获得了 IETF 的承认,并更名为 HTTP/3。目前已经进入到了标准化制定阶段,会在不久的将来推出这一版本。
总结
协议,就是 一纸文本。协议簇,就是很多相关协议的集合。而 HTTP 协议是众多计算机协议中的一个,约定了浏览器和应用服务器之间的行为,比如如何通信、通信的文本格式之类的。