與http協(xié)議區(qū)別:
http是需要客戶(hù)端發(fā)送一個(gè)請(qǐng)求之后趣倾,服務(wù)器才回一個(gè)response給客戶(hù)端,即“一個(gè)request對(duì)應(yīng)一個(gè)response”,雖然http是基于全雙工的tcp協(xié)議而定制的,但是http協(xié)議確實(shí)沒(méi)做到真正的全雙工挂谍!假設(shè)在客戶(hù)端沒(méi)發(fā)送一個(gè)http的request給服務(wù)器而服務(wù)器卻首先發(fā)送一個(gè)response給客戶(hù)端的話(huà)琢岩,那么客戶(hù)端是沒(méi)法接受這個(gè)response的!網(wǎng)上很多人覺(jué)得這個(gè)很不好迷帜,其實(shí)嘛,我倒是覺(jué)得這是一種保護(hù)客戶(hù)端的舉措色洞,試想戏锹,如果客戶(hù)端在沒(méi)發(fā)起請(qǐng)求的時(shí)候反而隨便接受來(lái)自服務(wù)器可以的東西,那么火诸,這是很容易造成不法分子的攻擊的=跽搿(至于怎么攻擊,你可以想象淘寶店知道了你的地址之后給你整天寄‘有害’的快遞的話(huà)置蜀,你會(huì)舒服么奈搜?)
但是,有些場(chǎng)景非常需要服務(wù)器自己發(fā)送數(shù)據(jù)給客戶(hù)的盯荤!但是鑒于上面的攻擊問(wèn)題馋吗,我們有沒(méi)有一種好的解決方式呢?有的秋秤,那就是通過(guò)websocket協(xié)議來(lái)實(shí)現(xiàn)宏粤,那么websocket協(xié)議到底是怎么實(shí)現(xiàn)的呢?我們都知道灼卢,http中一個(gè)request對(duì)應(yīng)一個(gè)response绍哎,但是如果我們這樣:一個(gè)http對(duì)應(yīng)多個(gè)response,比如:股票網(wǎng)站需要實(shí)時(shí)刷新網(wǎng)站上面的數(shù)據(jù)鞋真,刷新的時(shí)間基本是基于毫秒的崇堰!此時(shí)的http的一個(gè)request對(duì)應(yīng)一個(gè)response就不適用了,試想,有哪個(gè)客戶(hù)為了刷新股票數(shù)據(jù)然后就去不停的手動(dòng)點(diǎn)擊發(fā)起request來(lái)接受服務(wù)端的response海诲,所以我們此時(shí)希望服務(wù)端智能一點(diǎn)繁莹,我們希望我們只需要點(diǎn)擊一次網(wǎng)頁(yè)就能夠不停的給我刷新網(wǎng)頁(yè),當(dāng)然服務(wù)器也不是閑著蛋疼不停的給你發(fā)送response饿肺,畢竟這樣消耗的資源太大了蒋困,我們?yōu)榱斯?jié)省資源同時(shí)也是合乎邏輯的決定:當(dāng)且僅你請(qǐng)求的數(shù)據(jù)在服務(wù)器有更新的時(shí)候,服務(wù)器才會(huì)給你發(fā)送更新后的數(shù)據(jù)敬辣,而不是不停的給客戶(hù)端發(fā)送沒(méi)更新的數(shù)據(jù)雪标。這個(gè)跟上面的攻擊就有很明顯的不同了,首先溉跃,客戶(hù)端事先需要發(fā)起一次http協(xié)議村刨,然后服務(wù)端在有數(shù)據(jù)更新的時(shí)候才返回更新的數(shù)據(jù)給客戶(hù)端,此時(shí)客戶(hù)端接受到更新數(shù)據(jù)渲染在頁(yè)面中去撰茎,然后繼續(xù)等待服務(wù)器再一次新的數(shù)據(jù)(此時(shí)不用再發(fā)送http的request請(qǐng)求了)嵌牺,從這里可以看出,其實(shí)websocket協(xié)議更像是基于tcp/ip的http的變種而已龄糊,而已還基于一次的http請(qǐng)求逆粹。離開(kāi)了http請(qǐng)求的話(huà),websocket協(xié)議也是不能運(yùn)作的炫惩!但是他不是基于http協(xié)議僻弹,因?yàn)楦鷋ttp協(xié)議有著本值的區(qū)別,他只是順便利用了一次http協(xié)議而已他嚷!之后的多次response都會(huì)由服務(wù)器自動(dòng)返回給客戶(hù)端蹋绽。
websocket完美的解決了上面的攻擊問(wèn)題和http協(xié)議的不足!
與tcp的區(qū)別:
說(shuō)實(shí)話(huà)我想不到跟tcp有什么特別的相像之處,他們完全是不同層面的東西,tcp在七層模型的網(wǎng)絡(luò)層,http和websocket都在七層模型的會(huì)話(huà)層,websockt確實(shí)只需要一次request,但是他確實(shí)不是一次"握手"就可以了,但是在這里使用握手真的合適么?我們都知道tcp才有握手之說(shuō),但是某些博文硬生生說(shuō)出了握手這個(gè)詞,我的天!!
注意這里他們所說(shuō)的握手跟tcp的三次握手四次揮手完全不是一個(gè)東西,我之前看其他博文看到只需要一次握手的websocket,剛開(kāi)始時(shí)候我以為網(wǎng)絡(luò)要逆天了?結(jié)果卻是這么一個(gè)東西,不過(guò)這個(gè)協(xié)議確實(shí)在某些場(chǎng)合還是很有用的!我看到招聘網(wǎng)上寫(xiě)了Django+Daphne,然后順著Daphne才找到了這個(gè)websocket協(xié)議,看了下博文,發(fā)現(xiàn)很多誤解,于是就發(fā)了這篇博文做解釋!-
接下來(lái)放上幾張七層網(wǎng)絡(luò)和五層(或者四層)網(wǎng)絡(luò)的圖,當(dāng)然我一般不喜歡分為5層,一般都是分為4層,也就是合并最下面的2層:
image.png
image.png
image.png
image.png