SocketRocket - facebook

socketRocket

WebSocket 協(xié)議

百度百科
http://www.tuicool.com/articles/7zyMvy6

HTML5一種新的協(xié)議,實(shí)現(xiàn)了瀏覽器與服務(wù)器全雙工通信,一開(kāi)始的握手需要借助HTTP請(qǐng)求完成;
傳統(tǒng)的HTTP請(qǐng)求采用輪詢拐揭,而HTTP的header是非常長(zhǎng)的,這樣會(huì)占用很多帶寬顷锰;
WebSocket API中挥萌,瀏覽器只需要做一個(gè)握手的動(dòng)作绰姻,然后,瀏覽器和服務(wù)器之間形成了一條快速通道引瀑,兩者之間就直接可以數(shù)據(jù)互相傳送狂芋;
HTTP的keep-alive是把多個(gè)http請(qǐng)求合并為一個(gè),而Websocket是一個(gè)新協(xié)議憨栽;


Paste_Image.png

多出的 Upgrade帜矾,Connection字段表明是websocket請(qǐng)求;

  • 數(shù)據(jù)幀格式
    基本的數(shù)據(jù)幀為一個(gè)opcode屑柔、一個(gè)payload長(zhǎng)度和發(fā)送的應(yīng)用數(shù)據(jù)
    Paste_Image.png

1. 測(cè)試用例

2. 技術(shù)點(diǎn)

NSOperation

NSOperation 方法說(shuō)明
(void)start; 啟動(dòng) operation
isFinished, isExecuting 狀態(tài)標(biāo)識(shí)
在start函數(shù)里處理設(shè)計(jì)要執(zhí)行的功能

  • 設(shè)計(jì) operation
    設(shè)計(jì)一個(gè)基礎(chǔ)的SRTWebSocketOperation<SRWebSocketDelegate>, 并代理處理SR webSocket的close及fail事件屡萤;
    SRAutobahnOperation : SRTWebSocketOperation 實(shí)際設(shè)計(jì)執(zhí)行的子operation, 并處理delegate中消息接收的事件;
    設(shè)計(jì)了三個(gè)測(cè)試接口:
    SRAutobahnTestResultOperation 結(jié)果
    SRAutobahnTestCaseInfoOperation 信息
    SRAutobahnTestCaseCountOperation 數(shù)目
    SRAutobahnTestUpdateReportsOperation 更新
    每個(gè)接口創(chuàng)建對(duì)應(yīng)的url測(cè)試

  • operation queue
    NSOperationQueue
    addDependency //依賴任務(wù)完成偶才開(kāi)始執(zhí)行其他任務(wù)
    addOperation

  • __bridge
    __bridge 關(guān)鍵字來(lái)實(shí)現(xiàn)id類型與void*類型的相互轉(zhuǎn)換掸宛;
    __bridge_retained 是編譯器替我們做了retain工作死陆;
    __bridge_transfer 是編譯器替我們做了release工作;

NSURL 使用

NSURLComponents
NSURLQueryItem

BLOCK

block copy 唧瘾?措译?? 使用copy有什么用途饰序?领虹?//[textMessageHandler copy]
__block 定義變量,讓block內(nèi)部可改變

手動(dòng)KVO

willChangeValueForKey / didChangeValueForKey 即時(shí)狀態(tài)不變化也能觸動(dòng)observation菌羽?

DSP

DSP中的block使用self不會(huì)引起循環(huán)引用掠械,使用weakSelf的是為了減少self的生命周期;因?yàn)閎lock肯定會(huì)執(zhí)行注祖;

  • 使用 dispatch_group_t 同步
    diapatch_group_create / dispacth_group_enter / dispatch_group_wait / dispatch_group_leave
  • 使用 dispatch_semaphore_t 進(jìn)行同步
  • dispatch_data_t
    某種程度上跟NSData類型相似猾蒂;
    它的獨(dú)特屬性是它可以基于零碎的內(nèi)存區(qū)域,對(duì)組合內(nèi)存進(jìn)行連接管理是晨;
    dispatch_data_t c = dispatch_data_create_concat(a, b);
    它并不把數(shù)據(jù)copy到一個(gè)單獨(dú)的更大的內(nèi)存區(qū)域肚菠,相反的只是簡(jiǎn)單簡(jiǎn)單持有a和b對(duì)象;
    類似的罩缴,你可以使用dispatch_data_create_subrange來(lái)創(chuàng)建一個(gè)不做任何拷貝操作的子區(qū)域蚊逢;
  • dispatch_benchmark
    測(cè)試代碼執(zhí)行的平均納秒數(shù),只在調(diào)試和性能分析上起作用箫章;
