一、什么是HTTP协议
HTTP协议是基于TCP/IP协议的应用层协议,不涉及数据包传输,是无状态的协议。主要规定了客户端及服务器之间的通信格式。默认使用80端口。
二、演变历史
1991年 HTTP/0.9
1996年 HTTP/1.0
1997年 HTTP/1.1
2009年 SPDY
2015年 HTTP/2
三、演变过程及实现思路
1、HTTP/0.9
1991年,发布了0.9版本。只有一个简单的get命令。
TCP连接建立之后,客户端像服务端请求index.html,并且只能回应传输html格式的数据。服务器发送完毕就关闭连接。
GET /index.html
2、HTTP/1.0
1996年,发布了1.0版本。
变化:
(1)传输的数据格式发生了变化,可以传输任何类型的文件,除了文本文件还可以传输视频、图像及二进制文件。
(2)命令上添加了POST HEAD命令
(3)请求与回应的格式变化:增加了头信息描述元数据。
请求格式:
GET / HTTP/1.0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: */*
第一行是请求命令,必须添加版本协议
后面是多行头信息
回应格式:
HTTP/1.0 200 OK
Content-Type: text/plain; charset=utf-8
Content-Length: 137582
Expires: Thu, 05 Dec 1997 16:00:00 GMT
Last-Modified: Wed, 5 August 1996 15:55:28 GMT
Server: Apache 0.84
第一行是协议、状态码加上状态描述
content-type表示回应的数据类型,常见的数据类型如下:
text/plain
text/html
text/css
image/jpeg
image/png
image/svg+xml
audio/mp4
video/mp4
application/javascript
application/pdf
application/zip
application/atom+xml
这些统称为MIME type,用斜杠表示下一级类型,用分号隔开添加参数
accept表示可接收的数据类型
Content-Encoding表示可以接受的压缩方法
(4)增加了状态码、多字符集、多部分发送、权限、缓存、内容编码等
缺点:每个连接只能发送一个请求,所以有些浏览器使用connection: keep-alive来保存连接,直到客户端自己关闭。
3、HTTP/1.1
1997年1月,发布了HTTP/1.1版本。
变化:
(1)持久连接,不再声明 keep-alive 就可以保持连接状态。客户端或者服务端发现连接一段时间没有活动就会主动关闭连接,也可以直接connection:close来关闭连接。同一个域名目前同时允许建立6个连接。
(2)管道机制,同一个连接可以同时发送多个请求,但是发送及相应的顺序还是一定的。
(3)content-length,声明本次回应的数据长度来区分是包是哪一个回应的。
缺点:依然需要按顺序来执行请求与响应。解决放式为,减少http请求次数或者同时多开tcp持久连接。
4、SPDY协议
2009年,谷歌发布了SPDY协议,主要解决http1.1效率低问题,在http2中得以继承。
5、HTTP/2
2015年,发布了HTTP/2
变化:
(1)二进制协议:之前头信息一定是文本(ASC||),响应可以是文本或二进制。现在全部改为二进制,统称为帧,头信息帧和数据帧。
(2)多工通信:双向实时的通信,处理多少就发送多少,剩余的在处理其他信息后再次发送。
(3)数据流:将每一个请求或者回应的所有数据包统称为一个数据流,每个流都有一个独一无二的编号。客户端请求的ID一律为奇数,响应的一律为偶数。
(4)头信息压缩:由于http无状态,所以每一个请求都有加上所以的头信息,因此很多是一样的,所以压缩后再进行发送。另一方面,两端同时维护一张头信息表,会生成一个索引宏,以后就可以只发送宏索引号就可以。
(5)服务器推送:服务器主动向客户端发送资源。
资源链接:HTTP协议入门