前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >websocket protocal

websocket protocal

作者头像
WindWant
发布2020-09-11 11:34:54
1.5K0
发布2020-09-11 11:34:54
举报
文章被收录于专栏:后端码事

ame-orgins:浏览器同源策略的安全模型

持久化协议

双向双工 多路复用, 同时发信息

区别HTTP连接特点:

  • http只能由客户端发起,一个request对应一个response
  • http每次通信需要发起连接,或者keepalived只能复用连接
  • http 头信息繁重

Websocket连接:

  • 单一的TCP连接,采用全双工通信 vs 单向传送,需要多条连接
  • 对代理,防火墙和路由透明: 基于http协议结构,使用相同80 443端口
  • 连接建立后,信息传输无头部信息,减少网络带宽消耗、cookie和身份验证
  • 无安全开销
  • 通过ping/pong帧保持链路激活
  • 服务器可以推消息。

websocket本质上是一个TCP连接

建立连接:发送http请求(upgrade:websocket升级),TCP三次握手,建立连接。

请求:

代码语言:javascript
复制
GET / HTTP/1.1
Host:
Upgrade: websocket
Connection: Upgrade
Sec-Websocket-Key:  BASE-64编码(randomly selected 16-byte value)
Origin:  cross-origin check
Sec-Websocket-Protocal: chat,superchat  //客户端希望使用的协议,one or more comma-separated subprotocol the client wishes to speak, ordered by preference
Sec-Websocket-Version: 13(must be)

回复:

代码语言:javascript
复制
HTTP/1.1 101 Switching Protocals //协议转换
Upgrade: websocket
Connection: Upgrade
Sec-Websocket-Accept: BASE-64编码(SHA-1加密(Sec-Websocket-Key==GUID(Globally Unique Identifier)("258EAFA5-E914-47DA-95CA-C5AB0DC85B11")))
Sec-Websocket-protocal: chat

传送数据:文本、二进制、控制帧等

handshake and then data transfer

基于TCP的独立协议;

由http server解析握手连接(Upgrade request) 80 443

Websocket URI:

ws-URI = "ws:" "//" host [ ":" port ] path [ "?" query ]

wss-URI = "wss:" "//" host [ ":" port ] path [ "?" query ]

host = <host, defined in [RFC3986], Section 3.2.2>

port = <port, defined in [RFC3986], Section 3.2.3>

path = <path-abempty, defined in [RFC3986], Section 3.3>

query = <query, defined in [RFC3986], Section 3.4>

if the client is a web browser, it supplies /origin/.

数据传输:一连串的帧(frames)

二进制:

协议:

|Opcode | Meaning | Reference |

-+--------+-------------------------------------+-----------|

| 0 | Continuation Frame | RFC 6455 |

-+--------+-------------------------------------+-----------|

| 1 | Text Frame | RFC 6455 |

-+--------+-------------------------------------+-----------|

| 2 | Binary Frame | RFC 6455 |

-+--------+-------------------------------------+-----------|

| 8 | Connection Close Frame | RFC 6455 |

-+--------+-------------------------------------+-----------|

| 9 | Ping Frame | RFC 6455 |

-+--------+-------------------------------------+-----------|

| 10 | Pong Frame | RFC 6455 |

-+--------+-------------------------------------+-----------|

fin:标识消息的最后一部分

opcode:消息体说明

* %x0 denotes a continuation frame

* %x1 denotes a text frame

* %x2 denotes a binary frame

* %x3-7 are reserved for further non-control frames

* %x8 denotes a connection close

* %x9 denotes a ping

* %xA denotes a pong

* %xB-F are reserved for further control frames

mask: 1 masked,0 unmasked

当为1时,mask-key赋值,用于服务器端 unmask payload data

客户端发送到服务端的数据都必须mask

payload length:7 bits, 7+16 bits, or 7+64 bits

7 bits:0-125 payload length

7+16 bits:16-bit unsigned integer are the payload length

7+64 bits:64-bit unsigned integer (the most significant bit MUST be 0) are the payload length

The payload length is the length of the "Extension data" + the length of the "Application data".

masking-key:0 | 4 bytes, chosen at random by the client,不影响payload data的数据长度

payload data:Extension data + Application data

数据分片:fragmentation:

main purpose:允许在不缓存完整消息的情况下发送未知大小的消息。使用数据分片,服务器或者中间媒介可以选择一个合适大小的缓存,来缓存及发送fragment

sub:multiplexing,多路分发,

Control frames MAY be injected in the middle of a fragmented message. Control frames themselves MUST NOT be fragmented.

delivered in the order send by the sender

不同消息不允许交叉存取分片

基本传输结构:

A fragmented message consists of a single frame with the FIN bit clear and an opcode other than 0, followed by zero or more frames with the FIN bit clear and the opcode set to 0, and terminated by a single frame with the FIN bit set and an pcode of 0.

control frames:

0x8 (Close), 0x9 (Ping), 0xA (Pong), 0xB-0xF reserved

communicate state with websocket

can be interjected in the middle of a fragmented message: 减少因为大体量消息控制帧的延迟

payload length < 125

must not be fragmented

连接断开 close frame:

客户端发送close frame

客户端等待服务端断开连接,

当服务端收到close frame, 会等待消息发送完毕再返回close frame

服务端立即断开tcp连接,

客户端可以在任何时刻关闭连接。

ping frame: opcode---0x9 serve as a keepalive or as means to verify remote endpoint

pong frame:opcode---0xA

必须包含对应ping的 Application data

回复最近的 ping frame

可能的服务器端单向主动的pong frame,不需要回复。

data frame:

opcode---0x1:text data encoded as UTF-8

opcode---0x2:binary

websocket 可以使用任何http使用的安全验证方式。

websocket机密性和完整性通过使用 websocket protocal over tls 即 wss

底层网络协议,

倾向于使浏览器成为一个与操作系统相仿的应用程序平台。

低级网络API无法处理源安全模型。

实时通讯;支持二进制和字符串传输。

SPDY:扩充了Http,通过压缩http首部标识和多路复用,工作管道等手段改进http请求性能。改进网页性能。http的修改形式,修改了许多http非本质问题,

Websocket API是完全事件驱动的,自动发送数据和通知。遵循异步编程模式。监听事件。open message error close。String Blob ArrayBuffer

var blob = new Blob("blob data");

ws.send(blob);

var array = new Unit8Array([2,3,4,5,6]);

ws.send(array.buffer);

readyState

websocket send()时立即生效的,但是浏览器对于发送的数据会进行缓存;使用bufferedAmount检查已经进入队列但是尚未发送到服务器的字节数,不包括协议帧组或者操作系统,网络硬件所进行的缓存。

关闭前检查bufferedAmount是否有为发送数据。

传输层协议。

websocket pingpong机制,保持连接存活。

ref:The WebSocket Protocol

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-09-29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
多因子身份认证
多因子身份认证(Multi-factor Authentication Service,MFAS)的目的是建立一个多层次的防御体系,通过结合两种或三种认证因子(基于记忆的/基于持有物的/基于生物特征的认证因子)验证访问者的身份,使系统或资源更加安全。攻击者即使破解单一因子(如口令、人脸),应用的安全依然可以得到保障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档