編譯相關(guān)

attribute ((vector_size (32))); 占32字節(jié)
_Alignof(type-name) 某類型的對(duì)齊要求

3. 結(jié)構(gòu)設(shè)計(jì)

Paste_Image.png

4. 模塊

Internal 模塊

SRPinningSecurityPolicy : SRSecurityPolicy

使用 Security 框架

  • evaluateServerTrust
    遍歷serverTrust對(duì)象烙荷,檢查是否與pinnedCertificates中的某個(gè)證書(shū)一致,當(dāng)驗(yàn)證所有pinned證書(shū)都正確時(shí)檬寂,返回YES终抽,否則NO;
  • updateSecurityOptionsInStream
    設(shè)置NSStream對(duì)象的安全屬性策略桶至,支持TLS昼伴,是否支持證書(shū)鏈;
SRProxyConnect :NSObject

使用 NSStreamDelegate 代理镣屹,使用 CFNetwork 框架圃郊;
處理url的代理設(shè)置,有代理連接代理女蜈,無(wú)代理直接訪問(wèn)host持舆;
屬性:http與socket代理,SSL支持伪窖,輸入數(shù)據(jù)數(shù)組

  • initWithURL:(NSURL *)url
    初始化工作吏廉,檢查url是否需要SSL;
    創(chuàng)建寫(xiě)數(shù)據(jù)的 dispatch_queue惰许,初始化輸入數(shù)據(jù)數(shù)組
  • _configureProxy 取得系統(tǒng)代理并設(shè)置代理
    _fetchPAC 根據(jù)url自動(dòng)發(fā)現(xiàn)代理席覆,再調(diào)用_runPACScript取得代理設(shè)置
    _runPACScript 運(yùn)行PAC的JS腳本取得代理設(shè)置
    _readProxySettingWithType 讀取http或socket代理設(shè)置保存
  • _openConnection
    NSStream Foundation架構(gòu)中定義
    _initializeStreams 根據(jù)url跟代理配置連接參數(shù),調(diào)用CFStreamCreatePairWithSocketToHost 創(chuàng)建socket的read和write stream汹买;
    NSInputStream / NSOutputStream open 打開(kāi)stream佩伤;
  • (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode;
    處理socket的read/write stream的代理事件,包括連接晦毙、錯(cuò)誤生巡、數(shù)據(jù)事件的處理;
    如果stream打開(kāi)成功见妒,檢查是否有http代理孤荣,如果有發(fā)送http代理連接請(qǐng)求;
  • _didConnect
    表示根據(jù)代理設(shè)置已連接成功的處理,返回盐股;
    設(shè)置input/outputStream為nil钱豁,取消代理,回調(diào)_completion疯汁;
  • _writeData
    這個(gè)數(shù)據(jù)只會(huì)是代理連接的請(qǐng)求數(shù)據(jù)牲尺;
    將數(shù)據(jù)寫(xiě)入到outStream中,并做錯(cuò)誤與超時(shí)處理幌蚊;
  • _processInputStream
    讀取inputStream的數(shù)據(jù)放入到input隊(duì)列中谤碳;
    CFHTTPMessageAppendBytes 將數(shù)據(jù)放入到代理頭中,
    調(diào)用_proxyProcessHTTPResponseWithData檢查代理是否連上了溢豆;
SRDelegateController :NSObject

設(shè)置DSP或者Operation來(lái)處理delegate的block蜒简;

IOConsumerPool :NSObject

存儲(chǔ)管理poolSize個(gè)SRIOConsumer;

  • consumerWithScanner
    從pool中取出一個(gè)SRIOConsumer或者創(chuàng)建一個(gè)漩仙,并設(shè)置參數(shù)返回consumer臭蚁;
  • returnConsumer
    向pool中添加一個(gè)consumer;
IOConsumer

管理io接口屬性

  • resetWithScanner
    根據(jù)傳入?yún)?shù)設(shè)置stream_scanner / data_callback函數(shù)指針讯赏,設(shè)置_bytesNeeded/_readToCurrentFrame/_unmaskBytes
