WebSocket

一绿语、WebSocket是HTML5出的東西(協(xié)議),也就是說HTTP協(xié)議沒有變化睡陪,或者說沒關(guān)系掺涛,但HTTP是不支持持久連接的(長連接庭敦,循環(huán)連接的不算)首先HTTP有1.1和1.0之說,也就是所謂的keep-alive鸽照,把多個(gè)HTTP請求合并為一個(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ù)号杏,就是這樣=。=再簡單來說斯棒,層級不一樣盾致。
二、Websocket是什么樣的協(xié)議荣暮,具體有什么優(yōu)點(diǎn)首先庭惜,Websocket是一個(gè)持久化的協(xié)議,相對于HTTP這種非持久的協(xié)議來說穗酥。
簡單的舉個(gè)例子吧护赊,用目前應(yīng)用比較廣泛的PHP生命周期來解釋惠遏。

  1. HTTP的生命周期通過Request來界定,也就是一個(gè)Request 一個(gè)Response骏啰,那么HTTP1.0爽哎,這次HTTP請求就結(jié)束了。在HTTP1.1中進(jìn)行了改進(jìn)器一,使得有一個(gè)keep-alive,也就是說厨内,在一個(gè)HTTP連接中祈秕,可以發(fā)送多個(gè)Request,接收多個(gè)Response雏胃。但是請記住 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é)議來完成一部分握手贾节。在握手階段是一樣的-------以下涉及專業(yè)技術(shù)內(nèi)容,不想看的可以跳過lol:衷畦,或者只看加黑內(nèi)容--------首先我們來看個(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é)議的握手請求中斤程,多了幾個(gè)東西。我會(huì)順便講解下作用铛嘱。Upgrade: websocketConnection: Upgrade

這個(gè)就是Websocket的核心了暖释,告訴Apache、Nginx等服務(wù)器:注意啦墨吓,窩發(fā)起的是Websocket協(xié)議球匕,快點(diǎn)幫我找到對應(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é)議。簡單理解:今晚我要服務(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)接受到請求筋岛, 成功建立Websocket啦!HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=Sec-WebSocket-Protocol: chat

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

依然是固定的,告訴客戶端即將升級的是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í)信息傳遞么皆撩。
你TMD又BBB了這么久扣墩,那到底Websocket有什么鬼用,http long poll扛吞,或者ajax輪詢不都可以實(shí)現(xiàn)實(shí)時(shí)信息傳遞么沮榜。

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

三草巡、Websocket的作用在講Websocket之前守呜,我就順帶著講下 long poll 和 ajax輪詢 的原理。首先是 ajax輪詢 山憨,ajax輪詢 的原理非常簡單查乒,讓瀏覽器隔個(gè)幾秒就發(fā)送一次請求,詢問服務(wù)器是否有新信息郁竟。場景再現(xiàn):客戶端:啦啦啦玛迄,有沒有新信息(Request)服務(wù)端:沒有(Response)客戶端:啦啦啦,有沒有新信息(Request)服務(wù)端:沒有棚亩。蓖议。(Response)客戶端:啦啦啦,有沒有新信息(Request)服務(wù)端:你好煩啊讥蟆,沒有啊勒虾。。(Response)客戶端:啦啦啦瘸彤,有沒有新消息(Request)服務(wù)端:好啦好啦修然,有啦給你。(Response)客戶端:啦啦啦质况,有沒有新消息(Request)服務(wù)端:愕宋。。结榄。中贝。。沒潭陪。雄妥。最蕾。。沒老厌。瘟则。。沒有(Response) ---- loop
long polllong poll 其實(shí)原理跟 ajax輪詢 差不多枝秤,都是采用輪詢的方式醋拧,不過采取的是阻塞模型(一直打電話,沒收到就不掛電話)淀弹,也就是說丹壕,客戶端發(fā)起連接后,如果沒消息薇溃,就一直不返回Response給客戶端菌赖。直到有消息才返回,返回完之后沐序,客戶端再次建立連接琉用,周而復(fù)始。場景再現(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ā)起已艰。簡單地說就是,服務(wù)器是一個(gè)很懶的冰箱(這是個(gè)梗)(不會(huì)蚕苇、不能主動(dòng)發(fā)起連接)哩掺,但是上司有命令,如果有客戶來涩笤,不管多么累都要好好接待嚼吞。
說完這個(gè)盒件,我們再來說一說上面的缺陷(原諒我廢話這么多吧OAQ)從上面很容易看出來,不管怎么樣舱禽,上面這兩種都是非常消耗資源的炒刁。ajax輪詢 需要服務(wù)器有很快的處理速度和資源。(速度)long poll 需要有很高的并發(fā)誊稚,也就是說同時(shí)接待客戶的能力翔始。(場地大小)所以ajax輪詢 和long poll 都有可能發(fā)生這種情況里伯。
客戶端:啦啦啦啦城瞎,有新信息么?****服務(wù)端:月線正忙疾瓮,請稍后再試(503 Server Unavailable)****客戶端:脖镀。。狼电。认然。好吧,啦啦啦漫萄,有新信息么?****服務(wù)端:月線正忙盈匾,請稍后再試(503 Server Unavailable)****客戶端:

