websocket的原理及作用是什么

本篇內(nèi)容介紹了“websocket的原理及作用是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

堅守“ 做人真誠 · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都成都雨棚定制小微創(chuàng)業(yè)公司專業(yè)提供成都定制網(wǎng)站營銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺設(shè)計、底層架構(gòu)、網(wǎng)頁布局、功能開發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。

首先我們看一下websocket的出現(xiàn)背景,我們知道http系列協(xié)議是建立在tcp上的,理論上,他是可以可以雙向通信的。但是http1.1之前,服務(wù)器沒有實現(xiàn)推送的功能。每次都是客戶端請求,服務(wù)器響應(yīng)。下面看一下http協(xié)議關(guān)于請求處理的發(fā)展。

  1. http1.0的時候,一個http請求的生命周期是客戶端發(fā)起請求,服務(wù)器響應(yīng),斷開連接。但是我們知道tcp協(xié)議的缺點就是,三次握手需要時間,再加上慢開始等特性,每一個http請求都這樣的話,效率就很低。

  2. http1.1的時候,默認開啟了長連接(客戶端請求中設(shè)置了keep-alive頭),服務(wù)器處理一個請求后,不會立刻關(guān)閉連接,而是會等待一定的時間。如果沒有請求才關(guān)閉連接。這樣瀏覽器不僅可以在一個tcp連接中,不斷地發(fā)送請求(服務(wù)器也會限制一個連接上可以處理的請求閾值),甚至可以一次發(fā)很多個請求。這就是http1.1的管道化(pipeline)技術(shù)。但是他也有個問題,因為對于基于http協(xié)議的客戶端來說,雖然他可以發(fā)很多請求出去,但是當一個請求對于的回包回來時,他卻無法分辨是屬于哪個請求的。所以回包只能按請求順序返回,這就引來了另一個問題-線頭阻塞(Head-of-Link Blocking)。并且http1.1雖然支持長連接,但是他不支持服務(wù)端推送(push)的能力。如果服務(wù)器有數(shù)據(jù)要給客戶端,也只能等著客戶端來?。╬ull)。

  3. 來到了http2.0,不僅實現(xiàn)了服務(wù)器推送,還使用了幀(iframe),流(stream)等技術(shù)解決了線頭阻塞的問題,http2.0在一個tcp連接中,可以同時發(fā)送多個http請求,每個請求是一個流,一個流可以分成很多幀,有了標記號,服務(wù)器可以隨便發(fā)送回包,客戶端收到后,根據(jù)標記,重新組裝就可以。

    以上是http協(xié)議的關(guān)于請求的一些發(fā)展,而websocket就服務(wù)端推送提供了另外一種解決方案。他本質(zhì)上是在tcp協(xié)議上封裝的另一種應(yīng)用層協(xié)議(websocket協(xié)議)。因為他是基于tcp的,所以服務(wù)端推送自然不是什么難題。但是在實現(xiàn)上,他并不是直接連接一個tcp連接,然后在上面?zhèn)鬏敾趙ebsocket協(xié)議的數(shù)據(jù)包。他涉及到一個協(xié)議升級(交換)的過程。我們看看這個過程。

1 客戶端發(fā)送協(xié)議升級的請求。在http請求加上下面的http頭

Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: k1kbxGRqGIBD5Y/LdIFwGQ==
Sec-WebSocket-Version: 13
Upgrade: websocket
 

2 服務(wù)器如果支持websocket協(xié)議的話,會返回101狀態(tài)碼表示同意協(xié)議升級,并且支持各種配置(如果服務(wù)器不支持某些功能或版本,或告訴客戶端,客戶端可以再次發(fā)送協(xié)議升級的請求)。服務(wù)會返回形如下面的http頭(可以參考websocket協(xié)議)。

Connection: Upgrade
Sec-WebSocket-Accept: y73KZR4t+hqD6KKYbkx2tULfBsQ=
Upgrade: websocket
 

3 這樣就完成了協(xié)議的升級,后續(xù)的數(shù)據(jù)通信,就是基于tcp連接之上,使用websocket協(xié)議封裝的數(shù)據(jù)包。

下面我們通過wireshark來了解這個過程。首先我們啟動一個服務(wù)器(ip:192.168.8.226)。

var http = require('http');
var fs = require('fs');
const WebSocket = require('ws');
// 如果在瀏覽器控制臺進行測試,可以不起http服務(wù)器
const server = http.createServer(options,function(req,res){
    res.end(fs.readFileSync(`${__dirname}/websocket.html`));
}).listen(11111);

const wss = new WebSocket.Server({ server }); 
wss.on('connection', function connection(ws) {
  ws.on('message', function(message) {
    ws.send(message);
  });

  ws.send('get it');
});
 

我們可以直接在瀏覽器控制臺進行測試

var ws = new WebSocket("ws://192.168.8.226:11111");
// 連接上后執(zhí)行
ws.send(11)
 

這時候,我們看看wireshark的包。

websocket的原理及作用是什么  

首先看前面三條記錄,這是tcp三次握手的數(shù)據(jù)包。這個我們都了解了,就不展示。接著看第四條記錄。展開后如下。  
 
websocket的原理及作用是什么  

我們看到建立tcp連接后,瀏覽器發(fā)了一個http請求,并帶上了幾個websocket的數(shù)據(jù)包。接著看下面的一條。  
 
