websocket與http

一、websocket與http

WebSocket是HTML5出的東西(協(xié)議)严蓖,也就是說HTTP協(xié)議沒有變化薄嫡,或者說沒關(guān)系,但HTTP是不支持持久連接的(長(zhǎng)連接颗胡,循環(huán)連接的不算)

首先HTTP有1.1和1.0之說毫深,也就是所謂的keep-alive,把多個(gè)HTTP請(qǐng)求合并為一個(gè)毒姨,但是Websocket其實(shí)是一個(gè)新協(xié)議哑蔫,跟HTTP協(xié)議基本沒有關(guān)系,只是為了兼容現(xiàn)有瀏覽器的握手規(guī)范而已弧呐,也就是說它是HTTP協(xié)議上的一種補(bǔ)充可以通過這樣一張圖理解

有交集闸迷,但是并不是全部。

另外Html5是指的一系列新的API俘枫,或者說新規(guī)范腥沽,新技術(shù)。Http協(xié)議本身只有1.0和1.1鸠蚪,而且跟Html本身沒有直接關(guān)系今阳。。通俗來說茅信,你可以用HTTP協(xié)議傳輸非Html數(shù)據(jù)盾舌,就是這樣=。=

再簡(jiǎn)單來說蘸鲸,層級(jí)不一樣妖谴。

二、Websocket是什么樣的協(xié)議酌摇,具體有什么優(yōu)點(diǎn)

首先膝舅,Websocket是一個(gè)持久化的協(xié)議嗡载,相對(duì)于HTTP這種非持久的協(xié)議來說。簡(jiǎn)單的舉個(gè)例子吧仍稀,用目前應(yīng)用比較廣泛的PHP生命周期來解釋鼻疮。

HTTP的生命周期通過Request來界定,也就是一個(gè)Request一個(gè)Response琳轿,那么在HTTP1.0中,這次HTTP請(qǐng)求就結(jié)束了耿芹。

在HTTP1.1中進(jìn)行了改進(jìn)崭篡,使得有一個(gè)keep-alive,也就是說吧秕,在一個(gè)HTTP連接中琉闪,可以發(fā)送多個(gè)Request,接收多個(gè)Response砸彬。但是請(qǐng)記住Request = Response颠毙, 在HTTP中永遠(yuǎn)是這樣,也就是說一個(gè)request只能有一個(gè)response砂碉。而且這個(gè)response也是被動(dòng)的蛀蜜,不能主動(dòng)發(fā)起。

教練增蹭,你BB了這么多滴某,跟Websocket有什么關(guān)系呢?_(:з」∠)_好吧滋迈,我正準(zhǔn)備說Websocket呢霎奢。。

首先Websocket是基于HTTP協(xié)議的饼灿,或者說借用了HTTP的協(xié)議來完成一部分握手幕侠。

首先我們來看個(gè)典型的Websocket握手(借用Wikipedia的。碍彭。)

GET/chat HTTP/1.1Host:server.example.comUpgrade:websocketConnection:UpgradeSec-WebSocket-Key:x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol:chat, superchatSec-WebSocket-Version:13Origin:http://example.com

熟悉HTTP的童鞋可能發(fā)現(xiàn)了晤硕,這段類似HTTP協(xié)議的握手請(qǐng)求中,多了幾個(gè)東西硕旗。我會(huì)順便講解下作用窗骑。

Upgrade:websocketConnection:Upgrade

這個(gè)就是Websocket的核心了,告訴Apache漆枚、Nginx等服務(wù)器:注意啦创译,我發(fā)起的是Websocket協(xié)議,快點(diǎn)幫我找到對(duì)應(yīng)的助理處理~不是那個(gè)老土的HTTP墙基。

Sec-WebSocket-Key:x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol:chat, superchatSec-WebSocket-Version:13

首先软族,Sec-WebSocket-Key是一個(gè)Base64 encode的值刷喜,這個(gè)是瀏覽器隨機(jī)生成的,告訴服務(wù)器:泥煤立砸,不要忽悠窩掖疮,我要驗(yàn)證尼是不是真的是Websocket助理。

然后颗祝,Sec_WebSocket-Protocol是一個(gè)用戶定義的字符串浊闪,用來區(qū)分同URL下,不同的服務(wù)所需要的協(xié)議螺戳。簡(jiǎn)單理解:今晚我要服務(wù)A搁宾,別搞錯(cuò)啦~

最后,Sec-WebSocket-Version是告訴服務(wù)器所使用的Websocket Draft(協(xié)議版本)倔幼,在最初的時(shí)候盖腿,Websocket協(xié)議還在Draft階段,各種奇奇怪怪的協(xié)議都有损同,而且還有很多期奇奇怪怪不同的東西翩腐,什么Firefox和Chrome用的不是一個(gè)版本之類的,當(dāng)初Websocket協(xié)議太多可是一個(gè)大難題膏燃。茂卦。不過現(xiàn)在還好,已經(jīng)定下來啦~大家都使用的一個(gè)東西~ 脫水:服務(wù)員蹄梢,我要的是13歲的噢→_→