然后服務(wù)端在一旁忙的要死:冰箱腾务,我要更多的冰箱!更多削饵。岩瘦。更多。窿撬。(我錯(cuò)了启昧。。這又是梗劈伴。密末。)
--------------------------言歸正傳,我們來說Websocket吧通過上面這個(gè)例子跛璧,我們可以看出严里,這兩種方式都不是最好的方式,需要很多資源追城。一種需要更快的速度刹碾,一種需要更多的'電話'。這兩種都會(huì)導(dǎo)致'電話'的需求越來越高座柱。哦對了迷帜,忘記說了HTTP還是一個(gè)無狀態(tài)協(xié)議物舒。(感謝評論區(qū)的各位指出OAQ)通俗的說就是,服務(wù)器因?yàn)槊刻煲哟嗫蛻袅讼非拢莻€(gè)健忘鬼冠胯,你一掛電話,他就把你的東西全忘光了景用,把你的東西全丟掉了涵叮。你第二次還得再告訴服務(wù)器一遍。
所以在這種情況下出現(xiàn)了伞插,Websocket出現(xiàn)了割粮。他解決了HTTP的這幾個(gè)難題。首先媚污,被動(dòng)性舀瓢,當(dāng)服務(wù)器完成協(xié)議升級后(HTTP->Websocket),服務(wù)端就可以主動(dòng)推送信息給客戶端啦耗美。所以上面的情景可以做如下修改京髓。客戶端:啦啦啦商架,我要建立Websocket協(xié)議堰怨,需要的服務(wù):chat,Websocket協(xié)議版本:17(HTTP Request)服務(wù)端:ok蛇摸,確認(rèn)备图,已升級為Websocket協(xié)議(HTTP Protocols Switched)客戶端:麻煩你有信息的時(shí)候推送給我噢。赶袄。服務(wù)端:ok揽涮,有的時(shí)候會(huì)告訴你的。服務(wù)端:balabalabalabala服務(wù)端:balabalabalabala服務(wù)端:哈哈哈哈哈啊哈哈哈哈服務(wù)端:笑死我了哈哈哈哈哈哈哈
就變成了這樣饿肺,只需要經(jīng)過一次HTTP請求蒋困,就可以做到源源不斷的信息傳送了。(在程序設(shè)計(jì)中敬辣,這種設(shè)計(jì)叫做回調(diào)膘滨,即:你有信息了再來通知我碌更,而不是我傻乎乎的每次跑來問你)這樣的協(xié)議解決了上面同步有延遲迫筑,而且還非常消耗資源的這種情況无埃。那么為什么他會(huì)解決服務(wù)器上消耗資源的問題呢?其實(shí)我們所用的程序是要經(jīng)過兩層代理的喊积,即HTTP協(xié)議在Nginx等服務(wù)器的解析下烹困,然后再傳送給相應(yīng)的Handler(PHP等)來處理。簡單地說乾吻,我們有一個(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)閉請求,這樣就解決了接線員要反復(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 輪詢來 模擬出類似的效果

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市踏志,隨后出現(xiàn)的幾起案子阀捅,更是在濱河造成了極大的恐慌,老刑警劉巖针余,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饲鄙,死亡現(xiàn)場離奇詭異,居然都是意外死亡圆雁,警方通過查閱死者的電腦和手機(jī)忍级,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摸柄,“玉大人颤练,你說我怎么就攤上這事∏海” “怎么了嗦玖?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長跃脊。 經(jīng)常有香客問我宇挫,道長,這世上最難降的妖魔是什么酪术? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任器瘪,我火速辦了婚禮,結(jié)果婚禮上绘雁,老公的妹妹穿的比我還像新娘橡疼。我一直安慰自己,他們只是感情好庐舟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布欣除。 她就那樣靜靜地躺著,像睡著了一般挪略。 火紅的嫁衣襯著肌膚如雪历帚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天杠娱,我揣著相機(jī)與錄音挽牢,去河邊找鬼。 笑死摊求,一個(gè)胖子當(dāng)著我的面吹牛禽拔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奏赘,長吁一口氣:“原來是場噩夢啊……” “哼寥闪!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起磨淌,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤疲憋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后梁只,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缚柳,經(jīng)...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年搪锣,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秋忙。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,926評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡构舟,死狀恐怖灰追,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情狗超,我是刑警寧澤弹澎,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站努咐,受9級特大地震影響苦蒿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜渗稍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一佩迟、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧竿屹,春花似錦报强、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至扼雏,卻和暖如春坚嗜,著一層夾襖步出監(jiān)牢的瞬間夯膀,已是汗流浹背诗充。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诱建,地道東北人蝴蜓。 一個(gè)月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親茎匠。 傳聞我的和親對象是個(gè)殘疾皇子格仲,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,871評論 2 354

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