websocket的原理及作用是什么  

服務(wù)返回了同意升級協(xié)議或者說交換協(xié)議。從服務(wù)器代碼中我們看到,在建立連接的時候我們給瀏覽器推送了一個get it的字符串。繼續(xù)看上面的記錄。  
 
websocket的原理及作用是什么  

這就是服務(wù)器給瀏覽器推送的基于websocket協(xié)議的數(shù)據(jù)包。具體每個字段什么意思,參考websocket協(xié)議就可以。繼續(xù)往下看一條記錄是針對服務(wù)器推送的數(shù)據(jù)包的一個tcp的ack。最后我們可以順便看看最后三條寫著keep-alive的記錄。這就是之前文章里講到的tcp層的keep-alive。因為我們一直沒有數(shù)據(jù)傳輸,所以tcp層會間歇性地發(fā)送探測包。我們可以看看探測包的結(jié)構(gòu)。  
 
websocket的原理及作用是什么  

有一個字節(jié)的探測數(shù)據(jù)。如果這時候我們發(fā)送一個數(shù)據(jù)包給服務(wù)器,又是怎樣的呢。  
 
websocket的原理及作用是什么  

白色背景的三條數(shù)據(jù),分別是瀏覽器發(fā)送給服務(wù)器的數(shù)據(jù),服務(wù)器推送回來的數(shù)據(jù)。tcp的ack。我們發(fā)現(xiàn),服務(wù)器給瀏覽器推送的時候,瀏覽器會發(fā)送ack,但是瀏覽器給服務(wù)器發(fā)送的時候,服務(wù)器貌似沒有返回ack。下面我們看看為什么。首先我們看瀏覽器發(fā)出的包。  
 
websocket的原理及作用是什么  

再看看服務(wù)器給瀏覽器推送的數(shù)據(jù)包。  
 
websocket的原理及作用是什么  

我們發(fā)現(xiàn)服務(wù)器(tcp)推送消息的時候把ack也帶上了。而不是發(fā)送兩個tcp包。這就是tcp的機制。tcp不會對每個包都發(fā)ack,他會累積確認(發(fā)ack),以減少網(wǎng)絡(luò)的包,但是他也需要保證盡快地回復(fù)ack,否則就會導(dǎo)致客戶端觸發(fā)超時重傳。tcp什么時候發(fā)送確認呢?比如需要發(fā)送數(shù)據(jù)的時候,或者超過一定時間沒有收到數(shù)據(jù)包,或者累積的確認數(shù)量達到閾值等。既然研究了tcp,我們不妨多研究點,我們看一下,如果這時候關(guān)閉服務(wù)器會怎樣。  
 
websocket的原理及作用是什么  

服務(wù)器會發(fā)送一個重置包給瀏覽器,告訴他需要斷開連接。繼續(xù),如果是瀏覽器自己調(diào)用close去關(guān)閉連接會怎樣。  
 
websocket的原理及作用是什么  

我們看到websocket首先會發(fā)送一個FIN包給服務(wù)器,然后服務(wù)器也會返回一個FIN包,然后才開始真正的四次揮手過程。并且四次揮手的第一個fin包是服務(wù)器發(fā)的。

我們再來看看安全版本的websocket。我們啟動一個https服務(wù)器。

var https = require('https');
var fs = require('fs');
const WebSocket = require('ws');

var options = {
    key: fs.readFileSync('./server-key.pem'),
    ca: [fs.readFileSync('./ca-cert.pem')],
    cert: fs.readFileSync('./server-cert.pem')
};

const server = https.createServer(options,function(req,res){
    res.end(fs.readFileSync(`${__dirname}/websocket.html`));
}).listen(11111);

const wss = new WebSocket.Server({ server });

wss.on('connection', function connection(ws) {
  ws.on('message', function(message) {
    ws.send(message);
  });
});
 

然后在瀏覽器控制臺執(zhí)行。

var ws = new WebSocket("wss://192.168.8.226:11111");
ws.sned(11);
 

然后來看看wireshark。

websocket的原理及作用是什么  

首先建立tcp連接,然后建立tls連接。后續(xù)的數(shù)據(jù)通信就可以基于加密來進行了。不再重復(fù)。后續(xù)分析tls協(xié)議的時候再分析。

經(jīng)過一系列的分析,我們對websocket協(xié)議應(yīng)該有了更多的了解,最后再說一個關(guān)于websocket的點。我們發(fā)現(xiàn)如果在websocket連接上,一直不通信的話,websocket連接所維持的時間是依賴tcp實現(xiàn)的。因為我們發(fā)現(xiàn)tcp層會一直發(fā)送探測包。達到閾值之后,連接就會被斷開。所以我們想維持websocket連接的話,需要自己去發(fā)送心跳包,比如ping,pong。

總結(jié):本文分析了websocket的基本原理,但不涉及協(xié)議的內(nèi)容,如需了解協(xié)議的內(nèi)容,可以參考rfc文檔。

“websocket的原理及作用是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

網(wǎng)站欄目:websocket的原理及作用是什么
分享URL:http://muchs.cn/article6/jogpig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、用戶體驗、網(wǎng)站內(nèi)鏈面包屑導(dǎo)航、商城網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作