WebSocket

本页使用了标题或全文手工转换
维基百科ひゃっか自由じゆうてき百科ひゃっかぜん

WebSocketいち网络传输协议ざい单个TCP连接じょう进行ぜんそうこう通信つうしんOSI模型もけいてき应用层。WebSocket协议ざい2011ねんゆかりIETF标准RFC 6455きさきゆかりRFC 7936补充规范。Web IDLえいWeb IDLなかてきWebSocket APIゆかりW3C标准

WebSocket使とくきゃく户端和服わふく务器间的すうすえ交换变得さら简单,まこと许服务端ぬし动向きゃく户端推送すうすえざいWebSocket APIちゅう,浏览和服わふく务器ただ需要じゅよう完成かんせいいち握手あくしゅ,两者间就建立こんりゅう持久じきゅうせいてき连接,并进ぎょうそうむこうすうすえ传输。

简介[编辑]

WebSocketいち种与HTTP不同ふどうてき协议。两者OSI模型もけいてき应用层,并且赖于传输层てきTCP协议。 虽然它们不同ふどうただしRFC 6455ちゅう规定:it is designed to work over HTTP ports 80 and 443 as well as to support HTTP proxies and intermediaries(WebSocketどおり过HTTPはしこう80443进行工作こうさく,并支持しじHTTP代理だいりちゅうかい),从而使其与HTTP协议けんよう。 为了实现けんようせい,WebSocket握手あくしゅ使用しようHTTP Upgrade头[1]从HTTP协议更改こうかい为WebSocket协议。

WebSocket协议支持しじWeb浏览ある其他きゃく户端应用ほどじょあずかWebふく务器これ间的交互こうご具有ぐゆう较低てき开销,便びん于实现客户端あずかふく务器てき实时すうすえ传输。 ふく务器以通过标じゅんてき方式ほうしきらい实现,而无需客户端くびさき请求内容ないよう,并允许消いきざい保持ほじ连接开的どう时来かい传递。つう过这种方しき以在きゃく户端和服わふく务器间进ぎょうそうこう续对话。 通信つうしんどおり过TCPはしこう80ある443完成かんせい,这在防火ぼうか阻止そしWeb网络连接てき环境有益ゆうえきてき。另外,Cometこれ类的わざ术以标准てき方式ほうしき实现りょう类似てきそうこう通信つうしん

だい多数たすう浏览支持しじ该协议,包括ほうかつGoogle ChromeFirefoxSafariMicrosoft EdgeInternet ExplorerOpera

あずかHTTP不同ふどう,WebSocket提供ていきょうぜんそうこう通信つうしん[2][3]此外,WebSocket还可以在TCPうえ实现消息しょうそくりゅう。TCP单独处理节流,ぼつゆう固有こゆうてき消息しょうそく概念がいねんざいWebSocketまえ使用しようComet以实现全そうこう通信つうしんただしComet存在そんざいTCP握手あくしゅHTTP头的开销,いん此对于小消息しょうそくらい说效りつ很低。WebSocket协议むねざいかい决这些问题。

