Websocket 協議解析

來源:互聯網
上載者:User

標籤:

Websocket 協議解析Web後端開發 2015-05-06

WebSocket protocol 是HTML5一種新的協議。它是實現了瀏覽器與伺服器全雙工系統通訊(full-duplex)。這篇文章介紹了關於Websocket 協議的相關資訊,供大家參考。

現很多網站為了實現即時通訊,所用的技術都是輪詢(polling)。輪詢是在特定的的時間間隔(如每1秒),由瀏覽器對伺服器發出HTTP request,然後由伺服器返回最新的資料給客服端的瀏覽器。這種傳統的HTTP request 的模式帶來很明顯的缺點 – 瀏覽器需要不斷的向伺服器發出請求,然而HTTP request 的header是非常長的,裡麵包含的資料可能只是一個很小的值,這樣會佔用很多的頻寬。

而最比較新的技術去做輪詢的效果是Comet – 用了AJAX。但這種技術雖然可達到全雙工系統通訊,但依然需要發出請求。

在 WebSocket API,瀏覽器和伺服器只需要要做一個握手的動作,然後,瀏覽器和伺服器之間就形成了一條快速通道。兩者之間就直接可以資料互相傳送,改變了原有的B/S模式。

在這裡是關於Websocket在 php 中的實現,這篇文章裡,我主要對websocket 協議進行一個簡單的介紹。

Websocket 業務模型

瀏覽器端的websocket 請求一般是

// javacsript

var ws = new WebSocket("ws://127.0.0.1:4000");

ws.onopen = function(){

console.log("succeed");

};

ws.onerror = function(){

console.log(“error”);

};

ws.onmessage = function(e){

console.log(e);

}

當 new 一個 websocket 對象之後,就會向伺服器發送一個 get 請求

這個請求是對摸個伺服器的連接埠發送的,一般的話,會預先在伺服器將一個socket 綁定到一個連接埠上,用戶端和伺服器端在這個預定的連接埠上通訊(我這裡綁定的就是 4000 連接埠,預設情況下,websocke 使用 80 連接埠)。

然後,在伺服器端的socket監聽到這個packet 之後就產生一個新的 socket,將發送過來的資料中的 Sec-WebSocket-Key 解析出來,然後按照把“Sec-WebSocket-Ke”加上一個魔幻字串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”。使用SHA-1加密,之後進行BASE-64編碼,將結果做為“Sec-WebSocket-Accept”頭的值,返回給用戶端。

用戶端收到這個之後,就會將 通訊協定 upgrade 到 websocket 協議。

然後就會在這個持久的通道下進行通訊,包括瀏覽器的詢問,伺服器的push,雙方是在一個全雙工系統的狀態下相互連信。 切換後的websocket 協議中的 資料轉送幀的格式(此時不再使用html協議) 官方文檔給出的說明:

直接看這個,誰都會有點頭大: 我花了一幅圖來簡單的解釋這個 frame 的結構。

各欄位的解釋:

FIN              1bit 表示資訊的最後一幀,flag,也就是標記符

RSV 1-3        1bit each 以後備用的 預設都為 0

Opcode         4bit 框架類型,

Mask              1bit 掩碼,是否加密資料,預設必須置為1

Payload len   7bit 資料的長度,當這個7 bit的資料 == 126 時,後面的2 個位元組也是表示數     據長度,當它 == 127 時,後面的 8 個位元組表示資料長度Masking-key      1 or 4 bit 掩碼Payload data  playload len  bytes 資料

所以我們這裡的代碼,通過判斷 Playload len的值,來用 substr 截取 Masking-key 和 PlayloadData。

根據掩碼解析資料的方法是:

for( i = 0; i < data.length ; i++){

orginalData += data[i]  ^  maskingKey[i mod 4];

}

在PHP中,當我們收到資料之後,按照這裡的格式截取資料,並將其按照這裡的方法解析後就得到了瀏覽器發送過來的資料。 當我們想把資料發送給瀏覽器時,也要按照這個格式組裝frame。 這裡是我的方法:

function frame($s){

$a = str_split($s, 125);

if (count($a) == 1){

return "\x81" . chr(strlen($a[0])) . $a[0];

}

$ns = "";

foreach ($a as $o){

$ns .= "\x81" . chr(strlen($o)) . $o;

}

return $ns;

}

強行將要發送的資料分割成 125 Byte / frame,這樣 playload len 只需要 7 bits。也就是直接將資料的長度的ascall碼拼接上去,然後後面跟上要發送的資料。 每一個 frame 前面加的 ‘\x81’ 用二進位就是: 1000 0001 1000 :

1 是 FIN

000 是三個備用的bit

0001 : 指的是 opcode 官方的解釋:

可以設定 opcode的值,來告訴瀏覽器這個frame的資料屬性。

以上就是精品學習網為大家提供的關於Websocket 協議的相關內容,希望能夠協助到大家。

Websocket 協議解析

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.