然后服務(wù)器會(huì)返回下列東西疙筹,表示已經(jīng)接受到請(qǐng)求, 成功建立Websocket啦禁炒!

HTTP/1.1101 Switching ProtocolsUpgrade:websocketConnection:UpgradeSec-WebSocket-Accept:HSmrc0sMlYUkAGmm5OPpG2HaGWk=Sec-WebSocket-Protocol:chat

這里開始就是HTTP最后負(fù)責(zé)的區(qū)域了而咆,告訴客戶,我已經(jīng)成功切換協(xié)議啦~

Upgrade:websocketConnection:Upgrade

依然是固定的幕袱,告訴客戶端即將升級(jí)的是Websocket協(xié)議暴备,而不是mozillasocket,lurnarsocket或者shitsocket们豌。

然后涯捻,Sec-WebSocket-Accept這個(gè)則是經(jīng)過服務(wù)器確認(rèn),并且加密過后的Sec-WebSocket-Key望迎。?服務(wù)器:好啦好啦障癌,知道啦,給你看我的ID CARD來證明行了吧辩尊。涛浙。

后面的,Sec-WebSocket-Protocol則是表示最終使用的協(xié)議。

至此轿亮,HTTP已經(jīng)完成它所有工作了疮薇,接下來就是完全按照Websocket協(xié)議進(jìn)行了。具體的協(xié)議就不在這闡述了我注。

——————技術(shù)解析部分完畢——————

你TMD又BBB了這么久按咒,那到底Websocket有什么鬼用,http long poll但骨,或者ajax輪詢不都可以實(shí)現(xiàn)實(shí)時(shí)信息傳遞么励七。

好好好,年輕人奔缠,那我們來講一講Websocket有什么用呀伙。來給你吃點(diǎn)胡(蘇)蘿(丹)卜(紅)

三、Websocket的作用

在講Websocket之前添坊,我就順帶著講下long poll和ajax輪詢的原理。

ajax輪詢

ajax輪詢的原理非常簡(jiǎn)單箫锤,讓瀏覽器隔個(gè)幾秒就發(fā)送一次請(qǐng)求贬蛙,詢問服務(wù)器是否有新信息。

場(chǎng)景再現(xiàn):

客戶端:啦啦啦谚攒,有沒有新信息(Request)

服務(wù)端:沒有(Response)

客戶端:啦啦啦阳准,有沒有新信息(Request)

服務(wù)端:沒有。馏臭。(Response)

客戶端:啦啦啦野蝇,有沒有新信息(Request)

服務(wù)端:你好煩啊,沒有啊括儒。绕沈。(Response)

客戶端:啦啦啦,有沒有新消息(Request)

服務(wù)端:好啦好啦帮寻,有啦給你乍狐。(Response)

客戶端:啦啦啦,有沒有新消息(Request)

服務(wù)端:固逗。浅蚪。。烫罩。惜傲。沒。贝攒。盗誊。。沒。浊伙。撞秋。沒有(Response) —- loop

long poll

long poll其實(shí)原理跟ajax輪詢差不多,都是采用輪詢的方式嚣鄙,不過采取的是阻塞模型(一直打電話吻贿,沒收到就不掛電話),也就是說哑子,客戶端發(fā)起連接后舅列,如果沒消息,就一直不返回Response給客戶端卧蜓。直到有消息才返回帐要,返回完之后,客戶端再次建立連接弥奸,周而復(fù)始榨惠。

場(chǎng)景再現(xiàn):

客戶端:啦啦啦,有沒有新信息盛霎,沒有的話就等有了才返回給我吧(Request)

服務(wù)端:額赠橙。。 等待到有消息的時(shí)候愤炸。期揪。來 給你(Response)

客戶端:啦啦啦,有沒有新信息规个,沒有的話就等有了才返回給我吧(Request) -loop

從上面可以看出其實(shí)這兩種方式凤薛,都是在不斷地建立HTTP連接,然后等待服務(wù)端處理诞仓,可以體現(xiàn)HTTP協(xié)議的另外一個(gè)特點(diǎn)缤苫,被動(dòng)性。

何為被動(dòng)性呢墅拭,其實(shí)就是榨馁,服務(wù)端不能主動(dòng)聯(lián)系客戶端,只能有客戶端發(fā)起帜矾。

簡(jiǎn)單地說就是翼虫,服務(wù)器是一個(gè)很懶的冰箱(這是個(gè)梗)(不會(huì)、不能主動(dòng)發(fā)起連接)屡萤,但是上司有命令珍剑,如果有客戶來,不管多么累都要好好接待死陆。

