http长/短轮询和WebSocket 的介绍和比较
生活随笔
收集整理的這篇文章主要介紹了
http长/短轮询和WebSocket 的介绍和比较
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
【1】http協(xié)議介紹
1)介紹:http協(xié)議是請求/響應(yīng)范式的,每個http 響應(yīng)都對應(yīng)一個 http 請求,http協(xié)議是無狀態(tài)的,多個http請求之間是沒有關(guān)系的;
2)http協(xié)議的被動性:在標(biāo)準(zhǔn)的HTTP請求響應(yīng)語義中,瀏覽器發(fā)起請求,服務(wù)器發(fā)送一個響應(yīng),這意味著在瀏覽器發(fā)起新請求前,服務(wù)器不能發(fā)送新信息給客戶端瀏覽器;
【2】http 長輪詢 和 短輪詢 【2.1】http 長輪詢 1)介紹:http 長輪詢是server 收到請求后如果有數(shù)據(jù),立刻響應(yīng)請求;如果沒有數(shù)據(jù) 就會 停留 一段時間,這段時間內(nèi),如果 server 請求的數(shù)據(jù)到達(dá)(如查詢數(shù)據(jù)庫或數(shù)據(jù)的邏輯處理完成),就會立刻響應(yīng);如果這段時間過后,還沒有數(shù)據(jù)到達(dá),則以空數(shù)據(jù)的形式響應(yīng)http請求;若瀏覽器收到的數(shù)據(jù)為空,會再次發(fā)送同樣的http請求到server; 2)http 長輪詢 的缺點:server 沒有數(shù)據(jù)到達(dá)時,http連接會停留一段時間,這會造成服務(wù)器資源浪費; 3)看個荔枝:假設(shè)有 1000個人停留在某個客戶端頁面,等待server端的數(shù)據(jù)更新,那就很有可能服務(wù)器這邊掛著1000個線程,在不停檢測數(shù)據(jù)是否發(fā)生變化,這依然是有問題的;
【2.2】http 短輪詢 1)介紹:http 短輪詢是 server 收到請求 不管是否有數(shù)據(jù)到達(dá)都直接響應(yīng)http 請求;如果瀏覽器收到的數(shù)據(jù)為空,則隔一段時間,瀏覽器又會發(fā)送相同的http請求到server 以獲取數(shù)據(jù)響應(yīng); 2) http 短輪詢的缺點:消息交互的實時性較低(server端到瀏覽器端的數(shù)據(jù)反饋效率低);
【2.3】http 長輪詢 和 短輪詢的異同 1)相同點:當(dāng)server 的數(shù)據(jù)不可達(dá)時,基于http長輪詢和短輪詢 的http請求,都會 停留一段時間; 2)不同點:http長輪詢是在服務(wù)器端的停留,而http 短輪詢是在 瀏覽器端的停留; 3)性能總結(jié):從這里可以看出,不管是長輪詢還是短輪詢,都不太適用于客戶端數(shù)量太多的情況,因為每個服務(wù)器所能承載的TCP連接數(shù)是有上限的,這種輪詢很容易把連接數(shù)頂滿;
【3】WebSocket 1)介紹:WebSocket 是 html5 規(guī)范發(fā)布的新協(xié)議,和 http協(xié)議完全是兩個不同的概念,或者說基本沒關(guān)系;WebSocket 協(xié)議 和 http協(xié)議的唯一聯(lián)系點在于,WebSocket 協(xié)議為了兼容現(xiàn)有瀏覽器的握手規(guī)范而采用了 http協(xié)議中的握手規(guī)范 以建立WebSocket連接; 2)WebSocket協(xié)議:其客戶端與服務(wù)器建立的是 持久連接; 3)WebSocket 解決了 HTTP 的幾個難題 3.1)難題1(http協(xié)議的被動性):采用 WebSocket 協(xié)議后,服務(wù)器可以主動推送消息給客戶端;而不需要客戶端以(長/短)輪詢的方式發(fā)起http請求到server以獲取數(shù)據(jù)更新反饋;這樣一來,客戶端只需要經(jīng)過一次HTTP請求,就可以做到源源不斷的信息傳送了(在程序設(shè)計中,這種設(shè)計叫做回調(diào),即:server 端有信息了再來通知client 端,而不是 client 端 每次都傻乎乎地跑去輪詢server端 是否有消息更新); 3.2)難題2(http協(xié)議的無狀態(tài)性/健忘性):短輪詢是每次http請求前都要建立連接,而長輪詢是相鄰幾次請求前都要建立連接;http請求響應(yīng)完成后,服務(wù)器就會斷開連接,且把連接的信息全都忘記了;所以每次建立連接都要重新傳輸連接上下文(下面有補充),將 client 端的連接上下文來告訴server 端;而 WebSockct只需要一次HTTP 握手,整個通訊過程是建立在一次連接(狀態(tài))中的,server 端會一直推送消息更新反饋到客戶端,直到客戶端關(guān)閉請求,這樣就無需 客戶端為發(fā)送消息而建立不必要的 tcp 連接 和 為了建立tcp連接而發(fā)送不必要的冗余的連接上下文消息; 4)連接上下文補充:連接上下文,如限定客戶端和服務(wù)器平臺的所有頭信息,認(rèn)證屬性,負(fù)載描述等;看個荔枝:
【4】三種通信方式的優(yōu)缺點
【補充】http 長連接(tcp 連接可復(fù)用) 1)介紹:http協(xié)議 目前有兩個版本:1.1 和 1.0;區(qū)別是 1.1支持 長連接(普遍使用http1.1版本),長連接也叫做持久連接(keep-alive);而1.0不支持長連接,在1.0版本下,每個http請求響應(yīng)后都會關(guān)閉tcp連接,下一次http請求會重新建立http連接; 2)http 長連接:多個http 請求共用同一個 tcp 連接,這樣可以減少相鄰多次 http請求導(dǎo)致的 tcp連接建立和關(guān)閉的資源消耗;http1.1 在請求頭和響應(yīng)頭中用 connection 字段標(biāo)識 該http連接是否是 長連接,即connection: keep-alive 表示長連接;而 connection: closed 表明服務(wù)器關(guān)閉tcp 連接; 3)keep-alive:與 connection 相對應(yīng)的是 keep-alive,其屬性有 timeout=30 和 max=5 分別是 兩次 http 請求 保持的時間,max表示這個tcp 連接最多被幾個 http 請求重用;
【2】http 長輪詢 和 短輪詢 【2.1】http 長輪詢 1)介紹:http 長輪詢是server 收到請求后如果有數(shù)據(jù),立刻響應(yīng)請求;如果沒有數(shù)據(jù) 就會 停留 一段時間,這段時間內(nèi),如果 server 請求的數(shù)據(jù)到達(dá)(如查詢數(shù)據(jù)庫或數(shù)據(jù)的邏輯處理完成),就會立刻響應(yīng);如果這段時間過后,還沒有數(shù)據(jù)到達(dá),則以空數(shù)據(jù)的形式響應(yīng)http請求;若瀏覽器收到的數(shù)據(jù)為空,會再次發(fā)送同樣的http請求到server; 2)http 長輪詢 的缺點:server 沒有數(shù)據(jù)到達(dá)時,http連接會停留一段時間,這會造成服務(wù)器資源浪費; 3)看個荔枝:假設(shè)有 1000個人停留在某個客戶端頁面,等待server端的數(shù)據(jù)更新,那就很有可能服務(wù)器這邊掛著1000個線程,在不停檢測數(shù)據(jù)是否發(fā)生變化,這依然是有問題的;
【2.2】http 短輪詢 1)介紹:http 短輪詢是 server 收到請求 不管是否有數(shù)據(jù)到達(dá)都直接響應(yīng)http 請求;如果瀏覽器收到的數(shù)據(jù)為空,則隔一段時間,瀏覽器又會發(fā)送相同的http請求到server 以獲取數(shù)據(jù)響應(yīng); 2) http 短輪詢的缺點:消息交互的實時性較低(server端到瀏覽器端的數(shù)據(jù)反饋效率低);
【2.3】http 長輪詢 和 短輪詢的異同 1)相同點:當(dāng)server 的數(shù)據(jù)不可達(dá)時,基于http長輪詢和短輪詢 的http請求,都會 停留一段時間; 2)不同點:http長輪詢是在服務(wù)器端的停留,而http 短輪詢是在 瀏覽器端的停留; 3)性能總結(jié):從這里可以看出,不管是長輪詢還是短輪詢,都不太適用于客戶端數(shù)量太多的情況,因為每個服務(wù)器所能承載的TCP連接數(shù)是有上限的,這種輪詢很容易把連接數(shù)頂滿;
【3】WebSocket 1)介紹:WebSocket 是 html5 規(guī)范發(fā)布的新協(xié)議,和 http協(xié)議完全是兩個不同的概念,或者說基本沒關(guān)系;WebSocket 協(xié)議 和 http協(xié)議的唯一聯(lián)系點在于,WebSocket 協(xié)議為了兼容現(xiàn)有瀏覽器的握手規(guī)范而采用了 http協(xié)議中的握手規(guī)范 以建立WebSocket連接; 2)WebSocket協(xié)議:其客戶端與服務(wù)器建立的是 持久連接; 3)WebSocket 解決了 HTTP 的幾個難題 3.1)難題1(http協(xié)議的被動性):采用 WebSocket 協(xié)議后,服務(wù)器可以主動推送消息給客戶端;而不需要客戶端以(長/短)輪詢的方式發(fā)起http請求到server以獲取數(shù)據(jù)更新反饋;這樣一來,客戶端只需要經(jīng)過一次HTTP請求,就可以做到源源不斷的信息傳送了(在程序設(shè)計中,這種設(shè)計叫做回調(diào),即:server 端有信息了再來通知client 端,而不是 client 端 每次都傻乎乎地跑去輪詢server端 是否有消息更新); 3.2)難題2(http協(xié)議的無狀態(tài)性/健忘性):短輪詢是每次http請求前都要建立連接,而長輪詢是相鄰幾次請求前都要建立連接;http請求響應(yīng)完成后,服務(wù)器就會斷開連接,且把連接的信息全都忘記了;所以每次建立連接都要重新傳輸連接上下文(下面有補充),將 client 端的連接上下文來告訴server 端;而 WebSockct只需要一次HTTP 握手,整個通訊過程是建立在一次連接(狀態(tài))中的,server 端會一直推送消息更新反饋到客戶端,直到客戶端關(guān)閉請求,這樣就無需 客戶端為發(fā)送消息而建立不必要的 tcp 連接 和 為了建立tcp連接而發(fā)送不必要的冗余的連接上下文消息; 4)連接上下文補充:連接上下文,如限定客戶端和服務(wù)器平臺的所有頭信息,認(rèn)證屬性,負(fù)載描述等;看個荔枝:
【4】三種通信方式的優(yōu)缺點
| 瀏覽器支持 | 幾乎所有現(xiàn)代瀏覽器 | 幾乎所有現(xiàn)代瀏覽器 | IE 10+ Edge Firefox 4+ Chrome 4+ Safari 5+ Opera 11.5+ |
| 服務(wù)器負(fù)載 | 較少的CPU資源,較多的內(nèi)存資源和帶寬資源 | 與傳統(tǒng)輪詢相似,但是占用帶寬較少 | 無需循環(huán)等待(長輪詢),CPU和內(nèi)存資源不以客戶端數(shù)量衡量,而是以客戶端事件數(shù)衡量。三種方式里性能最佳。 |
| 客戶端負(fù)載 | 占用較多的內(nèi)存資源與請求數(shù)。 | 與傳統(tǒng)輪詢相似。 | 同Server-Sent Event。 |
| 延遲 | 非實時,延遲取決于請求間隔。 | 同傳統(tǒng)輪詢。 | 實時。 |
| 實現(xiàn)復(fù)雜度 | 非常簡單。 | 需要服務(wù)器配合,客戶端實現(xiàn)非常簡單。 | 需要Socket程序?qū)崿F(xiàn)和額外端口,客戶端實現(xiàn)簡單。 |
【補充】http 長連接(tcp 連接可復(fù)用) 1)介紹:http協(xié)議 目前有兩個版本:1.1 和 1.0;區(qū)別是 1.1支持 長連接(普遍使用http1.1版本),長連接也叫做持久連接(keep-alive);而1.0不支持長連接,在1.0版本下,每個http請求響應(yīng)后都會關(guān)閉tcp連接,下一次http請求會重新建立http連接; 2)http 長連接:多個http 請求共用同一個 tcp 連接,這樣可以減少相鄰多次 http請求導(dǎo)致的 tcp連接建立和關(guān)閉的資源消耗;http1.1 在請求頭和響應(yīng)頭中用 connection 字段標(biāo)識 該http連接是否是 長連接,即connection: keep-alive 表示長連接;而 connection: closed 表明服務(wù)器關(guān)閉tcp 連接; 3)keep-alive:與 connection 相對應(yīng)的是 keep-alive,其屬性有 timeout=30 和 max=5 分別是 兩次 http 請求 保持的時間,max表示這個tcp 連接最多被幾個 http 請求重用;
總結(jié)
以上是生活随笔為你收集整理的http长/短轮询和WebSocket 的介绍和比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js解析json数组+java对象转js
- 下一篇: 基于openfire源码开发插件