SRRunLoopThread :NSThread 自定義線程類

通過(guò)自定義main 中 runloop來(lái)控制循環(huán)不退出垮兑,同時(shí)記錄線程的 runloop

  • main 函數(shù):添加一個(gè)空的 runloop source,并加入到 current runloop中漱挎,保持線程一直阻塞等待事件觸發(fā)系枪?

Utilities 模塊

提供各種C接口工具函數(shù)

SRHash

對(duì)數(shù)據(jù)進(jìn)行sha1或者base64編碼
SHA1: Secure Hash Algorithm 安全哈希算法
Base64:網(wǎng)絡(luò)上最常見(jiàn)的用于傳輸8Bit字節(jié)代碼的編碼方式之一,返回一個(gè)字符串磕谅;

SRHTTPConnectMessage

根據(jù)request私爷,secureKey,協(xié)議版本膊夹,cookie及協(xié)議衬浑,來(lái)生成一個(gè)CFHTTPMessageRef的Http消息頭;
CFHTTPMessageSetHeaderFieldValue:設(shè)置http消息頭的字段放刨,包括GET/Host/Cookie/Authorization/Connection/Sec-WebSocket-Key/Sec-WebSocket-Version/Sec-WebSocket-Protocol以及request中的key字段工秩;

SRURLUtilities
  • SRURLRequiresSSL
    取得NSURL中的host,port进统,schema組織成一個(gè) https://127.0.0.1:90像是的字符串助币;
  • SRURLRequiresSSL
    檢查NSURL的schema中是否為wss還是https(表示SSL協(xié)議);
  • SRStreamNetworkServiceTypeFromURLRequest
    把NSURLRequest中的networkServiceType轉(zhuǎn)換為NSStream類型的字符串螟碎;
    服務(wù)類型包括:默認(rèn)正常眉菱、VoIP、Video掉分、Background俭缓、Voice及Call Signaling克伊;
SRSIMDHelpers

對(duì)數(shù)據(jù)進(jìn)行SIMD的處理,使用多數(shù)據(jù)流能夠加快數(shù)據(jù)處理华坦?

  • SIMD
    SIMD:Single Instruction Multiple Data 單指令多數(shù)據(jù)流愿吹,能夠復(fù)制多個(gè)操作數(shù),并把它們打包在大型寄存器的一組指令集季春;
    以加法指令為例,單指令單數(shù)據(jù)(SISD)的CPU對(duì)加法指令譯碼后消返,執(zhí)行部件先訪問(wèn)內(nèi)存载弄,取得第一個(gè)操作數(shù);之后再一次訪問(wèn)內(nèi)存撵颊,取得第二個(gè)操作數(shù)宇攻;隨后才能進(jìn)行求和運(yùn)算。而在SIMD型的CPU中倡勇,指令譯碼后幾個(gè)執(zhí)行部件同時(shí)訪問(wèn)內(nèi)存逞刷,一次性獲得所有操作數(shù)進(jìn)行運(yùn)算。這個(gè)特點(diǎn)使SIMD特別適合于多媒體應(yīng)用等數(shù)據(jù)密集型運(yùn)算;

Socket Rocket 模塊

Paste_Image.png
SRWebSocket