WebSocket协议规范しょうws(WebSocket)wss(WebSocket Secure)てい义为两个しんてき统一资源标识符(URI)方案ほうあん[4]ふん别对应明文和ふみかずみつ连接。じょりょう方案ほうあん名称めいしょうへんだんID(支持しじ#これがい,其余てきURI组件てい义为此URIてき通用つうよう语法。[5]

使用しよう浏览开发じん员工,开发じん员可以检查WebSocket握手あくしゅ以及WebSocketかまち[6]

历史[编辑]

WebSocket最初さいしょざいHTML5规范ちゅう引用いんよう为TCPConnection,さく为基于TCPてき套接APIてきうらない[7]2008ねん6がつMichael CarterえいMichael Carter (entrepreneur)进行りょういち系列けいれつ讨论,さい形成けいせいりょうしょう为WebSocketてき协议。[8]

“WebSocket”这个名字みょうじIan HicksonMichael Carterきさきざい #whatwg IRC聊天しつ创造てき[9]ずいきさきよしIan Hicksonせんうつし并列にゅうHTML5规范,并在Michael CarterてきCometdailyはくきゃくじょう宣布せんぷ[10]。 2009ねん12月,Google Chrome 4だい一个提供标准支持的浏览器,だま认情况下启用りょうWebSocket。[11]WebSocket协议てき开发ずいきさき于2010ねん2がつ从W3CWHATWGしょう组转うつりいたIETF,并在Ian Hicksonてきゆび导下进行りょう两次おさむ订。[12]

该协议被个浏览器だま支持しじ并启ようきさきRFC于2011ねん12月ざいIan Fette完成かんせい[13]

背景はいけい[编辑]

早期そうき,很多网站为了实现推送わざ所用しょようてきわざ术都轮询。轮询ゆびよし浏览ごとへだた一段いちだん时间(如每びょうこうふく务器发出HTTP请求,しかきさきふく务器かえしかい最新さいしんてきすうすえ给客户端。这种传统てきしき带来很明显的缺点けってんそく浏览需要じゅよう不断ふだんてきこうふく务器发出请求,しか而HTTP请求あずかかい复可能会のうかい包含ほうがん较长てき头部,其中真正しんせい有效ゆうこうてきすうすえ可能かのうただ很小てきいち部分ぶぶん所以ゆえん这样かい消耗しょうもう很多带宽资源。

较新てき轮询わざ术是Comet。这种わざ术虽しか以实现双こう通信つうしんただし仍然需要じゅようはん复发请求。而且ざいCometちゅう普遍ふへんさいようてきHTTP长连せっ也会消耗しょうもうふく务器资源。

ざい这种じょう况下,HTML5てい义了WebSocket协议,のうさらこのみてき节省ふく务器资源带宽,并且のう够更实时进行どおり讯。

Websocket使用しようwsあるwssてき统一资源标志符(URI)。其中wss表示ひょうじ使用しようりょうTLSてきWebsocket。如:

ws://example.com/wsapi
wss://secure.example.com/wsapi

WebsocketあずかHTTPHTTPS使用しようしょうどうてきTCPはしこう以绕过大多数たすう防火ぼうかまとげんせいだま认情况下,Websocket协议使用しよう80はしこう;运行ざいTLSうえ时,だま使用しよう443はしこう

优点[编辑]

  • 较少てきひかえせい开销。ざい连接建立こんりゅうきさきふく务器きゃく户端间交换数すえ时,よう于协议控せいてきすうすえつつみ头部しょう对较しょうざい包含ほうがん扩展てきじょう况下,对于ふく务器いたきゃく户端てき内容ないよう,此头大小だいしょうただゆう2いたり10すうすえつつみ长度ゆう关);对于きゃく户端いたふく务器てき内容ないよう,此头还需ようじょう额外てき4节的掩码あい对于HTTP请求每次まいじよう携带かんせいてき头部,此项开销显著减少りょう
  • さら强的ごうてき实时せいよし于协议是ぜんそうこうてき所以ゆえんふく务器以随时主动给きゃく户端发数すえあい对于HTTP请求需要じゅようとうまちきゃく户端发起请求ふく务端才能さいのう响应,のべ迟明显更しょうそく使Cometとう类似てき长轮询较,其也のうざいたん时间ないさらつぎ传递すうすえ
  • 保持ほじ连接じょう态。あずかHTTP不同ふどうてき,Websocket需要じゅようさき建立こんりゅう连接,这就使とく其成为一种有状态的协议,これきさき通信つうしん时可以省略しょうりゃく部分ぶぶんじょう态信いき。而HTTP请求可能かのう需要じゅようざいまい个请もとめ携带じょう态信いき(如身份认证等)。
  • さらこのみてき进制支持しじ。Websocketてい义了进制帧,そう对HTTP,以更轻松处理进制内容ないよう
  • 支持しじ扩展。Websocketてい义了扩展,よう户可以扩てん协议、实现部分ぶぶんてい义的协议。如部分ぶぶん浏览支持しじ压缩ひとし
  • さらこのみてき压缩效果こうかあい对于HTTP压缩,Websocketざい适当てき扩展支持しじ以沿ようぜん内容ないようてき上下じょうげぶんざい传递类似てきすうすえ时,以显ちょひさげだか压缩りつ[14]

握手あくしゅ协议[编辑]

WebSocket 独立どくりつてき建立こんりゅうざいTCPじょうてき协议。

Websocket どおりHTTP/1.1 协议てき101じょう态码进行握手あくしゅ

为了建立こんりゅうWebsocket连接,需要じゅようどおり过浏览器发出请求,これきさきふく务器进行かい应,这个过程通常つうじょうしょう为“握手あくしゅ”(Handshaking)。

れい[编辑]

いち个典がたてきWebsocket握手あくしゅ请求如下[15]

きゃく户端请求:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13

ふく务器かい应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat

だん说明[编辑]

  • Connection必须设置Upgrade,表示ひょうじきゃく户端希望きぼう连接ます级。
  • Upgradeだん必须设置Websocket,表示ひょうじ希望きぼうます级到Websocket协议。
  • Sec-WebSocket-Keyずいつくえてきくしふく务器はしかいよう这些すうすえらい构造いち个SHA-1てきしんいき摘要てきよう“Sec-WebSocket-Key”じょう一个特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,しかきさき计算SHA-1摘要てきようこれきさき进行Base64编码,はた结果做为“Sec-WebSocket-Accept”头的值,かえしかい给客户端。如此操作そうさ以尽りょう避免普通ふつうHTTP请求误认为Websocket协议。
  • Sec-WebSocket-Version 表示ひょうじ支持しじてきWebsocket版本はんぽん。RFC6455要求ようきゅう使用しようてき版本はんぽん13,ぜん草案そうあんてき版本はんぽんひとし应当弃用。
  • Originだん必须てき。如果かけしょうoriginだん,WebSocketふく务器需要じゅようかい复HTTP 403 じょう态码(禁止きんし访问)。[16]
  • 其他いち些定义在HTTP协议ちゅうてきだん,如Cookieひとし,也可以在Websocketちゅう使用しよう

浏览支持しじ[编辑]

WebSocket协议てき安全あんぜん版本はんぽんざいFirefox 6[17]、Safari 6、Google Chrome 14[18]、Opera 12.10Internet Explorer 10ちゅう实现。[19]详细てき协议测试套件报告[20]れつりょう这些浏览あずか特定とくてい协议方面ほうめんてき一致いっちせい

Opera 11Safari 5ちゅう实现りょう较旧てきふと安全あんぜんてき协议版本はんぽん,以及iOS 4.2ちゅうてきSafariうつり版本はんぽん[21]OS7ちゅうてきBlackBerry Browser实现りょうWebSockets。[22]よし存在そんざいほら,它在Firefox 45[23]以及Opera 11ちゅうきんよう[24]

所有しょゆう最新さいしんてき浏览支持しじ最新さいしん规范(RFC 6455てきWebSocket协议。一个详细的测试报告[20]れつりょう这些浏览支持しじてきWebsocket版本はんぽん

浏览支持しじ现状
协议 发布 IE Firefox[25](个人电脑) Firefox (Android) Chrome(个人电脑,つくえ Safari(Mac, iOS) Opera(个人电脑,つくえ Android浏览
hixie-75页面そん档备份そん互联网档あん 2010ねん2がつ4にち 4 5.0.0
hixie-76页面そん档备份そん互联网档あん
hybi-00页面そん档备份そん互联网档あん
2010ねん5がつ10日とおか
2010ねん5がつ23にち
4.0(やめきんよう 6 5.0.1 11.00(やめきんよう
7 hybi-07页面そん档备份そん互联网档あん 2011ねん4がつ22にち 6[26]1
8 hybi-10页面そん档备份そん互联网档あん 2011ねん7がつ11にち 7[27]1 7 14[28]
13 RFC 6455 2011ねん12月 10[29] 11 11 16[30] 6 12.10[31] 4.4[32]

1もと于Gecko 6–10版本はんぽんてき浏览てきWebSocket对象为“mozwebsocket”,[33]需要じゅよう添加てんか额外てきだい码。

ふく务器[编辑]

ざいふく务器方面ほうめん,网上ゆう不同ふどう对websocket支持しじてきふく务器:

参考さんこう资料[编辑]

  1. ^ Ian Fette; Alexey Melnikov. Relationship to TCP and HTTP. RFC 6455 The WebSocket Protocol. IETF. December 2011: sec. 1.7. RFC 6455. 
  2. ^ Glossary:WebSockets. Mozilla Developer Network. 2015 [2019-05-09]. (原始げんし内容ないようそん于2016-09-14). 
  3. ^ HTML5 WebSocket: A Quantum Leap in Scalability for the Web. [2019-05-09]. (原始げんし内容ないようそん档于2021-04-01). 
  4. ^ Graham Klyne (编). IANA Uniform Resource Identifer (URI) Schemes. Internet Assigned Numbers Authority. 2011-11-14 [2011-12-10]. (原始げんし内容ないようそん于2013-04-25). 
  5. ^ Ian Fette; Alexey Melnikov. WebSocket URIs. RFC 6455 The WebSocket Protocol. IETF. December 2011: sec. 3. RFC 6455. 
  6. ^ Wang, Vanessa; Salim, Frank; Moskovits, Peter. APPENDIX A: WebSocket Frame Inspection with Google Chrome Developer Tools. The Definitive Guide to HTML5 WebSocket. Apress. February 2013 [7 April 2013]. ISBN 978-1-4302-4740-1. (原始げんし内容ないようそん于2015-12-31). 
  7. ^ HTML 5. www.w3.org. [2016-04-17]. (原始げんし内容ないようそん于2016-09-16). 
  8. ^ [whatwg] TCPConnection feedback from Michael Carter on 2008-06-18 (whatwg.org from June 2008). lists.w3.org. [2016-04-17]. (原始げんし内容ないようそん于2016-04-27). 
  9. ^ IRC logs: freenode / #whatwg / 20080618. krijnhoetmer.nl. [2016-04-18]. (原始げんし内容ないようそん于2016-08-21). 
  10. ^ Comet Daily » Blog Archive » Independence Day: HTML5 WebSocket Liberates Comet From Hacks. [2016-04-17]. (原始げんし内容ないようそん档于2016-04-23). 
  11. ^ Web Sockets Now Available In Google Chrome. Chromium Blog. [2016-04-17]. (原始げんし内容ないようそん档于2021-12-09) 美国びくにえい语). 
  12. ^ <ian@hixie.ch>, Ian Hickson. The WebSocket protocol. tools.ietf.org. [2016-04-17]. (原始げんし内容ないようそん于2017-03-17). 
  13. ^ <ian@hixie.ch>, Ian Hickson. The WebSocket protocol. tools.ietf.org. [2016-04-17]. (原始げんし内容ないようそん于2017-03-06). 
  14. ^ そん副本ふくほん. [2017-01-17]. (原始げんし内容ないようそん档于2020-11-11). 
  15. ^ そん副本ふくほん. [2019-05-09]. (原始げんし内容ないようそん于2017-03-06). 
  16. ^ RFC 6455 - The WebSocket Protocol. IETF Tools. [2019-05-09]. (原始げんし内容ないようそん档于2017-03-06). Servers that are not intended to process input from any web page but only for certain sites SHOULD verify the |Origin| field is an origin they expect. If the origin indicated is unacceptable to the server, then it SHOULD respond to the WebSocket handshake with a reply containing HTTP 403 Forbidden status code. 
  17. ^ Dirkjan Ochtman. WebSocket enabled in Firefox 6. Mozilla.org. May 27, 2011 [2011-06-30]. (原始げんし内容ないようそん档于2012-05-26). 
  18. ^ Chromium Web Platform Status. [2011-08-03]. (原始げんし内容ないようそん于2017-03-04). 
  19. ^ WebSockets (Windows). Microsoft. 2012-09-28 [2012-11-07]. (原始げんし内容ないようそん于2015-03-25). 
  20. ^ 20.0 20.1 WebSockets Protocol Test Report. Tavendo.de. 2011-10-27 [2011-12-10]. (原始げんし内容ないようそん档于2016-09-22). 
  21. ^ Katie Marsal. Apple adds accelerometer, WebSockets support to Safari in iOS 4.2. AppleInsider.com. November 23, 2010 [2011-05-09]. (原始げんし内容ないようそん于2013-07-17). 
  22. ^ Web Sockets API. BlackBerry. [8 July 2011]. (原始げんし内容ないようそん档于2011-06-10). 
  23. ^ Chris Heilmann. WebSocket disabled in Firefox 4. Hacks.Mozilla.org. December 8, 2010 [2011-05-09]. (原始げんし内容ないようそん于2017-03-06). 
  24. ^ Aleksander Aas. Regarding WebSocket. My Opera Blog. December 10, 2010 [2011-05-09]. (原始げんし内容ないようそん于2010-12-15). 
  25. ^ WebSockets (support in Firefox). Developer.mozilla.org. 2011-09-30 [2011-12-10]. (原始げんし内容ないようそん档于2012-05-26). 
  26. ^ Bug 640003 - WebSockets - upgrade to ietf-06. Bugzilla.mozilla.org. [2011-12-10]. (原始げんし内容ないようそん档于2021-04-01). 
  27. ^ WebSockets - upgrade to ietf-07页面そん档备份そん互联网档あん)>
  28. ^ Chromium bug 64470. Code.google.com. 2010-11-25 [2011-12-10]. (原始げんし内容ないようそん档于2015-12-31). 
  29. ^ WebSockets in Windows Consumer Preview. IE Engineering Team. 2012-03-19 [2012-07-23]. (原始げんし内容ないようそん于2012-08-07). 
  30. ^ WebKit Changeset 97247: WebSocket: Update WebSocket protocol to hybi-17. Trac.webkit.org. [2011-12-10]. (原始げんし内容ないようそん档于2015-12-31). 
  31. ^ A hot Opera 12.50 summer-time snapshot. Opera Developer News. [2012-08-03]. (原始げんし内容ないようそん档于2012-08-05). 
  32. ^ Compatibility tables for support of HTML5, CSS3, SVG and more in desktop and mobile browsers. caniuse.com. [2014-02-10]. (原始げんし内容ないようそん于2017-04-08). 
  33. ^ WebSockets - MDN. Developer.mozilla.org. 2011-09-30 [2011-12-10]. (原始げんし内容ないようそん档于2012-05-26).