CocoaSPDY 1.2

CocoaSPDY 1.2

测试已测试
Lang语言 Obj-CObjective C
许可证 自定义
发布上次发布2015年5月

Michael SchoreKevin Goodier 维护。



  • Twitter, Inc.

用于 iOS 和 Mac OS X 的 SPDY/3.1 框架

分支 构建 代码覆盖率
master
develop

下载 v1.2

SPDY 协议

简而言之,SPDY 可以让您的 HTTP 请求更快。有时会快得多。有关更多详细信息,请参阅以下内容

http://www.chromium.org/spdy/spdy-whitepaper
http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1

SPDY 是在 Google 作为 HTTP 的一个实验性继承产品而设计的。它是一个二进制协议(而不是像 HTTP 那样可读),但完全兼容 HTTP。事实上,当前关于 HTTP/2.0 的工作草案很大程度上基于 SPDY 协议及其实际的成功。

为了使 HTTP 请求更快,SPDY 作出了一些改进

首先是请求多路复用。SPDY 可以在单个 TCP 会话中的同时发出许多请求,而不需要在一个 TCP 连接上一次发送一个请求,并按顺序处理响应,只要它们可用。

第二,SPDY 压缩请求和响应头。头通常在请求之间几乎相同,通常包含大量重复的文本,并且可以相当大。这使得它们成为压缩的理想候选。

最后,SPDY 引入了服务器推送。服务器可以推送客户端尚未知道需要的内容,这些内容可以是从额外的资产(如样式和图像)到实时事件的提示。

  1. 请参阅以下关于 CRIME 攻击的备注。
  2. 当前不支持此框架中,但即将推出。

入门指南

SPDY 框架旨在与您现有的应用程序和项目无缝工作。如果您正在使用 NSURL 堆栈发出请求(或任何提供其抽象层的库,如 AFNetworking),您只需将 SPDY 框架捆绑添加到您的项目中,将其链接到您的目标,并启用协议即可。

框架包含一个多架构/多平台(“fat”)二进制文件,支持 iOS 6 及以上版本和 OS X Lion 及以上版本,以及所有能够运行这些操作系统的硬件。当您发布您的应用程序时,如果已启用代码剥离,则包含的二进制文件大小将大大减小。

启用 SPDY

使用SPDY框架,您需要在项目中链接CFNetwork.framework和libz.dylib。这可以在“编译目标”下“链接二进制与库”章节中完成。

您在应用程序中启用SPDY的方法将略有不同,具体取决于您是使用NSURLConnection还是NSURLSession来管理HTTP调用。为了使经过NSURLConnection堆栈发出的请求通过SPDY传输,您需要调用方法来指定一个或多个要由SPDY处理的源(协议-主机-端口号元组)。

#import <SPDY/SPDYProtocol.h>
...
[SPDYURLConnectionProtocol registerOrigin:@"https://api.twitter.com:443"];

请注意,“http”与“https”包含的源是不同的,将由不同的SPDY会话处理,并且必须独立注册。只有包含“https”的源的会话才会使用TLS加密。

对于NSURLSession,您可以通过NSURLSessionConfiguration对会话进行配置以使用SPDY。

#import <SPDY/SPDYProtocol.h>
...
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
configuration.protocolClasses = @[[SPDYURLSessionProtocol class]];

您可以自由使用其中一种或两种方法,并且现有的SPDY会话将在两个网络堆栈之间共享。如果您确实使用了之前的方法,请注意已注册的源也将由默认的NSURLSession处理。

以上任何一行代码都是您需要执行以将HTTP请求透明地转移到SPDY的所有操作。当然,您仍然需要一个会说SPDY的服务器!一些可能性包括

关于NPN的说明

大多数现有的SPDY实现使用名为Next Protocol Negotiation(NPN)的TLS扩展来协商SPDY,而不是HTTP。不幸的是,此扩展不受Secure Transport(Apple的TLS实现)支持,因此为了在您的应用程序中使用SPDY,您要么需要向配置为在专用端口上讲SPDY的服务器发出请求,要么使用足够智能以检查传入请求并根据其外观确定连接将是SPDY还是HTTP的服务器。在Twitter,我们采用后者,但前者可能对大多数应用程序来说更简单。

为了帮助进行协议推断,此SPDY实现包括一个索引为0的非标准设置ID:`SETTINGS_MINOR_VERSION`。这是在未使用NPN协商的情况下区分SPDY/3和SPDY/3.1连接所必需的,因为这些连接只有在框架头中包含主版本。由于并非所有服务器都可能支持此特定设置,因此可以通过协议配置在运行时禁用发送该设置。

实现说明

CRIME攻击

CRIME攻击是一种明文注入技术,它利用了从压缩内容长度中可以推断信息的事实,可能泄露加密流的内容。这对浏览器来说是一个严重的问题,因为它们可能会受到劫持,攻击者可以发出任意数量的具有已知明文标题内容的请求,并观察对压缩的影响。

在没有发出任意请求的应用程序上下文中,这不太可能成为一个问题。但在您报告启用了标题压缩的项目之前,您应该了解该攻击的详细情况以及您的应用程序是否可能容易受到攻击。

自己构建框架

如果您想自己编译框架,该过程相当简单,在Xcode中应该能够直接运行构建过程。但是,还有一些需要注意的事项。

在Xcode 5版本之前,如果您想要编译框架为双平台二进制文件(就像分发版本一样),则需要将框架的目标平台设置为“iOS 设备”。这是因为Xcode构建过程中的一个特性,如果不进行设置,会排除ARM架构的一些(但不是全部)版本,从而导致最终的二进制文件中不包含这些版本。随着Xcode 5的发布,任何平台目标都应该产生相同的最终通用二进制文件(设置实际上被忽略)。

为了创建这个二进制文件,构建过程实际上依赖于几个静态库目标,并使用lipo工具将它们组合。

参与项目与未来工作

我们一直在寻找愿意加入这个项目的人。

在不久的将来,我们将致力于以下工作

用户

请随时通过发送pull request的方式为我们添加自己的名字到这个列表(链接到推文可以获得额外加分)。

有问题吗?

如果您发现任何问题,请提交问题或更好的是,发送一个pull request

作者

许可协议

版权所有 2014 Twitter, Inc. 和其他贡献者。

遵循Apache License, Version 2.0协议:https://apache.ac.cn/licenses/LICENSE-2.0