柚子快報(bào)邀請(qǐng)碼778899分享:網(wǎng)絡(luò) WebSocket學(xué)習(xí)
柚子快報(bào)邀請(qǐng)碼778899分享:網(wǎng)絡(luò) WebSocket學(xué)習(xí)
一、WebSocket簡(jiǎn)介
WebSocket是一種網(wǎng)絡(luò)傳輸協(xié)議,可以在單個(gè)TCP連接上進(jìn)行全雙工通信,位于OSI(Open System Interconnect的縮寫(xiě),意為開(kāi)放式系統(tǒng)互聯(lián))模型的應(yīng)用層。在2011年由IETF標(biāo)準(zhǔn)化為RFC6455,后由RFC7936補(bǔ)充規(guī)范,Web IDL中的WebSocket API是由W3C標(biāo)準(zhǔn)化的。
二、WebSocket的原理
WebSocket是獨(dú)立的、創(chuàng)建在TCP上的協(xié)議,它通過(guò)HTTP/1.1 協(xié)議的101狀態(tài)碼進(jìn)行握手。允許服務(wù)端主動(dòng)向客戶(hù)端推送數(shù)據(jù),并且在WebSocket API中,瀏覽器和服務(wù)器只需要完成一次握手,二者就可以建立持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。WebSocket協(xié)議規(guī)范將ws(WebSocket)和wss(WebSocket Secure)定義為兩個(gè)新的統(tǒng)一資源標(biāo)識(shí)符(URI)方案,分別對(duì)應(yīng)明文和加密連接。
三、 WebSocket與HTTP相比較
相同:二者都位于OSI模型的應(yīng)用層,并且都依賴(lài)于傳輸層的TCP。
不同:HTTP是單向通信,瀏覽器發(fā)起向服務(wù)器的連接,但是服務(wù)器原先并不知道這次請(qǐng)求連接。
WebSocket是雙向通信,此外,WebSocket還可以在TCP上啟用消息流。TCP單獨(dú)處理字節(jié)流,沒(méi)有固有的消息概念。
聯(lián)系:WebSocket設(shè)計(jì)為通過(guò)80和443端口工作,并支持HTTP代理和中介,從而使其與HTTP兼容。為了實(shí)現(xiàn)兼容性,WebSocket在握手時(shí)使用HTTPUpgrade 頭把HTTP更改為WebSocket。
四、WebSocket的特點(diǎn)以及解決的問(wèn)題
WebSocket 支持 Web?瀏覽器(或其他客戶(hù)端應(yīng)用程序)與 Web 服務(wù)器之間的交互,具有較低的開(kāi)銷(xiāo),以便實(shí)現(xiàn)客戶(hù)端與服務(wù)器的實(shí)時(shí)數(shù)據(jù)傳輸。 服務(wù)器可以通過(guò)標(biāo)準(zhǔn)化的方式來(lái)實(shí)現(xiàn)無(wú)須客戶(hù)端先請(qǐng)求內(nèi)容,并允許消息在保持連接打開(kāi)的同時(shí)進(jìn)行來(lái)回傳遞。通過(guò)這種方式,我們可以在客戶(hù)端和服務(wù)器之間進(jìn)行雙向持續(xù)對(duì)話(huà)。通信通過(guò)TCP的80或443端口完成,這在防火墻阻止非Web網(wǎng)絡(luò)連接的環(huán)境下是有益的。另外,Comet之類(lèi)的技術(shù)會(huì)以非標(biāo)準(zhǔn)化的方式實(shí)現(xiàn)類(lèi)似的雙向通信。
在WebSocket之前,使用Comet可以實(shí)現(xiàn)全雙工通信,但是Comet存在TCP握手和HTTP頭的開(kāi)銷(xiāo),因此對(duì)于小消息來(lái)說(shuō)效率極低。WebSocket旨在解決這些問(wèn)題。
五、WebSocket的優(yōu)點(diǎn)
較少的控制開(kāi)銷(xiāo)。連接創(chuàng)建后,在服務(wù)器和客戶(hù)端之間交換數(shù)據(jù)時(shí),用于協(xié)議控制的數(shù)據(jù)包頭部相對(duì)較小。在不包含擴(kuò)展的情況下,對(duì)于服務(wù)器到客戶(hù)端的內(nèi)容,其頭部大小只有2字節(jié)至10字節(jié)(和數(shù)據(jù)包長(zhǎng)度有關(guān));對(duì)于客戶(hù)端到服務(wù)器的內(nèi)容,此頭部還需額外加上4字節(jié)的掩碼。與每次都要攜帶完整頭部的HTTP請(qǐng)求相比,此項(xiàng)開(kāi)銷(xiāo)有顯著減少。更強(qiáng)的實(shí)時(shí)性。由于協(xié)議是全雙工的,所以服務(wù)器可以隨時(shí)主動(dòng)給客戶(hù)端下發(fā)數(shù)據(jù)。HTTP請(qǐng)求需要等待客戶(hù)端發(fā)起請(qǐng)求,服務(wù)端才能響應(yīng),與其相比,WebSocket的延遲明顯更小。即使和Comet等類(lèi)似的長(zhǎng)輪詢(xún)相比,其也能在短時(shí)間內(nèi)更多次地傳遞數(shù)據(jù)。保持連接狀態(tài)。與HTTP請(qǐng)求不同的是,WebSocket需要先創(chuàng)建連接,這使其成為一種有狀態(tài)的協(xié)議,之后通信時(shí)可以省略部分狀態(tài)信息。而HTTP請(qǐng)求可能需要在每個(gè)請(qǐng)求中都攜帶狀態(tài)信息(如身份認(rèn)證等)。更好的二進(jìn)制支持。WebSocket定義了二進(jìn)制幀,與HTTP請(qǐng)求相比,可以更輕松地處理二進(jìn)制內(nèi)容。支持?jǐn)U展。WebSocket定義了擴(kuò)展,用戶(hù)可以擴(kuò)展協(xié)議,實(shí)現(xiàn)部分自定義的子協(xié)議,如部分瀏覽器支持壓縮等。更好的壓縮效果。與HTTP壓縮相比,WebSocket在適當(dāng)?shù)臄U(kuò)展支持下,可以沿用之前內(nèi)容的上下文,在傳遞類(lèi)似的數(shù)據(jù)時(shí),可以顯著地提高壓縮率。
柚子快報(bào)邀請(qǐng)碼778899分享:網(wǎng)絡(luò) WebSocket學(xué)習(xí)
好文推薦
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。