WebSocket ãµã¼ãã¼ã¯ãç¹å®ã®ãããã³ã«ã«å¾ããµã¼ãã¼ã®ä»»æã®ãã¼ããå¾ ã¡åããã TCP ã¢ããªã±ã¼ã·ã§ã³ã«ä»ãªãã¾ãããã«ã¹ã¿ã ãµã¼ãã¼ã使ãããã¨ããªã人ã«ã¨ã£ã¦ã¯ãã«ã¹ã¿ã ãµã¼ãã¼ã®ä½æã¯å¤§å¤ãªä½æ¥ã®ããã«æããããããã¾ãããããããå®éã«ã¯ã鏿ãããã©ãããã©ã¼ã ã«åºæ¬ç㪠WebSocket ãµã¼ãã¼ãå®è£ ããã®ã¯ãããã»ã©é£ãããã¨ã§ã¯ããã¾ããã
WebSocket ãµã¼ãã¼ã¯ã Berkeley sockets ãå©ç¨å¯è½ãªãµã¼ãã¼ãµã¤ãããã°ã©ãã³ã°è¨èªãä¾ãã° C(++)ãPythonãPHPããµã¼ãã¼ãµã¤ã JavaScript ãªã©ã§è¨è¿°ãããã¨ãã§ãã¾ããããã¯ç¹å®ã®è¨èªã®ãã¥ã¼ããªã¢ã«ã§ã¯ããã¾ããããç¬èªã®ãµã¼ãã¼ã®ä½æã容æã«ããã¬ã¤ãã¨ãã¦å½¹ç«ã¡ã¾ãã
ãã®è¨äºã¯ãæ¢ã« HTTP ã®ä»çµã¿ã«ç²¾éãã¦ãããä¸ç¨åº¦ã®ããã°ã©ãã³ã°çµé¨ããããã¨ãåæã«æ¸ããã¦ãã¾ããè¨èªã«ãã£ã¦ã¯ã TCP ã½ã±ããã®ç¥èãå¿ è¦ãªå ´åãããã¾ãããã®ã¬ã¤ãã®ç¯å²ã¯ã WebSocket ãµã¼ãã¼ãæ¸ãããã«å¿ è¦ãªæå°éã®ç¥èãæç¤ºãããã¨ã§ãã
ã¡ã¢: ææ°ã®å ¬å¼ WebSockets 仿§ã§ãã RFC 6455 ãåç §ãã¦ãã ããã第 1 ç« ã¨ç¬¬ 4-7 ç« ã¯ãµã¼ãã¼å®è£ è ã«ã¨ã£ã¦ç¹ã«è峿·±ããã®ã§ãã第 10 ç« ã§ã¯ã»ãã¥ãªãã£ã«ã¤ãã¦èª¬æãã¦ãã¾ãããµã¼ãã¼ãå ¬éããåã«ã»ãã¥ãªãã£ãæ£ããçè§£ããå¿ è¦ãããã¾ãã
ããã§ã¯ WebSocket ãµã¼ãã¼ã«ã¤ãã¦é常ã«ä½æ°´æºã§èª¬æãã¦ãã¾ããWebSocket ãµã¼ãã¼ã¯å¤ãã®å ´åããªãã¼ã¹ãããã·ã¼ï¼é常㮠HTTP ãµã¼ãã¼ãªã©ï¼ã使ç¨ã㦠WebSocket ãã³ãã·ã§ã¤ã¯ãæ¤åºãäºåå¦çãããããã®ã¯ã©ã¤ã¢ã³ããå®éã® WebSocket ãµã¼ãã¼ã«éä¿¡ãã¾ããã¤ã¾ããï¼ä¾ãã°ï¼ã¯ããã¼ã¨èªè¨¼ãã³ãã©ã¼ã使ç¨ãã¦ãµã¼ãã¼å´ã®ã³ã¼ããè¨ãã¾ããå¿ è¦ã¯ããã¾ããã
WebSocket ãã³ãã·ã§ã¤ã¯ã¾ãããµã¼ãã¼ã¯æ¨æºã® TCP ã½ã±ããã使ç¨ãã¦çä¿¡ã½ã±ããæ¥ç¶ãå¾
ã¡åããå¿
è¦ãããã¾ãããã©ãããã©ã¼ã ã«ãã£ã¦ã¯ããã§ã«å¦çããã¦ããå¯è½æ§ãããã¾ãããã¨ãã°ããµã¼ãã¼ã example.com
ã 8000 çªãã¼ãã§å¾
ã¡åããã¦ããã¨ããã½ã±ãããµã¼ãã¼ã example.com/chat
ã«å¯¾ãã GET
ãªã¯ã¨ã¹ãã«å¿çããã¨ãã¾ãã
è¦å: ãµã¼ãã¼ã¯é¸æãããã¼ãã§å¾ ã¡åããã¾ããã80 ã¾ã㯠443 以å¤ã®ãã¼ãã鏿ããã¨ããã¡ã¤ã¢ã¦ã©ã¼ã«ããããã·ã¼ã®åé¡ãçºçããå¯è½æ§ãããã¾ãããã©ã¦ã¶ã¼ã¯ WebSocket ã®æ¥ç¶ã«å®å ¨ãªæ¥ç¶ãå¿ è¦ã¨ãã¾ããããã¼ã«ã«æ©å¨ã§ã¯ä¾å¤ãè¨ãã¦ããå¯è½æ§ãããã¾ãã
ãã³ãã·ã§ã¤ã¯ã¯ WebSockets ã® "Web" ã§ãããã㯠HTTP ãã WS ã¸ã®æ©æ¸¡ãã§ãããã³ãã·ã§ã¤ã¯ã§ã¯ãæ¥ç¶ã®è©³ç´°ããã´ã·ã¨ã¼ãããããããã®å½äºè ãæ¡ä»¶ãæªãå ´åã«ã¯å®äºåã«åãæ¶ããã¨ãã§ãã¾ãã ãµã¼ãã¼ã¯ã¯ã©ã¤ã¢ã³ãããªã¯ã¨ã¹ããããã¹ã¦ã®ãã®ãçè§£ããããã«æ³¨æããå¿ è¦ãããã¾ããããããªãã¨ã»ãã¥ãªãã£ã®åé¡ãçºçãã¾ãã
ã¡ã¢: request-uri ï¼ããã§ã¯ /chat
ï¼ã®æå³ã¯ä»æ§æ¸ã§ã¯å®ç¾©ããã¦ãã¾ãããå¤ãã®äººãããã使ç¨ãã¦ã 1 ã¤ã®ãµã¼ãã¼ãè¤æ°ã® WebSocket ã¢ããªã±ã¼ã·ã§ã³ãå¦çã§ããããã«ãã¾ãããã¨ãã°ãexample.com/chat
ã¯ãã«ãã¦ã¼ã¶ã¼ãã£ããã¢ããªãå¼ã³åºããã¨ãã§ããåããµã¼ãã¼ã® /game
ã¯ãã«ããã¬ã¤ã¤ã¼ã²ã¼ã ãå¼ã³åºããã¨ãã§ããããã«ãããªã©ã§ãã
ãµã¼ãã¼ãæ§ç¯ãã¦ãã¦ããã¯ã©ã¤ã¢ã³ã㯠WebSocket ãã³ãã·ã§ã¤ã¯ããã»ã¹ãéå§ããå¿
è¦ãããã¾ãããããã£ã¦ã¯ã©ã¤ã¢ã³ãã®ãªã¯ã¨ã¹ããã©ã®ããã«è§£éããããç¥ã£ã¦ããå¿
è¦ãããã¾ããã¯ã©ã¤ã¢ã³ãã¯æ¬¡ã®ãããªããªãæ¨æºç㪠HTTP ãªã¯ã¨ã¹ã (HTTP ãã¼ã¸ã§ã³ã¯ 1.1 以ä¸ã§ãªããã°ãªãããã¡ã½ããã¯GET
ã§ãªããã°ãªãã¾ãã) ãéä¿¡ãã¾ãã
GET /chat HTTP/1.1
Host: example.com:8000
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Sec-WebSocket-Version: 13
ã¯ã©ã¤ã¢ã³ãã¯ããã§æ¡å¼µåããµããããã³ã«ãæ±ãããã¨ãã§ãã¾ãã詳細ã¯ããã®ä»ããåç
§ãã¦ãã ãããã¾ã User-Agent
ãReferer
ãCookie
ãèªè¨¼ãããã¼ãªã©ã®ä¸è¬çãªãããã¼ãåå¨ããå¯è½æ§ãããã¾ãããããã«å¯¾ãã¦ã¯ä½ããã¦ãæ§ãã¾ããã WebSocket ã«ã¯ç´æ¥é¢ä¿ãã¾ãããããããç¡è¦ãããã¨ãå®å
¨ã§ããå¤ãã®ä¸è¬çãªè¨å®ã§ã¯ããªãã¼ã¹ãããã·ã¼ã¯æ¢ã«ããããå¦çãã¦ãã¾ãã
ã¡ã¢: ãã¹ã¦ã®ãã©ã¦ã¶ã¼ã¯ Origin
ãããã¼ãéä¿¡ãã¾ãããã®ãããã¼ãã»ãã¥ãªãã£ï¼åä¸ãªãªã¸ã³ã®ãã§ãã¯ãèªå許å¯ã¾ãã¯æå¦ãªã©ï¼ã«ä½¿ç¨ããè¦ããããªããã° 403 Forbidden ãéããã¨ãã§ãã¾ããããã¯[ã¯ãã¹ãµã¤ã WebSocket ãã¤ã¸ã£ããã³ã° (CSWH)] (https://cwe.mitre.org/data/definitions/1385.html) ã«å¯¾ãã¦å¹æãããã¾ãããã ãããã©ã¦ã¶ã¼ä»¥å¤ã®ã¨ã¼ã¸ã§ã³ãã¯ãå½ã® Origin
ãéä¿¡ããã ãã§ãããã¨ã«æ³¨æãã¦ãã ãããã»ã¨ãã©ã®ã¢ããªã±ã¼ã·ã§ã³ã¯ããã®ãããã¼ã®ãªããªã¯ã¨ã¹ããæå¦ãã¾ãã
ãããã¼ãè§£éããã¦ããªããå¤ãæ£ãããªãå ´åããµã¼ãã¼ã¯ 400
("Bad Request") ãéä¿¡ããããã«ã½ã±ãããéããå¿
è¦ãããã¾ããé常ã¯ãHTTP ã¬ã¹ãã³ã¹æ¬ä½ã§ãã³ãã·ã§ã¤ã¯ã失æããçç±ã示ãããããã¾ããããã¡ãã»ã¼ã¸ã¯è¡¨ç¤ºãããªãããããã¾ããï¼ãã©ã¦ã¶ã¼ã¯è¡¨ç¤ºãã¾ããï¼ã ãµã¼ãã¼ã WebSocket ã®ãã¼ã¸ã§ã³ãèªèããªãå ´åããµã¼ãã¼ã¯è§£éå¯è½ãªãã¼ã¸ã§ã³ãå«ã Sec-WebSocket-Version
ãããã¼ãè¿ãå¿
è¦ãããã¾ããä¸è¨ã®ä¾ã§ã¯ã WebSocket ãããã³ã« 13 çã§ãããã¨ã示ãã¦ãã¾ãã
ããã§ãæãè峿·±ããããã¼ã¯ Sec-WebSocket-Key
ã§ããæ¬¡ã«è¦ã¦ã¿ã¾ãããã
ã¡ã¢: é常㮠HTTP ã¹ãã¼ã¿ã¹ã³ã¼ãã¯ããã³ãã·ã§ã¤ã¯ã®åã«ã®ã¿ä½¿ç¨ã§ãã¾ãããã³ãã·ã§ã¤ã¯ãæåããããå¥ã®ã³ã¼ãã»ãã (仿§ã® 7.4 ç¯ã§å®ç¾©ããã¦ãã) ã使ç¨ããå¿ è¦ãããã¾ãã
ãµã¼ãã¼ãã³ãã·ã§ã¤ã¯ã¬ã¹ãã³ã¹ãµã¼ãã¼ããã³ãã·ã§ã¤ã¯ãªã¯ã¨ã¹ããåãåãã¨ããããã³ã«ã HTTP ãã WebSocket ã«å¤æ´ããããã¨ã示ãç¹å¥ãªã¬ã¹ãã³ã¹ãéãè¿ãå¿
è¦ãããã¾ãããã®ãããã¼ã¯æ¬¡ã®ãããªãã®ã§ãï¼åãããã¼è¡ã¯ \r\n
ã§çµããããããã¼ã®çµããã示ãããã«æå¾ã®è¡ã®å¾ã«è¿½å ã® \r\n
ãç½®ããã¨ãå¿ããªãã§ãã ããï¼ã
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
ããã«ããµã¼ãã¼ã¯ããã§æ¡å¼µ/ãµããããã³ã«ã®ãªã¯ã¨ã¹ããæ±ºå®ãããã¨ãã§ãã¾ãã詳ããã¯ãã®ä»ãåç
§ãã¦ãã ããã Sec-WebSocket-Accept
ãããã¼ã¯ãã¯ã©ã¤ã¢ã³ããéä¿¡ãã Sec-WebSocket-Key
ãããµã¼ãã¼ãå°ãåºãå¿
è¦ãããç¹ã§éè¦ã§ãããããå¾ãã«ã¯ãã¯ã©ã¤ã¢ã³ãã® Sec-WebSocket-Key
㨠"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
ã¨ããæååï¼ããã¯ããã¸ãã¯æååãï¼ãé£çµãã¦ããã®çµæã® SHA-1 hash ãã¨ãããã®ããã·ã¥ã® base64 ã¨ã³ã³ã¼ãã£ã³ã°å¤ãè¿ãã°ããã®ã§ãã
ã¡ã¢: ãã®ä¸è¦è¤éãããããã»ã¹ã¯ããµã¼ãã¼ã WebSocket ã«å¯¾å¿ãã¦ãããã©ãããã¯ã©ã¤ã¢ã³ãã«æããã«ããããã«åå¨ãã¾ããããã¯ããµã¼ãã¼ã WebSockets æ¥ç¶ãåãå ¥ãã¦ãããã¼ã¿ã HTTP ãªã¯ã¨ã¹ãã¨ãã¦è§£éããå ´åã«ã»ãã¥ãªãã£åé¡ãçºçããå¯è½æ§ããããããéè¦ãªãã¨ã§ãã
ãããã£ã¦ã Key ã "dGhlIHNhbXBsZSBub25jZQ=="
ã ã£ãå ´åã Accept 㯠"s3pPLMBiTxaQ9kYGzzhZRbK+xOo="
ã«ãªãã¾ãããµã¼ãã¼ããããã®ãããã¼ãéä¿¡ããã¨ããã³ãã·ã§ã¤ã¯ã¯å®äºãããã¼ã¿ã®ã¹ã¯ãããéå§ã§ãã¾ãã
ã¡ã¢: ãµã¼ãã¼ã¯ã Set-Cookie
ã®ãããªä»ã®ãããã¼ãéä¿¡ããããã¬ã¹ãã³ã¹ãã³ãã·ã§ã¤ã¯ãéä¿¡ããåã«ä»ã®ã¹ãã¼ã¿ã¹ã³ã¼ãã§èªè¨¼ã¾ãã¯ãªãã¤ã¬ã¯ããè¦æ±ããããããã¨ãã§ãã¾ãã
ãã㯠WebSocket ãããã³ã«ã¨ã¯ç´æ¥é¢ä¿ããã¾ããããããã§è§¦ãã¦ãã価å¤ãããã¾ãããµã¼ãã¼ã¯ã¯ã©ã¤ã¢ã³ãã®ã½ã±ããã追跡ããå¿ è¦ãããã®ã§ããã§ã«ãã³ãã·ã§ã¤ã¯ãå®äºããã¯ã©ã¤ã¢ã³ãã¨åã³ãã³ãã·ã§ã¤ã¯ãç¶ããå¿ è¦ã¯ããã¾ãããåãã¯ã©ã¤ã¢ã³ãã® IP ã¢ãã¬ã¹ã¯ä½åº¦ãæ¥ç¶ã試ã¿ããã¨ãã§ãã¾ãããããããµã¼ãã¼ã¯ DoS æ»æãã身ãå®ãããã«ããã¾ãã«ãå¤ãã®æ¥ç¶ã試ã¿ãããå ´åãæå¦ãããã¨ãããã¾ãã
ä¾ãã°ãã¦ã¼ã¶ã¼åã ID çªå·ãã対å¿ãã WebSocket
ããã®æ¥ç¶ã«é¢é£ä»ããå¿
è¦ã®ãããã¼ã¿ã¨ä¸ç·ã«è¡¨ã«ãã¦ããã¨ããã§ãããã
ã¯ã©ã¤ã¢ã³ãã¨ãµã¼ãã¼ã®ã©ã¡ããããã¤ã§ãã¡ãã»ã¼ã¸ãéä¿¡ãããã¨ãã§ãã¾ããããã WebSocket ã®éæ³ã§ãããããããããã®ããããããã¬ã¼ã ãã®ãã¼ã¿ããæ å ±ãæ½åºãããã¨ã¯ãã¾ãéæ³ã®ãããªçµé¨ã§ã¯ããã¾ããããã¹ã¦ã®ãã¬ã¼ã ã¯åãç¹å®ã®ãã©ã¼ãããã«å¾ãã¾ãããã¯ã©ã¤ã¢ã³ããããµã¼ãã¼ã«åãããã¼ã¿ã¯ XOR æå·åï¼32 ããããã¼ï¼ã使ç¨ãã¦ãã¹ã¯ããã¾ããæ¬æç´°æ¸ã®ç¬¬ 5 ç¯ã§ããã«ã¤ãã¦è©³ç´°ã«èª¬æããã
ãã©ã¼ãããåãã¼ã¿ãã¬ã¼ã ï¼ã¯ã©ã¤ã¢ã³ããããµã¼ãã¼ã¸ãã¾ãã¯ãã®éï¼ã¯ã次ã®åãå½¢å¼ã«å¾ãã¾ãã
Frame format:
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 ... |
+---------------------------------------------------------------+
ã¤ã¾ãããã¬ã¼ã ã«ã¯æ¬¡ã®ãã¤ããæ ¼ç´ããã¦ããã¨ãããã¨ã§ãã
MASK ãããã¯ã¡ãã»ã¼ã¸ãã¨ã³ã³ã¼ãããã¦ãããã©ããã示ãã¾ããã¯ã©ã¤ã¢ã³ãããã®ã¡ãã»ã¼ã¸ã¯ãã¹ã¯ããã¦ããå¿ è¦ãããã¾ãã®ã§ããµã¼ãã¼ã¯ãã®ãããã 1 ã§ãããã¨ã確èªããå¿ è¦ãããã¾ããï¼å®éã仿§æ¸ã®ç¬¬ 5.1 ç¯ã§ã¯ãã¯ã©ã¤ã¢ã³ãããã¹ã¯ããã¦ããªãã¡ãã»ã¼ã¸ãéä¿¡ããå ´åããµã¼ãã¼ã¯ã¯ã©ã¤ã¢ã³ãããåæããå¿ è¦ãããã¾ããï¼ãã¬ã¼ã ãã¯ã©ã¤ã¢ã³ãã«æ»ãã¨ãã¯ããã¹ã¯ããããã¹ã¯ããããè¨å®ããªãã§ãã ãããå¾ã§ãã¹ãã³ã°ã«ã¤ãã¦èª¬æãã¾ããæ³¨æï¼ã»ãã¥ã¢ã½ã±ããã使ç¨ãã¦ããå ´åã§ããã¡ãã»ã¼ã¸ããã¹ã¯ããå¿ è¦ãããã¾ããRSV1-3 ã¯ç¡è¦ãããã¨ãã§ãã¾ãããããã¯æ¡å¼µã®ããã®ãã®ã§ãã
opcode ãã£ã¼ã«ãã¯ãæ¬ä½ãã¼ã¿ãã©ã®ããã«è§£éããããå®ç¾©ãã¾ããç¶ç¶ã®å ´å 0x0
ãããã¹ã (UTF-8 ã§å¸¸ã«ã¨ã³ã³ã¼ãããã) ã®å ´å㯠0x1
ããã¤ããªã¼ã®å ´å㯠0x2
ãããã³ãã®ä»ã®ãããããå¶å¾¡ã³ã¼ããã«ã¤ãã¦ã¯å¾ã§èª¬æãã¾ãããã®çã® WebSocket ã§ã¯ã0x3
ã 0x7
ããã³ 0xB
ã0xF
ã¯æå³ãæã¡ã¾ããã
FIN ãããã¯ããããã·ãªã¼ãºå ã®æå¾ã®ã¡ãã»ã¼ã¸ã§ãããã©ããã示ãã¾ãã0 ã®å ´åããµã¼ãã¼ã¯ã¡ãã»ã¼ã¸ã®ããå¤ãã®é¨åããªã¹ãã³ã°ãç¶ãã¾ãããã以å¤ã®å ´åããµã¼ãã¼ã¯é ä¿¡ãããã¡ãã»ã¼ã¸ãèæ ®ããå¿ è¦ãããã¾ããããã«ã¤ãã¦ã¯å¾ã§è©³ãã説æãã¾ãã
æ¬ä½é·ã®ãã³ã¼ãæ¬ä½ãã¼ã¿ãèªã¿åãã«ã¯ããã¤èªã¿çµããã¹ãããç¥ã£ã¦ããå¿ è¦ãããã¾ãããã®ããæ¬ä½ã®é·ããç¥ããã¨ãéè¦ã§ããæ®å¿µãªãããããã¯ããè¤éã§ãããããèªãã«ã¯ãæ¬¡ã®æé ãå®è¡ãã¾ãã
MASK ããããã»ããããã¦ããå ´åã¯ï¼ã¯ã©ã¤ã¢ã³ããããµã¼ãã¼ã¸ã®ã¡ãã»ã¼ã¸ã§ã¯ããããã¹ãã§ãï¼ã次㮠4 ãªã¯ãããï¼32 ãããï¼ãèªã¿è¾¼ã¿ã¾ããããããã¹ãã³ã°ãã¼ã§ããæ¬ä½é·ã¨ãã¹ãã³ã°ãã¼ããã³ã¼ããããããã½ã±ãããããã®ãã¤ãæ°ãèªã¿åããã¨ãã§ãã¾ãããã¼ã¿ã ENCODED
ããã¼ã MASK
å¼ã¶ãã¨ã«ãã¾ãã DECODED
ãåå¾ããã«ã¯ãENCODED
ã®ãªã¯ãããï¼ãã¤ãåãããªãã¡ããã¹ããã¼ã¿ã®æåã®åï¼ãã«ã¼ããããªã¯ãããã MASK
ã®ï¼i ã¢ã¸ã¥ã 4ï¼çªç®ã®ãªã¯ãããã使ç¨ã㦠XOR ãã¾ããæ¬ä¼¼ã³ã¼ãã§è¡¨ãã¦ã¿ã¾ãï¼JavaScript ãæå¹ãªå ´åï¼ã
const MASK = [1, 2, 3, 4]; // 4 ãã¤ããã¹ã¯
const ENCODED = [105, 103, 111, 104, 110]; // encoded string "hello"
// ãã³ã¼ãããå
容ã®ãã¤ãé
åã使
const DECODED = Uint8Array.from(ENCODED, (elt, i) => elt ^ MASK[i % 4]); // ãã¹ã¯ã® XOR ãå®è¡
ããã§ãã¢ããªã±ã¼ã·ã§ã³ã«å¿ã㦠DECODED ãä½ãæå³ããã®ããçè§£ãããã¨ãã§ãã¾ãã
ã¡ãã»ã¼ã¸ãã©ã°ã¡ã³ãã¼ã·ã§ã³FIN ãã£ã¼ã«ãã¨ãªãã³ã¼ããã£ã¼ã«ãã¯é£æºãã¦ãå¥ã
ã®ãã¬ã¼ã ã«åå²ãããã¡ãã»ã¼ã¸ãéä¿¡ãã¾ããããã¯ã¡ãã»ã¼ã¸ãã©ã°ã¡ã³ãã¼ã·ã§ã³ã¨å¼ã°ãã¾ãããã©ã°ã¡ã³ãã¼ã·ã§ã³ã¯ããªãã³ã¼ã 0x0
ã 0x2
ã§ã®ã¿ä½¿ç¨ã§ãã¾ãã
ãªãã³ã¼ãã¯ãã¬ã¼ã ã®æå³ã示ãã¦ãã¾ãã0x1
ã®å ´åãæ¬ä½ã¯ããã¹ãã§ãã0x2
ã®å ´åãæ¬ä½ã¯ãã¤ããªã¼ãã¼ã¿ã§ãããã ãã0x0
ã®å ´åããã¬ã¼ã ã¯ç¶ç¶ãã¬ã¼ã ã§ããã¤ã¾ããµã¼ãã¼ã¯ãã¬ã¼ã ã®æ¬ä½ããã®ã¯ã©ã¤ã¢ã³ãããåä¿¡ããæå¾ã®ãã¬ã¼ã ã«é£çµããå¿
è¦ãããã¾ããããã§ã¯ããµã¼ãã¼ãããã¹ãã¡ãã»ã¼ã¸ãéä¿¡ããã¯ã©ã¤ã¢ã³ãã«åå¿ããæ¦ç¥ã示ãã¾ãã第 1 ã®ã¡ãã»ã¼ã¸ã¯åä¸ã®ãã¬ã¼ã ã§éä¿¡ããã第 2 ã®ã¡ãã»ã¼ã¸ã¯3ã¤ã®ãã¬ã¼ã ã«ããã£ã¦éä¿¡ããã¾ããFIN ã¨ãªãã³ã¼ãã®è©³ç´°ã¯ãã¯ã©ã¤ã¢ã³ãã«å¯¾ãã¦ã®ã¿è¡¨ç¤ºããã¾ãã
Client: FIN=1, opcode=0x1, msg="hello" Server: (process complete message immediately) Hi. Client: FIN=0, opcode=0x1, msg="and a" Server: (listening, new message containing text started) Client: FIN=0, opcode=0x0, msg="happy new" Server: (listening, payload concatenated to previous message) Client: FIN=1, opcode=0x0, msg="year!" Server: (process complete message) Happy new year to you too!
æåã®ãã¬ã¼ã ã«ã¡ãã»ã¼ã¸å
¨ä½ãå«ã¾ãã¦ãããã¨ã«æ³¨æãã¦ãã ãã (FIN=1
ããã³ opcode!=0x0
)ãããã«ãããµã¼ãã¼ã¯é©åã«å¦çã¾ãã¯å¿çã§ãã¾ããã¯ã©ã¤ã¢ã³ããéä¿¡ãã 2 çªç®ã®ãã¬ã¼ã ã«ã¯ããã¹ãæ¬ä½ (opcode=0x1
) ãããã¾ãããã¡ãã»ã¼ã¸å
¨ä½ãã¾ã å°çãã¦ãã¾ãã (FIN=0
)ããã®ã¡ãã»ã¼ã¸ã®æ®ãã®é¨åã¯ãã¹ã¦ç¶ç¶ãã¬ã¼ã (opcode=0x0
) ã¨å
±ã«éä¿¡ãããã¡ãã»ã¼ã¸ã®æçµãã¬ã¼ã 㯠FIN=1
ã§ãã¼ã¯ããã¾ãã仿§æ¸ã® 5.4 ç¯ã§ã¯ãã¡ãã»ã¼ã¸ãã©ã°ã¡ã³ãã¼ã·ã§ã³ã«ã¤ãã¦èª¬æãããã¾ãã
ãã³ãã·ã§ã¤ã¯å¾ã®ä»»æã®æç¹ã§ãã¯ã©ã¤ã¢ã³ãã¾ãã¯ãµã¼ãã¼ã®ã©ã¡ããããç¸æã« ping ãéä¿¡ãããã¨ã鏿ã§ãã¾ãã ping ãåä¿¡ãããã¨ãåä¿¡è ã¯ã§ããã ãæ©ã pong ãè¿ããªããã°ãªãã¾ããã ããã使ç¨ãã¦ããã¨ãã°ã¯ã©ã¤ã¢ã³ããã¾ã æ¥ç¶ããã¦ãããã¨ã確èªã§ãã¾ãã
ping ã pong ã¯åãªãé常ã®ãã¬ã¼ã ã§ãããå¶å¾¡ãã¬ã¼ã ã§ããping ã®ãªãã³ã¼ã㯠0x9
ãpong ã®ãªãã³ã¼ã㯠0xA
ã§ããping ãåå¾ããããping ã¨åãæ¬ä½ãã¼ã¿ãæã¤ pong ãéãã¾ãï¼ping 㨠pong ã®å ´åãæå¤§æ¬ä½é·ã¯ 125 ã§ãï¼ãping ãéä¿¡ãããã¨ãªã pong ãåå¾ãããã¨ãã§ãã¾ãããã®å ´åã¯ãããç¡è¦ãã¦ãã ããã
ã¡ã¢: pong ãéä¿¡ããæ©ä¼ãå¾ãåã«è¤æ°ã® ping ãåä¿¡ããå ´åã§ããéä¿¡ãã pong 㯠1 ã¤ã ãã§ãã
æ¥ç¶ãéããã¯ã©ã¤ã¢ã³ãã¾ãã¯ãµã¼ãã¼ã®æ¥ç¶ãéããã«ã¯æå®ããå¶å¾¡ã·ã¼ã±ã³ã¹ãå«ããã¼ã¿ã®å¶å¾¡ãã¬ã¼ã ãéä¿¡ãã¦ãçµäºãã³ãã·ã§ã¤ã¯ãéå§ãã¾ã (5.5.1 é ãåç §)ããã®ãããªãã¬ã¼ã ãåä¿¡ããã¨ãããï¼ã¤ã®ãã¢ã¯ã¬ã¹ãã³ã¹ã¨ãã¦ã¯ãã¼ãºãã¬ã¼ã ãéä¿¡ãã¾ããæåã®ãã¢ã¯æ¥ç¶ãéãã¾ããæ¥ç¶ã®çµäºå¾ã«åä¿¡ããããã以ä¸ã®ãã¼ã¿ã¯ããã®å¾ç ´æ£ããã¾ãã
ãã®ä»ã¡ã¢: WebSocket ã®ã³ã¼ããæ¡å¼µæ©è½ããµããããã³ã«ãªã©ã¯ãIANA WebSocket ãããã³ã«ã¬ã¸ã¹ããªã¼ã«ç»é²ããã¦ãã¾ãã
WebSocket ã®æ¡å¼µæ©è½ã¨ãµããããã³ã«ã¯ããã³ãã·ã§ã¤ã¯ä¸ã«ãããã¼ãä»ãã¦äº¤æ¸ããã¾ããæ¡å¼µæ©è½ã¨ãµããããã³ã«ã¯ã¨ã¦ãä¼¼ã¦ãã¾ãããæç¢ºãªåºå¥ãããã¾ããæ¡å¼µæ©è½ã¯ WebSocket ãã¬ã¼ã ãå¶å¾¡ããæ¬ä½ã夿´ãã¾ããããµããããã³ã«ã¯ WebSocket æ¬ä½ãæ§é åããä½ã夿´ãã¾ãããæ¡å¼µæ©è½ã¯ä»»æã®ãã®ã§ä¸è¬åããã¦ãã¾ãï¼å§ç¸®ãªã©ï¼ããµããããã³ã«ã¯å¿ é ã®ãã®ã§ããã¼ã«ã©ã¤ãºããã¦ãã¾ãï¼ãã£ããã MMORPG ã²ã¼ã ãªã©ï¼ã
æ¡å¼µæ©è½æ¡å¼µæ©è½ã¯ãã¡ã¤ã«ã誰ãã«é»åã¡ã¼ã«ã§éãåã«å§ç¸®ãã¦ããã¨èãã¦ãã ãããããªããä½ããã¦ããåããã¼ã¿ããã¾ãã¾ãªå½¢ã§éä¿¡ãã¦ãã¾ããåä¿¡è ã¯æçµçã«ãã¼ã«ã«ã³ãã¼ã¨åããã¼ã¿ãå¾ããã¨ãã§ãã¾ãããå¥ã®æ¹æ³ã§éä¿¡ããã¾ãããããæ¡å¼µæ©è½ã®æ©è½ã§ãã WebSockets ã¯ãããã³ã«ã¨ãã¼ã¿ãéä¿¡ããç°¡åãªæ¹æ³ãå®ç¾©ãã¾ãããå§ç¸®ãªã©ã®æ¡å¼µæ©è½ã§ã¯åããã¼ã¿ãçãå½¢å¼ã§éä¿¡ãããã¨ãã§ãã¾ãã
ã¡ã¢: æ¡å¼µæ©è½ã«ã¤ãã¦ã¯ã仿§æ¸ã® 5.8, 9, 11.3.2, 11.4 ç¯ã§èª¬æãã¦ãã¾ãã
ãµããããã³ã«ãµããããã³ã«ãã«ã¹ã¿ã XML ã¹ãã¼ãã¾ã㯠doctype 宣è¨ã¨èãã¦ãã ãããããªãã¯ã¾ã XML ã¨ãã®æ§æã使ç¨ãã¦ãã¾ãããããªããåæããæ§é ã«ãã£ã¦ããã«å¶éããã¾ããWebSocket ã®ãµããããã³ã«ã¯ã¾ãã«ãã®ãããªãã®ã§ãããããã¯ç©ºæ³çãªä½ããå°å ¥ãã¦ããããæ§é ã確ç«ããã ãã§ããdoctype ãã¹ãã¼ãã¨åæ§ã«ã両è ã¯ãµããããã³ã«ã«åæããªããã°ãªãã¾ãããdoctype ãã¹ãã¼ãã¨ã¯ç°ãªãããµããããã³ã«ã¯ãµã¼ãã¼ä¸ã«å®è£ ããã¦ãããã¯ã©ã¤ã¢ã³ãããå¤é¨åç §ãããã¨ã¯ã§ãã¾ããã
ã¡ã¢: ãµããããã³ã«ã¯ã仿§ã®ã»ã¯ã·ã§ã³ 1.9ã4.2ã11.3.4ã11.5 ã§èª¬æããã¦ãã¾ãã
ã¯ã©ã¤ã¢ã³ãã¯ç¹å®ã®ãµããããã³ã«ãè¦æ±ããå¿ è¦ãããã¾ãã ãããè¡ãã«ã¯ãå ã®ãã³ãã·ã§ã¤ã¯ã®ä¸é¨ã¨ãã¦æ¬¡ã®ãããªãã®ãéãã¾ãã
GET /chat HTTP/1.1
...
Sec-WebSocket-Protocol: soap, wamp
次ã®ãã®ãåçã§ãã
...
Sec-WebSocket-Protocol: soap
Sec-WebSocket-Protocol: wamp
ããã§ãµã¼ãã¼ã¯ã¯ã©ã¤ã¢ã³ããææ¡ãã¦å¯¾å¿ãã¦ãããããã³ã«ã® 1 ã¤ã鏿ããå¿
è¦ãããã¾ããè¤æ°ããå ´åã¯ãã¯ã©ã¤ã¢ã³ããéä¿¡ããæåã®ãã®ãéä¿¡ãã¾ãããµã¼ãã¼ã soap
㨠wamp
ã®ä¸¡æ¹ã使ç¨ã§ããã¨æ³åãã¦ãã ããã æ¬¡ã«ãã¬ã¹ãã³ã¹ãã³ãã·ã§ã¤ã¯ã§æ¬¡ã®ã¡ãã»ã¼ã¸ãéä¿¡ããã¾ãã
Sec-WebSocket-Protocol: soap
è¦å: ãµã¼ãã¼ã¯è¤æ°ã® Sec-WebSocket-Protocol
ãããã¼ãéä¿¡ã§ãã¾ããã ãµã¼ãã¼ããµããããã³ã«ã使ç¨ããããªãå ´åã Sec-WebSocket-Protocol
ãããã¼ãéä¿¡ãã¦ã¯ããã¾ããã空ç½ã®ãããã¼ãéä¿¡ããã®ã¯ééãã§ããã¯ã©ã¤ã¢ã³ãã¯ãå¿
è¦ãªãµããããã³ã«ãåå¾ã§ããªãå ´åã«æ¥ç¶ãéãããã¨ãããã¾ãã
ãµã¼ãã¼ãç¹å®ã®ãµããããã³ã«ã«å¾ãããã«ãããã®ã§ããã°ãå¿
ç¶çã«ãµã¼ãã¼ä¸ã«ç¹å¥ãªã³ã¼ããå¿
è¦ã«ãªãã¾ãã json
ãµããããã³ã«ã使ç¨ãã¦ããã¨ãã¾ãããããã®ãµããããã³ã«ã§ã¯ãã¹ã¦ã®ãã¼ã¿ã JSON ã¨ãã¦æ¸¡ããã¾ããã¯ã©ã¤ã¢ã³ãããã®ãããã³ã«ãè¦æ±ãããµã¼ãã¼ãããã使ç¨ãããå ´åããµã¼ãã¼ã¯ JSON ãã¼ãµã¼ãæã¤å¿
è¦ãããã¾ããå®éã«è¨ãã°ãããã¯ã©ã¤ãã©ãªã¼ã®ä¸é¨ã«ãªãã¾ããããµã¼ãã¼ã¯ãã¼ã¿ã渡ãå¿
è¦ãããã¾ãã
ã¡ã¢: ååã®ç«¶åãé¿ããããããµããããã³ã«åããã¡ã¤ã³æååã®ä¸é¨ã«ãããã¨ããå§ããã¾ããExample Inc. å°ç¨ã®ç¬èªã®å½¢å¼ã使ç¨ããã«ã¹ã¿ã ãã£ããã¢ããªãæ§ç¯ããå ´åã¯ã次ã®ããã«ä½¿ç¨ãã¾ã: Sec-WebSocket-Protocol: chat.example.com
ãããã¯å¿
é ã§ã¯ãªããã¨ã«æ³¨æãã¦ãã ãããããã¯åãªããªãã·ã§ã³ã§ããä»»æã®æååã使ç¨ã§ãã¾ãã
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4