說完這個(gè)招拙,我們?cè)賮碚f一說上面的缺陷(原諒我廢話這么多吧OAQ)

從上面很容易看出來唧瘾,不管怎么樣,上面這兩種都是非常消耗資源的别凤。

ajax輪詢 需要服務(wù)器有很快的處理速度和資源饰序。(速度)long poll 需要有很高的并發(fā),也就是說同時(shí)接待客戶的能力规哪。(場(chǎng)地大星笤ァ)

所以ajax輪詢和long poll都有可能發(fā)生這種情況。

客戶端:啦啦啦啦诉稍,有新信息么蝠嘉?

服務(wù)端:月線正忙,請(qǐng)稍后再試(503 Server Unavailable)

客戶端:杯巨。蚤告。。服爷。好吧杜恰,啦啦啦,有新信息么仍源?

服務(wù)端:月線正忙箫章,請(qǐng)稍后再試(503 Server Unavailable)

客戶端:然后服務(wù)端在一旁忙的要死:冰箱,我要更多的冰箱镜会!更多。终抽。更多戳表。。(我錯(cuò)了昼伴。匾旭。這又是梗。圃郊。)

言歸正傳价涝,我們來說Websocket吧

通過上面這個(gè)例子,我們可以看出持舆,這兩種方式都不是最好的方式色瘩,需要很多資源。

一種需要更快的速度逸寓,一種需要更多的’電話’居兆。這兩種都會(huì)導(dǎo)致’電話’的需求越來越高。

哦對(duì)了竹伸,忘記說了HTTP還是一個(gè)狀態(tài)協(xié)議泥栖。

通俗的說就是,服務(wù)器因?yàn)槊刻煲哟嗫蛻袅耍莻€(gè)健忘鬼吧享,你一掛電話魏割,他就把你的東西全忘光了,把你的東西全丟掉了钢颂。你第二次還得再告訴服務(wù)器一遍钞它。

所以在這種情況下出現(xiàn)了,Websocket出現(xiàn)了甸陌。他解決了HTTP的這幾個(gè)難題须揣。首先,被動(dòng)性钱豁,當(dāng)服務(wù)器完成協(xié)議升級(jí)后(HTTP->Websocket)耻卡,服務(wù)端就可以主動(dòng)推送信息給客戶端啦。所以上面的情景可以做如下修改牲尺。

客戶端:啦啦啦卵酪,我要建立Websocket協(xié)議,需要的服務(wù):chat谤碳,Websocket協(xié)議版本:17(HTTP Request)

服務(wù)端:ok溃卡,確認(rèn),已升級(jí)為Websocket協(xié)議(HTTP Protocols Switched)

客戶端:麻煩你有信息的時(shí)候推送給我噢蜒简。瘸羡。

服務(wù)端:ok,有的時(shí)候會(huì)告訴你的搓茬。

服務(wù)端:balabalabalabala

服務(wù)端:balabalabalabala

服務(wù)端:哈哈哈哈哈啊哈哈哈哈

服務(wù)端:笑死我了哈哈哈哈哈哈哈

就變成了這樣犹赖,只需要經(jīng)過一次HTTP請(qǐng)求,就可以做到源源不斷的信息傳送了卷仑。(在程序設(shè)計(jì)中峻村,這種設(shè)計(jì)叫做回調(diào),即:你有信息了再來通知我锡凝,而不是我傻乎乎的每次跑來問你?)

這樣的協(xié)議解決了上面同步有延遲粘昨,而且還非常消耗資源的這種情況。那么為什么他會(huì)解決服務(wù)器上消耗資源的問題呢窜锯?

其實(shí)我們所用的程序是要經(jīng)過兩層代理的张肾,即HTTP協(xié)議在Nginx等服務(wù)器的解析下,然后再傳送給相應(yīng)的Handler(PHP等)來處理锚扎。簡(jiǎn)單地說捌浩,我們有一個(gè)非常快速的接線員(Nginx)工秩,他負(fù)責(zé)把問題轉(zhuǎn)交給相應(yīng)的客服(Handler)尸饺。

本身接線員基本上速度是足夠的进统,但是每次都卡在客服(Handler)了,老有客服處理速度太慢浪听。螟碎,導(dǎo)致客服不夠。Websocket就解決了這樣一個(gè)難題迹栓,建立后掉分,可以直接跟接線員建立持久連接,有信息的時(shí)候客服想辦法通知接線員克伊,然后接線員在統(tǒng)一轉(zhuǎn)交給客戶酥郭。

這樣就可以解決客服處理速度過慢的問題了。

同時(shí)愿吹,在傳統(tǒng)的方式上不从,要不斷的建立,關(guān)閉HTTP協(xié)議犁跪,由于HTTP是非狀態(tài)性的椿息,每次都要重新傳輸identity info(鑒別信息),來告訴服務(wù)端你是誰坷衍。

