天天看點

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

SPDY 是什麼?

SPDY最初是Google設計的用于替代HTTP的試驗品。雖然SPDY是一個二進制協定(無法像HTTP那樣,人們可以直覺讀懂),但是SPDY與HTTP完全相容。而且,頗具現實意義的是,目前正在進行中的

HTTP2.0

草稿就是基于SPDY的。

為了對HTTP進行加速,SPDY做了如下改進:

首先,也是最被稱道的是“請求的多路傳輸處理”。與傳統的建立一個TCP連結隻能發送一個請求不同的是,SPDY可以通過一個TCP會話同時處理多個請求,而且針對請求的傳回值可以做到亂序處理,也就是說隻要接到傳回就能立即處理(比如下面介紹的CRIME攻擊。)。

其次,SPDY對請求和傳回的頭資訊都做了壓縮處理。由于不同請求的頭資訊通常都包含許多相似的資訊,是以這些重量級的頭資訊有很大的壓縮處理空間。

最後,SPDY引入了推送服務(本版架構未支援,估計後續會推出)。就是在client不需要知情的情況下由伺服器向其推送内容。推送的資訊可以是諸如樣式、圖檔或者是實時事件等。

輕量級版的SDPY可以對HTTP請求做一定程度的加速,某種程度上會達到非常快的效果。詳情參見:

開始使用

隻要使用者的應用或工程的請求是基于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 <SPDY/SPDYProtocol.h>

...

[SPDYURLConnectionProtocol registerOrigin:@"https://api.twitter.com:443"];

注意,由于SPDY使用不同的會話來處理“http”以及“https”類型的請求,是以原始請求中如包含“http”和“https”,那麼在一開始就要分别注冊。添加到會話中的原始請求隻有https類型的會進行TLS加密。

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的編譯結果最終将形成一個通用的二進制檔案(是以上述設定配了也沒有效果)。