Appearance
Appearance
WebSocket 是一种在单个 TCP 连接上提供全双工通信通道的协议。WebSocket 协议由 IETF 于 2011 年标准化为 RFC 6455,而 Web IDL 中的 WebSocket API 正在由 W3C 标准化。
WebSocket 设计用于在 Web 浏览器和 Web 服务器中实现,但也可供任何客户端或服务器应用程序使用。WebSocket Protocol 是一种独立的、基于 TCP 的协议。它与 HTTP 的唯一关系是,其握手会被 HTTP 服务器解释为 Upgrade 请求。WebSocket 协议使浏览器与 Web 服务器之间可以进行更多交互,便于与服务器之间进行实时数据传输。这是通过提供一种标准化方式实现的:服务器无需客户端请求即可向浏览器发送内容,并且允许在保持连接打开的同时来回传递消息。通过这种方式,浏览器与服务器之间可以进行持续的双向(bi-directional)会话。通信通过 TCP 端口号 80 进行,这对于那些使用防火墙阻止非 Web Internet 连接的环境很有帮助。类似的双向浏览器-服务器通信也曾通过 Comet 等权宜技术以非标准化方式实现。
WebSocket 协议规范定义了 ws 和 wss 这两个新的统一资源标识符(URI)方案,分别用于未加密和加密连接。除方案名称和片段(不支持 #)之外,URI 的其余组成部分定义为使用 URI 通用语法。
WebSocket 协议目前受到大多数主流浏览器支持,包括 Microsoft Edge、Google Chrome、Internet Explorer、Firefox、Safari 和 Opera。WebSocket 还要求服务器上的 Web 应用程序支持它。
WebSocket 最初在 HTML5 规范中以 TCPConnection 的形式被提及,作为基于 TCP 的 socket API 的占位符。2008 年 6 月,Michael Carter 主导了一系列讨论,产生了该协议的第一个版本,即 WebSocket。
Websocket 这个名称随后不久由 Ian Hickson 和 Michael Carter 在 #whatwg IRC 聊天室协作时创造,之后由 Ian Hickson 撰写并纳入 HTML5 规范,并由 Michael Carter 在 cometdaily 博客上宣布。2009 年 12 月,Google Chrome 成为第一个完整支持该标准的浏览器,并默认启用 WebSocket。随后,WebSocket 协议的开发于 2010 年 2 月从 W3C 和 whatwg 小组转移到 IETF,并由 Ian Hickson 主导完成了两个修订版本。
在该协议发布并在多个浏览器中默认启用后,RFC 于 2011 年 12 月在 Ian Fette 主导下最终完成。
要建立 WebSocket 连接,客户端会发送 WebSocket 握手请求,服务器则返回 WebSocket 握手响应,如下例所示。
客户端请求(与 HTTP 中一样,每一行以 \r\n 结尾,并且末尾必须有一个额外的空行):
GET / HTTP/1.1Host: 192.168.43.135:12345Connection: UpgradePragma: no-cacheCache-Control: no-cacheUpgrade: websocketOrigin: file://Sec-WebSocket-Version: 13User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36Accept-Encoding: gzip, deflate, sdchAccept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4Sec-WebSocket-Key: bKdPyn3u98cTfZJSh4TNeQ==Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits服务器响应:
HTTP/1.1 101 Switching ProtocolsUpgrade: websocketConnection: UpgradeSec-WebSocket-Accept: 4EaeSCkuOGBy+rjOSJSMV+VMoC0=WebSocket-Origin: file://WebSocket-Location: ws://192.168.43.135:12345/下面是 Python WebSocket Server 与 JavaScript 客户端之间数据传输的示例。
从服务器到客户端的示例:
Frame 7: 79 bytes on wire (632 bits), 79 bytes captured (632 bits)Ethernet II, Src: Vmware_8a:3d:a7 (00:0c:29:8a:3d:a7), Dst: Vmware_c0:00:08 (00:50:56:c0:00:08)Internet Protocol Version 4, Src: 192.168.43.135, Dst: 192.168.43.1Transmission Control Protocol, Src Port: 12345, Dst Port: 50999, Seq: 205, Ack: 510, Len: 25WebSocket 1... .... = Fin: True .000 .... = Reserved: 0x0 .... 0001 = Opcode: Text (1) 0... .... = Mask: False .001 0111 = Payload length: 23 PayloadJavaScript Object NotationLine-based text data Welcome, 192.168.43.1 !从客户端到服务器的示例:
Frame 9: 72 bytes on wire (576 bits), 72 bytes captured (576 bits)Ethernet II, Src: Vmware_c0:00:08 (00:50:56:c0:00:08), Dst: Vmware_8a:3d:a7 (00:0c:29:8a:3d:a7)Internet Protocol Version 4, Src: 192.168.43.1, Dst: 192.168.43.135Transmission Control Protocol, Src Port: 50999, Dst Port: 12345, Seq: 510, Ack: 230, Len: 18WebSocket 1... .... = Fin: True .000 .... = Reserved: 0x0 .... 0001 = Opcode: Text (1) 1... .... = Mask: True .000 1100 = Payload length: 12 Masking-Key: e17e8eb9 Masked payload PayloadJavaScript Object NotationLine-based text data test messageWireshark dissector 对 WebSocket 协议功能完整。
由于 WebSocket 仍然相当新,因此 Wireshark 中没有太多首选项设置选项。
WebSocket
完整的 WebSocket 显示过滤器字段列表可在显示过滤器参考中找到
仅显示基于 WebSocket 的流量:
websocket抓包时不能直接过滤 WebSocket 协议。不过,如果你知道所使用的 TCP 端口(见上文),可以按该端口进行过滤。
仅捕获默认端口(80)上的 WebSocket 流量:
tcp port 80W3C WebSocket APIWHATWG HTML Living Standard
RFC 6455The WebSocket Protocol RFC 标准
https://github.com/wencwan/networking一个 Python WebSocket Server 和 javascript WebSocket Clinet 示例
Imported from https://wiki.wireshark.org/WebSocket on 2020-08-11 23:27:24 UTC