一序六、websocket與http
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生命周期來解釋。
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é)議來完成一部分握手。
首先我們來看個(gè)典型的 Websocket
握手(借用Wikipedia的拔稳。。)
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
熟悉HTTP的童鞋可能發(fā)現(xiàn)了既棺,這段類似HTTP協(xié)議的握手請求中,多了幾個(gè)東西答捕。我會順便講解下作用蜘欲。
Upgrade: websocket
Connection: Upgrade
這個(gè)就是Websocket的核心了屿衅,告訴 Apache 剧罩、 Nginx 等服務(wù)器:注意啦,我發(fā)起的是Websocket協(xié)議香拉,快點(diǎn)幫我找到對應(yīng)的助理處理~不是那個(gè)老土的HTTP。
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-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ù)器會返回下列東西丘跌,表示已經(jīng)接受到請求昼接, 成功建立Websocket啦!
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
這里開始就是HTTP最后負(fù)責(zé)的區(qū)域了袒啼,告訴客戶纬纪,我已經(jīng)成功切換協(xié)議啦~
Upgrade: websocket
Connection: 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é)議就不在這闡述了拔第。