CocoaSPDY
是 Twitter推出的用於iOS和Mac OS X的 SPDY 框架,適用於iOS和 Mac OS X的SPDY/3.1git
SPDY最初是Google設計的用於替代HTTP的試驗品。雖然SPDY是一個二進制協議(沒法像HTTP那樣,人們能夠直觀讀懂),可是SPDY與HTTP徹底兼容。並且,頗具現實意義的是,目前正在進行中的 HTTP2.0 草稿就是基於SPDY的。github
爲了對HTTP進行加速,SPDY作了以下改進:apache
首先,也是最被稱道的是「請求的多路傳輸處理」。與傳統的創建一個TCP連接只能發送一個請求不一樣的是,SPDY能夠經過一個TCP會話同時處理多個請求,並且針對請求的返回值能夠作到亂序處理,也就是說只要接到返回就能當即處理(好比下面介紹的CRIME攻擊。)。segmentfault
其次,SPDY對請求和返回的頭信息都作了壓縮處理。因爲不一樣請求的頭信息一般都包含許多類似的信息,因此這些重量級的頭信息有很大的壓縮處理空間。後端
最後,SPDY引入了推送服務(本版框架未支持,估計後續會推出)。就是在client不須要知情的狀況下由服務器向其推送內容。推送的信息能夠是諸如樣式、圖片或者是實時事件等。api
輕量級版的SDPY能夠對HTTP請求作必定程度的加速,某種程度上會達到很是快的效果。詳情參見:瀏覽器
只要使用者的應用或工程的請求是基於NSURL來處理的(基於NSURL的第三方庫也能夠,例如AFNetworking),均可以將SPDY直接添加到現有的apps或者工程中。請將SPDY的framework bundle添加到工程中,而後link到目標target後再啓用協議便可。framework同時含有針對不一樣架構或者系統的二進制包,iOS6以上和OS X Lion以後的系統以及全部運行以上系統的硬件設備都支持。而發佈態的應用中的SPDY的包大小也作了空間優化。服務器
使用SPDY framework須要在工程中連接系統的庫CFNetworking.framework和libz.dylib。具體操做:選擇target配置下「Build Phases」頁籤中的「Link Binary with Libraries」來添加。cookie
在應用中使用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加密。
#import <SPDY/SPDYProtocol.h> ... NSURLSessionConfiguration configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.protocolClasses = @[[SPDYURLSessionProtocol class]];
上述的方法能夠單獨或者組合使用,SPDY的會話在請求堆棧中是共享的。採用前一種方式註冊到SPDY的原始請求將使用默認的NSURLSession。
以上就是將現有HTTP請求遷移到SPDY所要作的所有事情。固然,還需對服務器作相應的配置使其能處理SPDY請求。
請參考以下:
* netty
* jetty
* apache(with mod_spdy)
現有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攻擊是一種明文注入技術,能夠根據請求壓縮內容的長度來推測加密信息(主要針對頭信息中的cookies)的內容。這是瀏覽器廣泛存在的問題,攻擊者能夠經過挾持瀏覽器來不斷變動發送的請求的明文內容,經過觀察請求處理結果的變化來分析壓縮內容的信息。對於那些限定請求數據格式的應用不須要特別考慮這些問題。可是,若是啓用了請求頭信息的壓縮屬性,開發者須要知道應用存在潛在的被攻擊的風險。
若是想要本身編譯framework,很是簡單,Xcode能夠直接搞定。可是仍是有一些注意事項。在Xcode5以前,若是想要把framework編譯成支持多平臺的二進制文件(distribution模式),須要在target中指定framework編譯平臺爲‘iOS Device’。這與Xcode特殊的編譯過程有關,不然的話,編譯會忽略掉一些但並非所有的真機ARM架構相關的內容。在Xcode5中,全部平臺target的編譯結果最終將造成一個通用的二進制文件(所以上述設置配了也沒有效果)。
編譯過程經過幾個靜態庫targets聯編造成最終二進制文件。
更多信息可瀏覽項目主頁:https://github.com/twitter/CocoaSPDY
翻譯:伯樂在線 - sunset
編輯:Segmentfault