[INet] WebSocket 數據收發的詳細過程

 

WebSocket 和 HTTP 類似,只是一個應用層協議,對下層透明,因此不涉及 TCP/IP。 php

因爲瀏覽器支持了 WebSocket,因此在用 JS 寫客戶端的時候,是無需考慮數據的編碼解碼的。html

如下主要針對服務器端而言。git

 

[ 接收數據,須要作的是解碼,即 decode ]github

要接收WebSocket數據,一個端點(endpoint)要監聽底層網絡鏈接。瀏覽器

進來的數據必須做爲WebSocket幀(frame)解析。https://tools.ietf.org/html/rfc6455#section-5.2服務器

若是接收到控制幀(control frame),這個幀必須被處理。https://tools.ietf.org/html/rfc6455#section-5.5網絡

接收到數據幀的時候,https://tools.ietf.org/html/rfc6455#section-5.6編碼

端點(endpoint)必須把數據的 /type/ 做爲已定義的 opcode(frame-opcode) 解釋。https://tools.ietf.org/html/rfc6455#section-5.2code

幀中的應用層數據(Application data)在消息的 /data/ 中定義。htm

若是幀包含一個未拆分的消息(unfragmented message),https://tools.ietf.org/html/rfc6455#section-5.4

它是在說一個包含類型 /type/ 和數據 /data/ 的WebSocket消息已被接收。

若是幀是被拆分消息(fragmented message)的一部分,應用層數據(Application data)隨後的數據幀被鏈接起來而造成數據。

當最後一個片斷(fragment)做爲 FIN 比特(frame-fin)標示被接收,

說明WebSocket消息已經接收了數據 /data/(包括由片斷組成的應用層數據)和類型 /type/ (碎片消息的第一幀)。

後來的數據幀必須被做爲新的WebSocket解釋。

擴展(extensions)可能改變數據如何讀取的語義,https://tools.ietf.org/html/rfc6455#section-9

特別是包括 - 什麼構成消息的邊界。

在一個有效載荷(payload)中,擴展(extensions)爲了在應用層數據前面添加擴展數據(extension data),可能也修改應用層數據(經過壓縮它)。

服務器必須移除從客戶端接收數據幀的掩碼(masking)。https://tools.ietf.org/html/rfc6455#section-5.3

 

[ 發送數據,須要作的是編碼,即 encode ]

要在一個WebSocket鏈接上發送包含 /data/ 的WebSocket消息,端點(endpoint)必須執行以下步驟。

1.端點(endpoint)必須保證WebSocket鏈接是 OPEN 狀態(握手操做以後)。若是在任何端點上,WebSocket鏈接狀態改變了,端點必須終止如下步驟。

2.端點必須封裝 /data/ 到WebSocket幀中。https://tools.ietf.org/html/rfc6455#section-5.2

3.第一個數據幀的 opcode(frame-opcode)包含的數據必須 針對數據被接收者解釋爲文本數據或二進制數據 來設置爲合適的值。https://tools.ietf.org/html/rfc6455#section-5.2

4.包含數據的最後幀FIN比特(frame-fin),必須被設置爲1。https://tools.ietf.org/html/rfc6455#section-5.2

5.若是數據正在被客戶端發送,幀必須被掩碼。https://tools.ietf.org/html/rfc6455#section-5.3

6.若是針對WebSocket鏈接的擴展已經議定,額外的考慮因素能夠按照這些擴展的定義來應用。https://tools.ietf.org/html/rfc6455#section-9

7.已造成的幀必須在底層網絡鏈接上傳輸。

 

相信你看明白了這個流程是一個過程概念闡述,實現須要遵守 section-5 的解釋來 coding,並且只要實現功能,方式沒有限制。

 

參考rfc:https://tools.ietf.org/html/rfc6455#section-6

PHP實現:https://github.com/phvia/via/blob/develop/Protocol/WebSocket.php

Link:http://www.cnblogs.com/farwish/p/9011107.html

相關文章
相關標籤/搜索