前言
HyperText Transfer Protocol 译为超文本传输协议,应用层协议
一、HTTP/0.9
最早的HTTP协议中,request只有一行(因此又被称为one-line protocol)
,response只有请求的文件本身。这时的HTTP是没有版本号的(请求头中没有版本号),HTTP/0.9是为了区分它与后续HTTP版本的称定。
示例如下
req:
GET /mypage.html
res:
<html>
A simple html page
</html>
二、HTTP/1.0
HTTP/1.0 新增了许多特性
- req头部现在会带上使用的HTTP协议版本号 HTTP/1.0
- res会附带状态码,使得客户端可以方便得认识到这次http请求成功与否
- req和res现在都带有头部,http开始具有强大的可扩展性
- 新增的Content-Type请求头部字段,使得HTTP不再仅限于传送单纯的html文件
示例如下
req:
GET /mypage.html HTTP/1.0
User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)
res:
<html>
200 OK
Date: Tue, 15 Nov 1994 08:12:31 GMT
Server: CERN/3.0 libwww/2.17
Content-Type: text/html
<HTML>
A page with an image
<IMG SRC="/myimage.gif">
</HTML>
</html>
三、HTTP/1.1
由于http/1.0的可扩展性,许多浏览器、服务器厂商开始为自己的http新增各种各样的方法,这又带来了新的问题:不同厂商产品间的互通性无法得到保障。
因此,需要一个标准化的http协议。HTTP/1.1正是在这种需要下催生的,它是第一个标准化的HTTP协议。
HTTP/1.1新增的一些主要特性如下:
- 持久化连接,res头部新增的Connection字段可设置为Keep-Alive,这告诉客户端很快还有相关文件需要传输,不用关闭当前TCP连接。
在持久化支持之前,用户访问一个页面可能需要加载许多其他资源(如图片),而每访问一个资源就需要建立一个新的TCP连接,导致了许多额外开销
- 管道支持,客户端不必再等待收到上一个http请求的响应才开始发送新的http请求,这些请求会推送到一个缓冲队列(管道),从而使客户端的http请求更加自由独立。
- …
HTTP/1.x时代,HTTP协议一直在发展,并不断完善其功能。
比如:
- 标准化的http服务器接口设计模式 :RESTful API
- 为解决同源策略带来的CORS跨域请求问题,新增了Allow-Control-Allow-Origin等头部
- 由于安全问题的需要,催生了基于SSL(后逐渐标准化为TLS协议)的HTTPs协议
- 由于保护隐私的需要,新增的DNT(Do Not Track)首部
- …
四、HTTP/2
随着Web应用的发展,Web页面越来越复杂,特别是对于各种多媒体文件的需求、页面交互需要的脚本文件需求增大,原有的HTTP协议很难负荷这些需求,HTTP/2由此催生。
HTTP/2 不同于 HTTP/1.x的主要特点如下:
- HTTP/2不再是使用纯文本的方式传输,而是使用二进制文件的方式传输
- HTTP/2采用多路传输,在同一个TCP连接上可以同时发送多条http请求
- HTTP/2压缩头部,减少开销
- HTTP/2允许服务器向用户端cache填充数据
HTTP/2 发展过程中的重要扩展:
- 一些Client-Hints相关头部,使得客户端可主动为服务端提供自己的一些相关信息,从而获得更优质、面向用户的服务体验
- Cookie新增一些安全相关前缀,来保证Cookie不会被随意篡改
总结
从HTTP发展史可以很好了解到当今HTTP协议各种功能由何而来,解决了为什么要实现这些功能的问题。
下一代HTTP/3协议也逐渐问世,其不再基于TCP/TLS协议,而是基于QUIC协议(Quick UDP Internet Connection)