åè®®å级æºå¶
HTTP/1.1 åè®®æä¾äºä¸ç§ä½¿ç¨ Upgrade æ 头忮µçç¹æ®æºå¶ï¼è¿ä¸æºå¶å
许å°ä¸ä¸ªå·²å»ºç«çè¿æ¥åçº§ææ°çãä¸ç¸å®¹çåè®®ã
è¿ä¸ªæºå¶æ¯å¯éçï¼å®å¹¶ä¸è½å¼ºå¶åè®®çæ´æ¹ï¼é常æ¥è¯´è¿ä¸æºå¶æ»æ¯ç±å®¢æ·ç«¯åèµ·çï¼ã妿å®ä»¬æ¯ææ°åè®®ï¼å®ç°çè³å¯ä»¥ä¸å©ç¨ upgradeï¼å¨å®è·µä¸ï¼è¿ç§æºå¶ä¸»è¦ç¨äºå¼å¯¼ WebSocket è¿æ¥ã
注æï¼HTTP/2 æç¡®ç¦æ¢ä½¿ç¨æ¤æºå¶ï¼è¿ä¸ªæºå¶åªå±äº HTTP/1.1ã
å级 HTTP/1.1 è¿æ¥
客æ·ç«¯ä½¿ç¨ Upgrade æ 头忮µè¯·æ±æå¡å¨ï¼ä»¥éåºä¼å
ç顺åºåæ¢å°å
¶ä¸ååºçä¸ä¸ªåè®®ã
å 为 Upgrade æ¯ä¸ä¸ªéè·³ï¼Hop-by-hopï¼æ 头ï¼å®è¿éè¦å¨ Connection æ 头忮µä¸ååºãè¿æå³çå
å« Upgrade çå
¸å请æ±ç±»ä¼¼äºï¼
GET /index.html HTTP/1.1
Host: www.example.com
Connection: upgrade
Upgrade: example/1, foo/2
æ ¹æ®ä¹åç请æ±çåè®®ï¼å¯è½éè¦å ¶ä»æ 头信æ¯ï¼ä¾å¦ï¼ä» HTTP/1.1 åçº§å° WebSocket å 许é ç½®æå ³ WebSocket è¿æ¥çæ 头详ç»ä¿¡æ¯ï¼ä»¥åå¨è¿æ¥æ¶æä¾ä¸å®ç¨åº¦çå®å ¨æ§ãæ¥çåçº§å° WebSocket åè®®çè¿æ¥è·åæ´å¤ä¿¡æ¯ã
妿æå¡å¨å³å®åçº§è¿æ¬¡è¿æ¥ï¼å°±ä¼è¿åä¸ä¸ª 101 Switching Protocols ååºç¶æç ï¼åä¸ä¸ªè¦åæ¢å°çåè®®çæ å¤´åæ®µ Upgradeã妿æå¡å¨æ²¡æï¼æè
ä¸è½ï¼åçº§è¿æ¬¡è¿æ¥ï¼å®ä¼å¿½ç¥å®¢æ·ç«¯åéç Upgrade æ 头忮µï¼è¿åä¸ä¸ªå¸¸è§çååºï¼ä¾å¦ä¸ä¸ª 200 OK).
å¨åé 101 ç¶æç ä¹åï¼æå¡å¨å¯ä»¥ä½¿ç¨æ°åè®®ï¼å¹¶æ ¹æ®éè¦æ§è¡ä»»ä½é¢å¤çç¹å®äºåè®®çæ¡æãå®é
ä¸ï¼ä¸æ¦è¿æ¬¡åçº§å®æäºï¼è¿æ¥å°±åæäºåå管éãå¹¶ä¸å¯ä»¥éè¿æ°åè®®å®æå¯å¨å级ç请æ±ã
å级æºå¶ç常ç¨åºå
æ¤å¤å°ä»ç»æå¸¸ç¨å° Upgrade æ 头çåºåã
åçº§å° websocket åè®®çè¿æ¥
è³ä»ä¸ºæ¢ï¼æç»å¸¸ä¼éè¦å级ä¸ä¸ª HTTP è¿æ¥çåºåå°±æ¯ä½¿ç¨ WebSocketï¼å®æ»æ¯éè¿å级 HTTP æ HTTPS è¿æ¥æ¥å®ç°ã请记ä½ï¼å½ä½ ç¨ WebSocket API 以åå ¶ä»å¤§é¨åå®ç° WebSocket çåºå»å»ºç«æ°çè¿æ¥æ¶ï¼åºæ¬ä¸é½ä¸ç¨æå¿å级çè¿ç¨ï¼å 为è¿äº API å·²ç»å®ç°äºè¿ä¸æ¥ãæ¯å¦ï¼ç¨å¦ä¸ API æå¼ä¸ä¸ª WebSocket è¿æ¥ï¼
webSocket = new WebSocket("ws://destination.server.ext", "optionalProtocol");
WebSocket() æé 彿°å·²ç»èªå¨å®æäºåéåå§ HTTP/1.1 è¿æ¥çææå·¥ä½ï¼ç¶åä¸ºä½ å¤çæ¡æåå级è¿ç¨ã
夿³¨ï¼ä½ ä¹å¯ä»¥ç¨ "wss://" URL æ¹å¼æ¥æå¼å®å
¨ç WebSocket è¿æ¥ã
妿æ³è¦èªå·±é头å®ç° WebSocket è¿æ¥ï¼å°±å¿
é¡»è¦å¤çæ¡æåå级è¿ç¨ãå¨å建åå§ HTTP/1.1 ä¼è¯ä¹åï¼ä½ éè¦åéå¦ä¸ä¸ª HTTP æ åè¯·æ±æ¥è¯·æ±å级ï¼ä½å¨æ 头ä¸è¦å¸¦ä¸ Upgrade å Connectionï¼ä¹å°±æ¯ï¼
Connection: Upgrade
Upgrade: websocket
WebSocket ä¸æçæ å¤´
以䏿 头æ¯å¨ WebSocket å级è¿ç¨ä¸ä¼åºç°çãé¤äº Upgrade å Connection æ 头ï¼å
¶ä½çé常æ¯å¯éçï¼æè
ç±æµè§å¨åæå¡å¨é½ä¼å¨äº¤äºè¿ç¨ä¸å¤ç好ã
Sec-WebSocket-Extensions
ç¨äºæå®ä¸ä¸ªæå¤ä¸ªè¯·æ±æå¡å¨ä½¿ç¨çå议级 WebSocket æ©å±ãå
许å¨ä¸ä¸ªè¯·æ±ä¸ä½¿ç¨å¤ä¸ª Sec-WebSocket-Extension æ 头ï¼ç»æè·å¨ä¸ä¸ªæ 头æä»¶ä¸å
å«äºææååºçæ©å±ä¸æ ·ã
Sec-WebSocket-Extensions: extensions
extensions-
æéè¦ï¼ææ¯æï¼çæ©å±çéå·åéå表ãè¿äºå¼æ¥èª IANA WebSocket æ©å±å注å表ãå¸¦åæ°çæ©å±ä½¿ç¨åå·è¡¨ç¤ºã
ä¾å¦ï¼
Sec-WebSocket-Extensions: superspeed, colormode; depth=16
Sec-WebSocket-Key
该æ 头åæå¡å¨æä¾ç¡®è®¤å®¢æ·ç«¯ææè¯·æ±åçº§å° WebSocket çæéä¿¡æ¯ãå½ä¸å®å ¨ï¼HTTPï¼å®¢æ·ç«¯å¸æå级æ¶ï¼å¯ä»¥ä½¿ç¨è¯¥æ 头ï¼ä»¥æä¾ä¸å®ç¨åº¦é²æ¢æ»¥ç¨çä¿æ¤ãå¯é¥ç弿¯ä½¿ç¨ WebSocket è§èä¸å®ä¹çç®æ³è®¡ç®çï¼å æ¤ä¸æä¾å®å ¨æ§ãç¸åï¼å®æå©äºé²æ¢é WebSocket 客æ·ç«¯æ æä¸ææ»¥ç¨è¯·æ± WebSocket è¿æ¥ãé£ä¹ï¼ä»æ¬è´¨ä¸è®²ï¼è¿ä¸ªå¯é¥æ¯ä¸ºäºç¡®è®¤âæ¯çï¼æççæ¯è¦æå¼ä¸ä¸ª WebSocket è¿æ¥ãâ
该æ 头ç±éæ©ä½¿ç¨å®ç客æ·ç«¯èªå¨æ·»å ï¼å®ä¸è½ä½¿ç¨ XMLHttpRequest.setRequestHeader() æ¹æ³æ·»å ã
Sec-WebSocket-Key: key
key-
æ¤è¯·æ±å级çå¯é¥ã妿客æ·ç«¯æ¿æï¼åæ·»å å®ï¼æå¡å¨å°å¨ååºä¸å å«ä¸ä¸ªèªå·±çå¯é¥ï¼å®¢æ·ç«¯å°å¨åä½ åéå级ååºä¹åéªè¯è¯¥å¯é¥ã
æå¡å¨ååºç Sec-WebSocket-Accept æ 头å°åºäºæå®ç key 计ç®çå¼ã
Sec-WebSocket-Protocol
Sec-WebSocket-Protocol æ 头æä¼å
é¡ºåºæå®ä½ 叿ç¨çä¸ä¸ªæè
å¤ä¸ª WebSocket åè®®ãå°æå¡å¨æ¯æç第ä¸ä¸ª WebSocket åè®®ï¼ç±æå¡å¨å¨ååºä¸å
å«ç Sec-WebSocket-Protocol æ 头ä¸éæ©å¹¶è¿åå®ãä½ å¯ä»¥å¨æ 头ä¸å¤æ¬¡ä½¿ç¨å®ï¼ç»æä¸å¨å个æ 头ä¸ä½¿ç¨éå·åéçååè®®æ è¯ç¬¦å表ç¸åã
Sec-WebSocket-Protocol: subprotocols
subprotocols-
以éå·åéçååè®®åç§°åè¡¨ï¼æä¼å é¡ºåºæåãååè®®å¯ä»¥ä» IANA WebSocket ååè®®å称注å表ä¸éæ©ï¼ä¹å¯ä»¥æ¯å®¢æ·ç«¯åæå¡å¨å ±åçè§£çèªå®ä¹åç§°ã
Sec-WebSocket-Version
è¯·æ±æ 头
æå®å®¢æ·ç«¯å¸æä½¿ç¨ç WebSocket åè®®çæ¬ï¼ä»¥ä¾¿æå¡å¨å¯ä»¥ç¡®è®¤å ¶æ¯å¦æ¯æè¯¥çæ¬ã
Sec-WebSocket-Version: version
version-
客æ·ç«¯å¨ä¸æå¡å¨éä¿¡æ¶å¸æä½¿ç¨ç WebSocket åè®®çæ¬ãæ¤ç¼å·åºè¯¥æ¯ IANA WebSocket çæ¬å·æ³¨å表å¯è½ååºçææ°çæ¬ãWebSocket åè®®çææ°æç»çæ¬æ¯çæ¬ 13ã
ååºæ 头
妿æå¡å¨æ æ³ä½¿ç¨æå®çæ¬ç Websocket åè®®è¿è¡éä¿¡ï¼å®å°ååºä¸ä¸ªé误ï¼ä¾å¦ 426 Upgrade Requiredï¼ï¼è¯¥é误å¨å®çæ 头ä¸å
å«ä¸ä¸ª Sec-WebSocket-Version æ 头ï¼å
¶ä¸å
嫿¯æçéå·åéå表çåè®®çæ¬ã妿æå¡å¨ç¡®å®æ¯æè¯·æ±çåè®®çæ¬ï¼åååºä¸ä¸å
å« Sec-WebSocket-Version æ 头ã
Sec-WebSocket-Version: supportedVersions
supportedVersions-
æå¡å¨æ¯æç WebSocket åè®®çæ¬çéå·åéå表ã
ä» ååºæ 头
æ¥èªæå¡å¨çååºå¯è½å å«è¿äºã
Sec-WebSocket-Accept
彿å¡å¨æ¿æåèµ· WebSocket è¿æ¥æ¶ï¼å ¶å å«å¨æå¼æ¡æè¿ç¨ä¸æ¥èªæå¡å¨çååºæ¶æ¯ä¸ãå®åªä¼å¨ååºæ 头ä¸åºç°ä¸æ¬¡ã
Sec-WebSocket-Accept: hash
hash-
妿æä¾äº
Sec-WebSocket-Keyæ 头ï¼é£ä¹å°éè¿ä»¥ä¸æµç¨è®¡ç®æ¤æ 头çå¼ï¼é¦å åå¯é¥çå¼ï¼ç¶åå°è¯¥å¼ä¸â258EAFA5-E914-47DA-95CA-C5AB0DC85B11âè¿è¡æ¼æ¥ï¼ååæ¼æ¥åçå符串ç SHA-1 æ£åãæå对å¾åºç 20 åèçå¼è¿è¡ base64 ç¼ç 以è·å¾è¯¥å±æ§çå¼ã
åè§
- WebSocket API
- HTTP
- è§èå RFCï¼