適用於iOS和Mac OS X的SPDY/3.1
SPDY協議
輕量級版的SDPY可以對HTTP請求做一定程度的加速,某種程度上會達到非常快的效果。詳情參見:
- http://www.chromium.org/spdy/spdy-whitepaper
- http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3-1
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來處理。
1 2 3 |
#import <SPDY/SPDYProtocol.h> ... [SPDYURLConnectionProtocol registerOrigin:@"https://api.twitter.com:443"]; |
注意,由於SPDY使用不同的會話來處理“http”以及“https”型別的請求,所以原始請求中如包含“http”和“https”,那麼在一開始就要分別註冊。新增到會話中的原始請求只有https型別的會進行TLS加密。
對於NSURLSession,需要配置相應的會話使得SPDY使用NSURLSessionConfiguration。
1 2 3 4 |
#import <SPDY/SPDYProtocol.h> ... NSURLSessionConfiguration configuration = [NSURLSessionConfiguration defaultSessionConfiguration]; configuration.protocolClasses = @[[SPDYURLSessionProtocol class]]; |
上述的方法可以單獨或者組合使用,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。
作者
- Micheal Schore https://twitter.com/goaway
- Jeffrey Pinner https://twitter.com/jpinner
License
Copyright 2013 Twitter, Inc. and other contributors.
基於Apache License 2.0:http://www.apache.org/licenses/LICENSE-2.0