WebSocket是什么原理?為什么可以實(shí)現(xiàn)持久連接?
首先需要明白:基于TCP的應(yīng)用層協(xié)議 , 只要設(shè)計(jì)者愿意 , 都是可以實(shí)現(xiàn)持久連接的 。你問的方式 , 大概是在和HTTP做比較 。HTTPhttp協(xié)議是請(qǐng)求應(yīng)答式的文本協(xié)議 , 協(xié)議設(shè)計(jì)就是Client-Server模式 , 出發(fā)點(diǎn)是服務(wù)端為客戶端提供資源 。http服務(wù)端只能監(jiān)聽和響應(yīng)來自客戶端的請(qǐng)求 , http客戶端只能發(fā)起請(qǐng)求接受響應(yīng) , 這個(gè)是HTTP協(xié)議本身的設(shè)計(jì) , 雙向通信不在設(shè)計(jì)的考慮之內(nèi) 。
關(guān)于Http協(xié)議 , 額外說點(diǎn):HTTP1.0/0.9不支持keep-alive , 要完成一次HTTP請(qǐng)求 , 需要建立一個(gè)新的TCP連接 , 然后發(fā)送http請(qǐng)求 , 待接收響應(yīng)后關(guān)閉連接 。HTTP1.1默認(rèn)使用keep-alive , 一次HTTP請(qǐng)求完成后不會(huì)關(guān)閉TCP連接 , 會(huì)繼續(xù)為下一個(gè)HTTP請(qǐng)求服務(wù)(可以類比數(shù)據(jù)庫連接池和線程池的設(shè)計(jì)) , 減小建立和關(guān)閉TCP連接的開銷(三次握手四次揮手) 。
當(dāng)然閑置超時(shí)后也會(huì)關(guān)閉 。并非樓下所說的“把多個(gè)HTTP請(qǐng)求合并為一個(gè)” 。HTTP協(xié)議的設(shè)計(jì)無法實(shí)現(xiàn)對(duì)TCP通道的分用和復(fù)用 。因?yàn)镠TTP協(xié)議沒有請(qǐng)求的唯一標(biāo)記(僅僅是URL是不行的 , 原因大家想)用來從同一TCP通道分離不同的HTTP消息 , 所以一個(gè)完整的HTTP請(qǐng)求在發(fā)送請(qǐng)求到響應(yīng)回來之間是獨(dú)占一個(gè)TCP通道的!是不是覺得HTTP對(duì)TCP的利用率太低了?而關(guān)于pipeline模式 , 不管在服務(wù)端還是客戶端排隊(duì) , HTTP響應(yīng)依然要通過進(jìn)入服務(wù)端隊(duì)列的順序返回 , 這樣才能和客戶端HTTP請(qǐng)求隊(duì)列用順序做對(duì)應(yīng)!所以pipeline模式某個(gè)請(qǐng)求被服務(wù)端因?yàn)槟承┰蜃枞说那闆r下 , 后續(xù)請(qǐng)求都會(huì)阻塞 , 會(huì)引起很大的問題 , 實(shí)際上很少用 。
瀏覽器或者一般HTTP客戶端組件為某一個(gè)服務(wù)器端點(diǎn)(域名 端口)保留4-6條活躍TCP連接 。你可以F12觀察瀏覽器 , 看看同時(shí)是幾個(gè)請(qǐng)求阻塞了就知道你的瀏覽器設(shè)置的多少 。比較大的門戶網(wǎng)站 , 比如京東 , 首頁請(qǐng)求非常多 , 但是大量都需要排隊(duì)等TCP空閑 。限制客戶端的連接數(shù)量的出發(fā)點(diǎn)主要是性能 , 否則會(huì)占用服務(wù)器太多Socket資源(考慮socket預(yù)留的讀寫緩沖區(qū) , windows的內(nèi)核對(duì)象或者linux的文件句柄)或者變相地造成DoS攻擊 。
Tips:HTTP客戶端組件一般會(huì)提供諸如ConnectionLimit的選項(xiàng)讓你控制最大TCP連接數(shù) 。如果你是桌面客戶端 , 或者請(qǐng)求遠(yuǎn)程服務(wù) , 不宜設(shè)置過大 。如果你是內(nèi)部服務(wù)之間調(diào)用 , 可以根據(jù)需求合理設(shè)置以增加并發(fā)性能 。HTTP2.0針對(duì)以上的問題(主要是性能)做了很多改進(jìn) , 這個(gè)也會(huì)提高很多人在后端不同服務(wù)器之間做通信時(shí)選擇HTTP(我在HTTP2.0出來之前就是自己設(shè)計(jì)RPC方案) 。
詳細(xì)的HTTP2.0的東西 , 這里不展開了 , 詳細(xì)參考官方文檔 。HTTP相關(guān)知識(shí)推薦《HTTP權(quán)威指南》以及相關(guān)的RFC文檔 , 盡量少去看博客上面支離破碎的小知識(shí) , 體系化的認(rèn)知結(jié)構(gòu)對(duì)你幫助更大 。WebSocketWebSocket的出現(xiàn) , 就是為了解決http協(xié)議不支持雙向通信的缺口 。所以WebSocket的握手協(xié)議就是使用的HTTP消息來Upgrade 。
【看完讓你徹底搞懂Websocket原理,websocket和http的區(qū)別】現(xiàn)代的Web場(chǎng)景 , 服務(wù)端推送的需求非常大 , 這個(gè)發(fā)展過程中使用的Ajax輪詢 , Comet等都只是臨時(shí)解決方案 , 從設(shè)計(jì)上看 , 只為滿足需求 , 一點(diǎn)都不優(yōu)雅 。Html5規(guī)范將WebSocket納入后 , 得到了現(xiàn)代幾乎所有瀏覽器的支持 , 當(dāng)然IE(10 才支持)仍然是一個(gè)巨坑 , 在乎用戶覆蓋面的產(chǎn)品依然要通過瀏覽器是否支持ws來做出降級(jí)處理(輪詢、長(zhǎng)連接) 。
推薦閱讀
- 讓你的電腦無所不能,電腦安全防護(hù)軟件排行
- sss周星宇戰(zhàn)歌是什么,讓你代管新兵連
- Bootlin,linux源碼
- 關(guān)于系統(tǒng)的兩個(gè)問題
- 讓你知道堅(jiān)果Pro
- 比熊小時(shí)候怎么看顏值,帶你看完比熊犬的一生
- 姚明到底有多高?官方2米26,看完這些照片后你信嗎?
- 數(shù)據(jù)分析方法有哪幾種,徹底講透數(shù)據(jù)分析
- 一小時(shí)讓你了解時(shí)間管理,如何正確認(rèn)識(shí)時(shí)間管理答案
- 看完堅(jiān)果PRO發(fā)布會(huì)后