雖然接線員很快速寝优,但是每次都要聽這么一堆,效率也會(huì)有所下降的枫耳,同時(shí)還得不斷把這些信息轉(zhuǎn)交給客服乏矾,不但浪費(fèi)客服的處理時(shí)間,而且還會(huì)在網(wǎng)路傳輸中消耗過多的流量/時(shí)間迁杨。

但是Websocket只需要一次HTTP握手钻心,所以說整個(gè)通訊過程是建立在一次連接/狀態(tài)中,也就避免了HTTP的非狀態(tài)性仑最,服務(wù)端會(huì)一直知道你的信息,直到你關(guān)閉請(qǐng)求帆喇,這樣就解決了接線員要反復(fù)解析HTTP協(xié)議警医,還要查看identity info的信息。

同時(shí)由客戶主動(dòng)詢問坯钦,轉(zhuǎn)換為服務(wù)器(推送)有信息的時(shí)候就發(fā)送(當(dāng)然客戶端還是等主動(dòng)發(fā)送信息過來的预皇。。)婉刀,沒有信息的時(shí)候就交給接線員(Nginx)吟温,不需要占用本身速度就慢的客服(Handler)了

——————–

至于怎么在不支持Websocket的客戶端上使用Websocket。突颊。答案是:不能

但是可以通過上面說的long poll和ajax 輪詢來 模擬出類似的效果

——————–

內(nèi)容轉(zhuǎn)自知乎:http://www.zhihu.com/question/20215561

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末鲁豪,一起剝皮案震驚了整個(gè)濱河市潘悼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌爬橡,老刑警劉巖治唤,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異糙申,居然都是意外死亡宾添,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門柜裸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來缕陕,“玉大人,你說我怎么就攤上這事疙挺】敢兀” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵衔统,是天一觀的道長(zhǎng)鹿榜。 經(jīng)常有香客問我,道長(zhǎng)锦爵,這世上最難降的妖魔是什么舱殿? 我笑而不...
    開封第一講書人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮险掀,結(jié)果婚禮上沪袭,老公的妹妹穿的比我還像新娘。我一直安慰自己樟氢,他們只是感情好冈绊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著埠啃,像睡著了一般死宣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碴开,一...
    開封第一講書人閱讀 51,698評(píng)論 1 305
  • 那天毅该,我揣著相機(jī)與錄音,去河邊找鬼潦牛。 笑死眶掌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巴碗。 我是一名探鬼主播朴爬,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼橡淆!你這毒婦竟也來了召噩?” 一聲冷哼從身側(cè)響起母赵,我...
    開封第一講書人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蚣常,沒想到半個(gè)月后市咽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡抵蚊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年施绎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞绳。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谷醉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冈闭,到底是詐尸還是另有隱情俱尼,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布萎攒,位于F島的核電站遇八,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏耍休。R本人自食惡果不足惜刃永,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羊精。 院中可真熱鬧斯够,春花似錦、人聲如沸喧锦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽燃少。三九已至束亏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阵具,已是汗流浹背碍遍。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留怔昨,地道東北人雀久。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓宿稀,卻偏偏與公主長(zhǎng)得像趁舀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子祝沸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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

  • 我想分享一種感覺矮烹,就是之前許愿的時(shí)候 是 我要越庇。。奉狈。 感覺是自我打氣卤唉。 然后最近想到一件事的時(shí)候,會(huì)覺得 哦仁期,不用...
    信時(shí)光閱讀 311評(píng)論 0 0
  • 誰也不能否認(rèn)桑驱,只有夏呂斯男爵才能這樣傲嬌。文學(xué)史上再也找不出另一個(gè)男同志夏呂斯了跛蛋。文學(xué)作品中的“典型人物”并不是刻...
    小婦阿達(dá)閱讀 178評(píng)論 0 0
  • 依然處于平倉狀態(tài)熬的。跟著機(jī)構(gòu)投的錢已將我前兩周辛苦賺來的全陪了進(jìn)去。開始讓我愈發(fā)覺得以后需要自己全盤操作……可惜資金...
    道二十三閱讀 170評(píng)論 0 0
  • 簡(jiǎn)介 CoreGraphics是UIKit下的主要繪圖系統(tǒng)赊级,頻繁的用于繪制自定義視圖押框。Core Graphics是...
    Carson_Zhu閱讀 944評(píng)論 0 0
  • 耗盡大量的時(shí)間和精力,去傾盡全力的拼命理逊,有時(shí)那最后一刻勝利的榮譽(yù)就是喜歡帶著你那迫切期待或胸有成竹的小眼神橡伞,從你身...
    羔羊呀閱讀 236評(píng)論 0 2