CocoaSPDY
是 Twitter推出的用于iOS和Mac OS X的 SPDY 框架,适用于iOS和 Mac OS X的SPDY/3.1
SPDY 是什么?
SPDY最初是Google设计的用于替代HTTP的试验品。虽然SPDY是一个二进制协议(无法像HTTP那样,人们可以直观读懂),但是SPDY与HTTP完全兼容。而且,颇具现实意义的是,目前正在进行中的 HTTP2.0 草稿就是基于SPDY的。
为了对HTTP进行加速,SPDY做了如下改进:
首先,也是最被称道的是“请求的多路传输处理”。与传统的建立一个TCP链接只能发送一个请求不同的是,SPDY可以通过一个TCP会话同时处理多个请求,而且针对请求的返回值可以做到乱序处理,也就是说只要接到返回就能立即处理(比如下面介绍的CRIME攻击。)。
其次,SPDY对请求和返回的头信息都做了压缩处理。由于不同请求的头信息通常都包含许多相似的信息,所以这些重量级的头信息有很大的压缩处理空间。
最后,SPDY引入了推送服务(本版框架未支持,估计后续会推出)。就是在client不需要知情的情况下由服务器向其推送内容。推送的信息可以是诸如样式、图片或者是实时事件等。
轻量级版的SDPY可以对HTTP请求做一定程度的加速,某种程度上会达到非常快的效果。详情参见:
- http://www.chromium.org/spdy/spdy-whitepaper
- http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1
开始使用
只要使用者的应用或工程的请求是基于NSURL来处理的(基于NSURL的第三方库也可以,例如AFNetworking),都可以将SPDY直接添加到现有的apps或者工程中。请将SPDY的framework bundle添加到工程中,然后link到目标target后再启用协议即可。framework同时含有针对不同架构或者系统的二进制包,iOS6以上和OS X Lion之后的系统以及所有运行以上系统的硬件设备都支持。而发布态的应用中的SPDY的包大小也做了空间优化。
启用SPDY
使用SPDY framework需要在工程中链接系统的库CFNetworking.framework和libz.dylib。具体操作:选择target配置下“Build Phases”页签中的“Link Binary with Libraries”来添加。
在应用中使用NSURLConnection或者NSURLSession去处理HTTP请求会对SPDY的启用方式有一点点的影响。为了使原有NSURLConnection堆栈中的请求最终可以通过SPDY,需要调用一个方法来将堆栈中原有的一个或多个请求(protocol-host-port tunple)转向SPDY来处理。
#import
...
[SPDYURLConnectionProtocol registerOrigin:@"https://api.twitter.com:443"];
注意,由于SPDY使用不同的会话来处理“http”以及“https”类型的请求,所以原始请求中如包含“http”和“https”,那么在一开始就要分别注册。添加到会话中的原始请求只有https类型的会进行TLS加密。
#import
...
NSURLSessionConfiguration configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.protocolClasses = @[[SPDYURLSessionProtocol class]];
上述的方法可以单独或者组合使用,SPDY的会话在请求堆栈中是共享的。采用前一种方式注册到SPDY的原始请求将使用默认的NSURLSession。
以上就是将现有HTTP请求迁移到SPDY所要做的全部事情。当然,还需对服务器做相应的配置使其能处理SPDY请求。
请参考如下:
* netty
* jetty
* apache(with mod_spdy)
NPN
现有SPDY使用Next Protocol Implementation(NPN)而非HTTP,NPN是基于TLS的扩展实现。但是Secure Transport(苹果的TLS实现)不支持这种扩展,所以如果在应用中使用SPDY,后端的服务器要么需要特别配置例如开设专门的端口去直接支持SPDY的请求处理要么可以侦测请求类型去选择分发再分别处理SPDY和普通HTTP。在Twitter,我们采取后者的方式,但是第一种方式对大多数应用来说已经可以了。
为了便于协议使用和理解,本版SPDY在index 0配置了一个非标准化的的设置id:SETTINGS_MINOR_VERSION。以此来区分SPDY/3和SPDY/3.1中没有使用NPN的链接。因为并不是所有的server都支持此项设置,可以在运形态对这个协议设置进行配置关闭。
实现说明
CRIME攻击
CRIME攻击是一种明文注入技术,可以根据请求压缩内容的长度来推测加密信息(主要针对头信息中的cookies)的内容。这是浏览器普遍存在的问题,攻击者可以通过挟持浏览器来不断变更发送的请求的明文内容,通过观察请求处理结果的变化来分析压缩内容的信息。对于那些限定请求数据格式的应用不需要特别考虑这些问题。但是,如果启用了请求头信息的压缩属性,开发者需要知道应用存在潜在的被攻击的风险。
编译Framework
如果想要自己编译framework,非常简单,Xcode可以直接搞定。但是还是有一些注意事项。在Xcode5之前,如果想要把framework编译成支持多平台的二进制文件(distribution模式),需要在target中指定framework编译平台为‘iOS Device’。这与Xcode特殊的编译过程有关,否则的话,编译会忽略掉一些但并不是全部的真机ARM架构相关的内容。在Xcode5中,所有平台target的编译结果最终将形成一个通用的二进制文件(因此上述设置配了也没有效果)。
编译过程通过几个静态库targets联编形成最终二进制文件。
更多信息可浏览项目主页:https://github.com/twitter/CocoaSPDY
翻译:伯乐在线 - sunset
编辑:Segmentfault