http://itzone.hk/article/article.php?ai ... 2044089879
這也是 WebSocket 的根本理念及功能:伺服器端能用同一個 TCP 連接,主動發送資料至用戶端。
建立 WebSocket 連接後,便不會再使用 HTTP,而是使用 RFC 6455 的 frame header,引自 IETF RFC 6455:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len | Extended payload length |
|I|S|S|S| (4) |A| (7) | (16/64) |
|N|V|V|V| |S| | (if payload len==126/127) |
| |1|2|3| |K| | |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
| Extended payload length continued, if payload len == 127 |
+ - - - - - - - - - - - - - - - +-------------------------------+
| |Masking-key, if MASK set to 1 |
+-------------------------------+-------------------------------+
| Masking-key (continued) | Payload Data |
+-------------------------------- - - - - - - - - - - - - - - - +
: Payload Data continued ... :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Payload Data continued ... |
+---------------------------------------------------------------+
以上的 frame header 以最左方為 most significant bit:
「FIN」:「0」代表此 frame 並不是最後的一個 frame,接收方須收到之後的 frame 才能行動;「1」代表這是最後的一個 frame。一般靜態訊息 (即不需等待用戶輸入、檔案上載之類) 都能以一個 frame 處理。
「RSV1」、「RSV2」、「RSV3」:必須為「0」
「Opcode」:此 4-bit 值定義了此 frame 將要執行的動作:
0x01:此 frame 內容為純文字
0x02:此 frame 內容為二進制碼
0x08:此 frame 將告訴對方終止 WebSocket 連結
0x09:此 frame 為 Ping control frame
0x0A:此 frame 為 Pong control frame
「Mask」:「1」則有 payload masking,「0」則沒有。用戶端所發送的 frame 必須將「Mask」設為「1」
「Payload length」:此 7-bit 數值為 frame 內容的長度,內容長度分為三種尺度:
0 byte 至 125 bytes:會以 000 0000 至 111 1101 表示,並代表下一個 byte 即為 frame 內容的開始
126 bytes 至 65535 bytes:會以「111 1110」即「126」表示,並指示下兩個 byte 才載有實際的內容長度
65536 bytes 至 2^64 - 1 bytes:會以「111 1111」即「127」表示,並指示下八個 bytes 才載有實際的內容長度
「Masking-key」:只適用於「Masking」為「1」時,當「Masking」為「0」時,此欄不佔空間
「Payload data」:即實際的 frame 內容
Web Socket
前往
- Software
- ↳ CodeCharge Studio
- ↳ CodeCharge
- ↳ DemoCharge
- ↳ SuperPDF
- ↳ 551einv
- ↳ E3進銷存
- 程式語言
- ↳ PHP
- ↳ CodeLobster PHP Edition
- ↳ Yii
- ↳ CodeIgniter
- ↳ Phalcon
- ↳ Symfony
- ↳ FuelPHP
- ↳ Zend Framework 2
- ↳ laravel
- ↳ WordPress
- ↳ ASP.NET/C#
- ↳ ASP/VBScript
- ↳ JSP
- ↳ Java Servlets
- ↳ ColdFusion
- ↳ Perl
- ↳ Java Script
- ↳ jQuery
- ↳ HTML + CSS
- ↳ jQuery
- ↳ nodejs
- ↳ VB6
- ↳ Git
- ↳ App Inventor 2
- ↳ bash
- ↳ C++/ VC/ OpenCV
- ↳ OpenCV
- ↳ go
- ↳ cordova
- ↳ python
- ↳ Xamarin
- ↳ Assembly
- 資料庫
- ↳ MySQL
- ↳ PostgreSQL
- ↳ ORACLE
- ↳ Access
- ↳ SQL Server
- ↳ SQLite
- ↳ MariaDB
- ↳ Mongodb
- 作業系統
- ↳ Linux
- ↳ Ubuntu
- ↳ CentOS
- ↳ Mint
- ↳ Mandriva
- ↳ Debian
- ↳ Red Hat Enterprise Linux
- ↳ Oracle Linux
- ↳ Fedora
- ↳ Kali Linux
- ↳ OpenSUSE
- ↳ Elementary OS
- ↳ Microsoft
- ↳ Server 2008 R2
- ↳ Server 2012 R2
- ↳ Server 2012
- ↳ 8
- ↳ 10
- ↳ System Center 2016
- ↳ NOVELL
- ↳ FreeBSD
- ↳ VMware
- ↳ VirtualBox
- ↳ Mac OS X
- ↳ Solaris
- ↳ iOS
- ↳ Android
- ↳ Cloud
- ↳ OpenStack
- ↳ Docker
- ↳ Proxmox VE
- ↳ CloudReady
- ↳ chrome
- 網頁伺服器
- ↳ apache
- ↳ tomcat
- ↳ nginx
- ↳ IIS
- ↳ JBoss
- ↳ weblogic
- ↳ WebHosting
- 硬體
- ↳ 硬體及週邊
- ↳ RouterOS
- ↳ LEGO NXT
- ↳ Arduino
- ↳ MSP430
- ↳ Raspberry Pi
- ↳ OpenERP
- ↳ Storage
- ↳ Server
- ↳ Brocade
- ↳ MODELS
- ↳ FortiGate
- 軟體
- ↳ sublime
- ↳ LibreNMS