CocoaSPDY:Twitter推出用于iOS和Mac OS X的SPDY框架

适用于iOS和Mac OS X的SPDY/3.1

V1.0.0版本下载

SPDY协议

轻量级版的SDPY可以对HTTP请求做一定程度的加速,某种程度上会达到非常快的效果。详情参见:

SPDY最初是Google设计的用于替代HTTP的试验品。虽然SPDY是一个二进制协议(无法像HTTP那样,人们可以直观读懂),但是SPDY与HTTP完全兼容。而且,颇具现实意义的是,目前正在进行中的HTTP2.0草稿就是基于SPDY的。

为了对HTTP进行加速,SPDY做了如下改进:

首先,也是最被称道的是“请求的多路传输处理”。与传统的建立一个TCP链接只能发送一个请求不同的是,SPDY可以通过一个TCP会话同时处理多个请求,而且针对请求的返回值可以做到乱序处理,也就是说只要接到返回就能立即处理[1]。

其次,SPDY对请求和返回的头信息都做了压缩处理。由于不同请求的头信息通常都包含许多相似的信息,所以这些重量级的头信息有很大的压缩处理空间。

最后,SPDY引入了推送服务[2]。就是在client不需要知情的情况下由服务器向其推送内容。推送的信息可以是诸如样式、图片或者是实时事件等。

  • [1]比如下面介绍的CRIME攻击。
  • [2]本版框架未支持,稍后奉送。

开始使用

只要使用者的应用或工程的请求是基于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来处理。

注意,由于SPDY使用不同的会话来处理“http”以及“https”类型的请求,所以原始请求中如包含“http”和“https”,那么在一开始就要分别注册。添加到会话中的原始请求只有https类型的会进行TLS加密。

对于NSURLSession,需要配置相应的会话使得SPDY使用NSURLSessionConfiguration。

上述的方法可以单独或者组合使用,SPDY的会话在请求堆栈中是共享的。采用前一种方式注册到SPDY的原始请求将使用默认的NSURLSession。

以上就是将现有HTTP请求迁移到SPDY所要做的全部事情。当然,还需对服务器做相应的配置使其能处理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联编形成最终二进制文件。

加入我们以及未来工作

我们征询能够一起开发这个项目的伙伴。

未来工作

用户

欢迎大家PR,届时会列入清单(另外会在相应的推文中予以链接)。

关于问题

欢迎反馈问题来完善本工程,欢迎PR。

作者

License

Copyright 2013 Twitter, Inc. and other contributors.

基于Apache License 2.0:http://www.apache.org/licenses/LICENSE-2.0

收藏 评论

关于作者:sunset

\"In case I dont see you, good afternoon, good evening, and good night!\" (新浪微博:@僵尸吃掉了你的脑子) 个人主页 · 我的文章

相关文章

可能感兴趣的话题



直接登录
跳到底部
返回顶部