上文中提到websocket连接,本文针对websocket进行简单的了解。
WebSocket 协议在2008年诞生,2011年成为国际标准。WebSocket 协议本质上是一个基于 TCP 的协议(应用层的协议,不是socket)。是建立在 TCP 协议之上的全双工通讯协议,与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。
基于tcp或者说是http的握手过程
为了建立一个 WebSocket 连接,客户端首先要向服务器发起一个 HTTP 请求,这个请求和通常的 HTTP 请求不同,包含了一些附加头信息。如下所示:
客户端请求header信息
、、、
--- request header ---
GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:8001
Origin: http://127.0.0.1:8001
Sec-WebSocket-Key: hj0eNqbhE/A0GkBXDRrYYw==
Sec-WebSocket-Version: 13
、、、
其中附加头信息"Upgrade: WebSocket"表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息,根据Sec-WebSocket-Key的字符串,通过sha1算法处理,将response信息(sec-Websocket-Accept字符串)返回给客户端,客户端能成功解码字符串,就和服务器端的 WebSocket连接就建立起来了。
服务端response
、、、
HTTP/1.1 101 Switching Protocols
Content-Length: 0
Upgrade: websocket
Sec-Websocket-Accept: ZEs+c+VBk8Aj01+wJGN7Y15796g=
Server: TornadoServer/4.5.1
Connection: Upgrade
Date: Wed, 21 Jun 2020 06:29:14 GMT
、、、
双方就可以通过这个连接通道自由的传递信息,并且这个连接会持续存在直到客户端或者服务器端的某一方主动的关闭连接。
facebook的SocketRocket
使用很简单,其中的心跳重连机制需要自己处理,每一分钟发送一个空的报文,保证服务器是在工作中,不浪费资源。
网友评论