Android网络编程(三):HTTP的缺陷与改进

虽然HTTP已经得到广泛的应用,但随着计算机的快速发展,对网络的需求也越来越高,HTTP协议已经逐渐成为一种瓶颈,目前出现了基于HTTP的一些改进协议,包括Google的SPDY,以及WebSocket通信,以及已经出现的HTTP/2.0。

1.HTTP/1.1连接特性

在HTTP的初始版本中,每进行一次HTTP请求就要进行一个TCP的建立到断开的周期,这是很耗费资源的,建立一个TCP连接要经过三次握手,断开需要四次握手,为了一个HTTP请求就进行这样的操作,无疑是很浪费的。如果只是很少的HTTP连接还可以接受,但是现今的网页中,里面包含了各种资源比如图片的下载链接,这样的流程会造成很严重的延迟与资源浪费。


Android网络编程(三):HTTP的缺陷与改进_第1张图片
TCP完整一个周期

所以在HTTP/1.1中使用到了一项技术,持久连接。

1.1 持久连接(HTTP Persistent Connections)

也称为HTTP keep-alive,特点是只要任意一端没有提出断开,就会保持TCP的连接状态。目的是建立一次TCP连接后进行多次的HTTP请求和响应。


Android网络编程(三):HTTP的缺陷与改进_第2张图片
1.2HTTP/1.1管线化(HTTP Pipelining)

一般来讲,HTTP请求在收到响应之后才会再次发起新的请求,而HTTP Pipelining其实是把多个HTTP请求放到一个TCP连接中一一发送,而在发送过程中不需要等待服务器对前一个请求的响应,但是客户端还是要按照发送请求的顺序来接收响应。大部分的浏览器都会默认关闭这个功能,因为其可能会造成线头堵塞(Head of line blocking)。
Android网络编程(三):HTTP的缺陷与改进_第3张图片

2.HTTP可能会造成网络传输的瓶颈

  • 2.1 每一条连接只能发送一条请求
  • 2.2 从客户端开始请求,客户端只接受响应的指令
  • 2.3 冗长的首部,每次都发送相同的首部
  • 2.4 请求和响应的首部未经压缩就进行发送
  • 2.5 数据内容可能未经压缩就进行发送
  • 2.6 线头阻塞(Head of line blocking):服务器是要按照顺序处理请求的,如果前一个请求非常耗时,那么后续请求都会受到影响。这样会造成网络延迟,有一种方式是新建TCP连接,但是新建TCP开销是很大的,所以新建TCP连接并不能解决问题。

3.SPDY

SPDY是由Google牵头开发的协议,SPDY已经充分证实了它是一个非常好用的方案,HTTP/2.0便是基于SPDY/3草案进行一些修改之后发布的。
SDPY没有完全改写HTTP协议,而是在TCP/IP 的应用层与运输层之间通过新加会话层的形式运作,考虑到安全性问题, SPDY 规定通信中使用 SSL。


Android网络编程(三):HTTP的缺陷与改进_第4张图片

- SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
SPDY的优化措施包括以下几个:

  • 3.1 多路复用:一个TCP可以处理多个HTTP请求,与HTTP/1.1的持久连接区别在于,持久连接排队串行化执行,一旦一个请求出现耗时会造成堵塞,而多路复用可以进行并行请求,一部分请求的堵塞不影响其它请求的执行。
  • 3.2 请求优先级设定:可以设定不用请求的优先级,这样可以按照指定的顺序执行请求。
  • 3.3 压缩HTTP首部:因为HTTP的首部在请求和响应过程都会带上,而且还特别臃肿,对其进行压缩在进行传输会大大节约资源。
  • 3.4 服务器主动推送:支持服务器主动向客户端推送数据。

4.WebSocket协议

WebSocket是浏览器与服务器之间全双工通信标准,即只需要建立一次WebSocket连接,之后所有的通信都在这个连接上进行,不需要像HTTP一样不断的建立连接、断开连接,因为HTTP是无状态连接,新建立连接还得被一个大包袱来回赶。
WebSocket其实就是借助HTTP协议的Upgrade首部字段告诉服务器接下来要使用WebSocket协议,后续的操作其实就交给WebSocket协议自己了。
WebSocket的主要特点如下:

  • 4.1 主动推送
    支持服务器向客户端推送消息,但由于是借助于HTTP协议,一开始的请求发起方也是客户端,但建立连接之后就自由自在了。
  • 4.2 减少通信
    一方面是只需要建立一次连接,另一方面是WebSocket连接过程所携带的首部本来就很少。

你可能感兴趣的:(Android网络编程(三):HTTP的缺陷与改进)