主要連接接口及數(shù)據(jù)處理在這里面
SRWebSocketDelegate : handle status and message events
Constructor / open
屬性:涉及NSURLRequest妻熊、SRSecurityPolicy夸浅、SRDelegateController、SRIOConsumer等對(duì)象扔役;

  • (instancetype)initWithURLRequest:(NSURLRequest *)request protocols:(NSArray<NSString *> *)protocols allowsUntrustedSSLCertificates:(BOOL)allowsUntrustedSSLCertificates
    根據(jù)請(qǐng)求URL帆喇,協(xié)議,是否接受不信任的SSL證書(shū)亿胸,來(lái)創(chuàng)建請(qǐng)求坯钦;
    SRSecurityPolicy用來(lái)處理設(shè)置stream的安全策略;
    這個(gè)函數(shù)用于處初始化各個(gè)參數(shù)侈玄;
  • open
    超時(shí)處理婉刀、SRProxyConnect進(jìn)行連接;
    在block中取得連接的 input/outputStream
    如果需要驗(yàn)證SSL序仙,在接收到stream數(shù)據(jù)后對(duì)證書(shū)進(jìn)行驗(yàn)證突颊;
  • didConnect
    生成隨機(jī)key,生成并發(fā)送webSocket的http連接請(qǐng)求消息潘悼;
    _pumpWriting 將數(shù)據(jù)寫(xiě)入到 _outputStream 發(fā)送出去洋丐;
  • sendString
    對(duì)數(shù)據(jù)進(jìn)行frame組織并發(fā)送給webSocket服務(wù)端;參考webSocket協(xié)議挥等;
    sendString --> _sendFrameWithOpcode --> SRMaskBytesSIMD + _writeData

10. 名詞解釋

PAC:代理自動(dòng)配置友绝,一個(gè)PAC文件包含一個(gè)JS形式的函數(shù) “FindProxyForURL(url, host)” ;PAC文件中的URL可能是手工配置的肝劲,也可能是通過(guò)網(wǎng)頁(yè)的網(wǎng)咯代理自發(fā)現(xiàn)協(xié)議(Web Proxy Autodiscovery Protocol)自動(dòng)配置的迁客;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末郭宝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子掷漱,更是在濱河造成了極大的恐慌粘室,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件卜范,死亡現(xiàn)場(chǎng)離奇詭異衔统,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)海雪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門锦爵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人奥裸,你說(shuō)我怎么就攤上這事险掀。” “怎么了湾宙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵樟氢,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我侠鳄,道長(zhǎng)埠啃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任伟恶,我火速辦了婚禮霸妹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘知押。我一直安慰自己叹螟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布台盯。 她就那樣靜靜地躺著罢绽,像睡著了一般。 火紅的嫁衣襯著肌膚如雪静盅。 梳的紋絲不亂的頭發(fā)上良价,一...
    開(kāi)封第一講書(shū)人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音蒿叠,去河邊找鬼明垢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛市咽,可吹牛的內(nèi)容都是我干的痊银。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼施绎,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼溯革!你這毒婦竟也來(lái)了贞绳?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤致稀,失蹤者是張志新(化名)和其女友劉穎冈闭,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體抖单,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡萎攒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矛绘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耍休。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蔑歌,靈堂內(nèi)的尸體忽然破棺而出羹应,到底是詐尸還是另有隱情揽碘,我是刑警寧澤次屠,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雳刺,受9級(jí)特大地震影響劫灶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜掖桦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一本昏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧枪汪,春花似錦涌穆、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至赖捌,卻和暖如春祝沸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背越庇。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工罩锐, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人卤唉。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓涩惑,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親桑驱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子境氢,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理蟀拷,服務(wù)發(fā)現(xiàn),斷路器萍聊,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • *面試心聲:其實(shí)這些題本人都沒(méi)怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來(lái)就是把...
    Dove_iOS閱讀 27,143評(píng)論 30 470
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,356評(píng)論 0 35
  • 多線程问芬、特別是NSOperation 和 GCD 的內(nèi)部原理。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景寿桨。SDWebImage的原...
    LZM輪回閱讀 2,007評(píng)論 0 12
  • ———————————————回答好下面的足夠了---------------------------------...
    恒愛(ài)DE問(wèn)候閱讀 1,717評(píng)論 0 4