【Android每日一问】Http各个版本的区别

641 阅读6分钟

HTTP

HTTP协议全称HyperText Transfer Protocol,中文名超文本传输协议。是互联网上应用最为广泛的一种网络协议。HTTP是基于TCP/IP协议的应用层协议,不涉及数据包的传输,主要是规定了客户端和服务器之间的通信格式。默认使用80端口。现在HTTP已经演化出了很多个版本。

HTTP 0.9

HTTP 0.9是最早发现的一个版本,在1991年发布,但是现在已经过时了,因为它只允许客户端发送一种GET请求,并且不支持请求头,因为没有协议头的原因,HTTP 0.9只支持纯文本一种内容,服务器只能回应HTML格式的字符串,里边不能插入图片。HTTP 0.9具有典型的无状态性,每个事务独立进行处理,事务结束时就释放这个连接。由此可见,HTTP协议的无状态特点在其第一个版本0.9中已经成型。

HPPT 1.0

HTTP 1.0是HTTP协议的第二个版本在1996年发布,如今仍然被广泛使用,尤其是在代理服务器中。

  • 首先这个版本之后,任何格式的文件都可以发送,这使得互联网不仅仅可以用来传输文字,还可以传输图像、音频、视频等二进制文件。
  • 其次,1.0版本不仅仅支持GET命令还有POST和HEAD等请求方法。
  • HTTP的请求和回应格式也发生了变化,除了要传输的数据之外,每次通信都包含头信息,用来描述一些信息。
  • 还增加了状态码(status code)、多字符集支持、多部分发送(multi-part type)、权限(authorization)、缓存(cache)、内容编码(content encoding)等。
GET / HTTP/1.0
 
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)
 
Accept: */*
  • HTTP 1.0请求的例子如上,在请求命令之后必须添加协议版本,后边就是用来描述客户端的一些情况。

  • 服务器回应的时候头信息+一个空格+具体数据 。第一行是协议版本+状态码+状态描述,如下所示:

HTTP/1.0 200 OK
 
Content-Type: text/plain
 
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
 
 
<html> <body>Hello World</body> </html>
  • HTTP1.0版本虽然是支持长链接,但是默认情况还是短连接,需要使用keep-alive参数来告知服务器建立一个长链接。短连接的主要缺点就是每个TCP链接只能发送一个请求,发送数据完毕,链接就会关闭,如果还要请求其他资源就必须要再创建一个连接,TCP 的链接成本是很高的,因为服务器和客户端之间建立链接需要进行三次握手,并且链接初始的时候发送速率是比较慢的,所以HTTP1.0版本的性能比较差。虽然keep-alive可以可以建立一个可以复用的TCP链接,但是这并不是一个根本的办法。

HTTP 1.1

在1997年发布了新的HTTP版本HTTP1.1直到今天这还是最流行的一个版本.

  • HTTP1.1最大的变化就是引入了长链接,也就是TCP链接默认是不关闭的可以被多个请求复用。客户端或者服务器如果长时间发现对方没有活动就会关闭链接,但是规范的做法是客户端在最后一个请求的时候要求服务器关闭链接。对于同一个域名,目前浏览器支持建立6个长链接。

  • 节约带宽,HTTP1.1支持只发送header头信息不带任何body信息,如果服务器认为客户端有权限请求指定数据那就返回100,没有就返回401,当客户端收到100的时候可以把要请求的信息发给服务器。并且1.1还支持了请求部分内容,如果当前客户端已经有一部分资源了,只需要向服务器请求另外的部分资源即可,这也是支持文件断点续传的基础。

  • 1.1版本中增加了host处理,在HTTP1.0中认为每台服务器都绑定一个唯一的ip地址,因此在URL中并没有传递主机名,但是随着虚拟机技术的发展,可能在一台物理机器上存在多个虚拟主机,并且他们共享了一个ip地址,http1.1中请求消息和响应消息都支持host头域,如果不存在还会报出错误.

  • 虽然1.1版本对1.0有了很大的提升但是他还是存在缺点,在同一个TCP里边所有数据的通信都是按照次序的,服务器只有处理完一个回应,才会解决下一个回应要是前边某个回应处理的比较慢,就会出现后边很多回应等待的情况,这就是常说的队头阻塞。

HTTP2.0

2015年的时候有了我们的HTTP2.0,虽然目前用的还是比较少,但是HTTP2.0的性能相比于以前版本有了很大的提升。

  • 2.0相比于1.x版本中引入了二进制格式,HTTP1.x版本中的解析是基于文本的,而2.0则是基于二进制的,二进制只有01两种信息,这样的数据传输方便并且出错率低。

  • HTTP2.0版本中支持多路复用,支持同一个链接并发处理多个请求,并且并发请求的数量要比以前高出很多的数量级。当然http1.1版本中也支持创建多个TCP链接来处理多个并发的请求,但是创建TCP链接本身也是存在开销的,并且在链接创建初期传输的速度是比较慢的。

  • 之前我们说从1.0版本开始请求和响应增加了header,header里边带有大量信息,并且每次都要重新进行发送,2.0版本通过算法把header进行了压缩这样数据体积就更小,在网络上传输就更快。

  • HTTP2.0还支持服务器推送,服务器推送是当客户端请求一定数据的时候,服务器会额外的推送一些客户端可能会用到的信息,这样当客户端再次请求这个信息的时候,就可以直接从本机缓存中读取而不需要再次向服务器请求数据了。

总结如下:

0.9只支持get,并且没有请求头,只支持纯文本,服务器只回应html1.0支持post,get,head等,有请求头,并且任何格式的文件都可以发送,支持长连接,默认还是短链接,需要keep-alive参数通知,性能较差。
1.1支持长连接,目前浏览器支持6个长链接,支持只发送头信息不带body信息,增加了host处理,一台物理机存在多个虚拟主机共享ip。
2.0引入了二进制格式,传输效率更快,支持多路复用,一个链接并发处理多个请求,进行了header压缩,传输更快,还支持服务器推送,下发一些可能用到的信息,需要直接从缓存取。