理论:
它基于TCP传输协议,并复用HTTP的握手通道,属于应用层协议
Socket 是传输控制层协议,WebSocket 是应用层协议。
- 建立连接
- 交换数据
- 数据帧格式
- 维持连接
1.建立连接
首先,客户端发起协议升级请求。可以看到,采用的是标准的HTTP报文格式,且只支持GET
方法。[将数据放到socket里发送]
GET / HTTP/1.1 Host: localhost:8080 Origin: http://127.0.0.1:3000 Connection: Upgrade # 表示要升级协议 Upgrade: websocket # 表示要升级到websocket协议。 Sec-WebSocket-Version: 13 # 表示websocket的版本。如果服务端不支持该版本,需要返回一个Sec-WebSocket-Versionheader,里面包含服务端支持的版本号。 Sec-WebSocket-Key: w4v7O6xFTi36lq3RNcgctw== # 与后面服务端响应首部的Sec-WebSocket-Accept是配套的,提供基本的防护,比如恶意的连接,或者无意的连接。
服务端返回内容如下,状态代码101
表示协议切换。到此完成协议升级,后续的数据交互都按照新的协议来。
HTTP/1.1 101 Switching Protocols Connection:Upgrade Upgrade: websocket Sec-WebSocket-Accept: Oy4NRAQ13jhfONC7bP8dTKb4PTU= #Sec-WebSocket-Accept由Sec-WebSocket-Key计算得出: toBase64( sha1( Sec-WebSocket-Key + 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 ) )
2.交换数据
一旦WebSocket客户端、服务端建立连接后,后续的操作都是基于数据帧的传递。
WebSocket根据opcode
来区分操作的类型。比如0x8
表示断开连接,0x0
-0x2
表示数据交互。
3.数据帧格式
略
4.维持连接
发送心跳,ping pong
具体使用:
浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器端就可以通过 TCP 连接直接交换数据。
当你获取 Web Socket 连接后,你可以通过 send() 方法来向服务器发送数据,并通过 onmessage 事件来接收服务器返回的数据。
以下 API 用于创建 WebSocket 对象。