SPDY 相关

#SPDY

What is SPDY

SPDY VS HTTP Pipeling

对于现有的HTTP1.0而言,存在的一个很大的问题就是,每次请求很小的资源也要三次握手建立连接,整个请求建立连接下载的过程中大部分时间浪费在了建立连接的操作,对于小文件来说这个问题尤其严重。后来HTTP协议开始支持HTTP管线化(HTTP Pipeling 在HTTP请求中设置Keep-Alive 模式)来试图解决这一问题,在这种模式下服务器和客户端的连接根据策略保持联络,这样下次请求就可以避免重新建立连接。

但是和SPDY相比还是存在太多问题

  1. 请求队列遵循FIFO原则,一个阻塞的请求可能导致其他请求都阻塞
  2. 部署困难 这里提供了很多优化部署的策略
  3. 协议头不压缩 浪费带宽

真实场景中使用的并不是很多,HTTP管线化本身还是存在许多问题的,具体见这里的讨论。

相对于HTTP而言SPDY如下优点

  1. 多路复用 (HTTP Pipeling同样具备)
  2. 压缩 请求协议时默认压缩的
  3. 请求可以设置优先级
  4. 加密
  5. 服务器端推送

另外SPDY有Google的支持,Chrome 和 Firefox 已经开始默认开启 SPDY 协议,现在 Google.com ,Facebook.com … 等已经支持SPDY协议,而且也有可能成为 HTTP 2.0 的备选,目前为止最靠谱。

##工作模式

1.名词解释:

2.SPDY Framing Layer

SPDY 在TCP层建立C-S通道,将传输内容分割成最小单元 Frame (一定长度的byte[]) , Frame 分 Control-Frame 和 Data Frame 两种,分别用来传输控制 Frame 和 数据 Frame . 在 Frame 的基础上建立 Stream 的概念, 通过发送 SYN_STREAM Frame 建立一个 Stream ,同一个通道可以建立多个异步 Stream , 不同 Stream 通过 Stream id 标示。

3.HTTP Layering over SPDY(HTTP兼容)

SPDY 兼容 HTTP 协议,将 HTTP 协议写到 Frame 中,并且实现 PUSH 系统,一个典型的场景是:客户端需要下载服务器资源,然后解析后Requet更多的服务器资源,SDPY 可以在客户端发起一次请求后,将协议中包含的其它资源推送到客户端,省去客户端继续发起资源请求。和 HTTP协议比起来,HTTP协议较好的分离了 传输层和应用层,但是 SPDY 确实将两者结合的更紧密了,因为这样才能有效利用 SDPY 多路复用的特点。

更多细节:http://tools.ietf.org/html/draft-mbelshe-httpbis-spdy-00

SPDY实现

Java

  1. Netty SPDY (Java library): http://netty.io/blog/2012/02/04/
  2. Java SPDY: http://svn.apache.org/repos/asf/tomcat/trunk/modules/tomcat-lite

iPhone

  1. iPhone SPDY: https://github.com/sorced-jim/SPDY-for-iPhone

Android

  1. Android SPDY: http://square.github.io/okhttp/

C 实现

  1. C SPDY (libspdy): http://libspdy.org/index.html (to be used by libcurl: http://daniel.haxx.se/blog/2011/10/18/libspdy/)
  2. C SPDY (spindly): https://github.com/bagder/spindly
  3. C SPDY (spdylay): https://github.com/tatsuhiro-t/spdylay

其他

  1. Ruby wrapper around Chromium SPDY framer: https://github.com/romanbsd/spdy
  2. Go SPDY: http://golang.org/pkg/http/spdy/
  3. Erlang SPDY: https://github.com/RJ/erlang-spdy
  4. Nodejs https://coderwall.com/p/2gfk4w

PS:

Android SPDY

Android SPDY 在github上更新非常快,是square工程师开源的一个工程,它在SPDY的基础上又做了一层封装,屏蔽了SPDY的许多底层概念,使用起来和Apache的HttpClient差不多,但是底层实际上是通过SPDY复用了同一个TCP连接。

//Get
OkHttpClient client = new OkHttpClient();

String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}
//POST
public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

SPDY的使用倾向于POST或者GET少量数据,如果需要下载或者上传很大的文件还是单开一个HTTP请求比较合适。

nTop 10 November 2014
blog comments powered by Disqus