go语言http长连接的简单介绍( 十 )


什么是WebSocket?
WSS(Web Socket Secure)是WebSocket的加密版本 。
SLB对WebSocket的支持
查看阿里云SLB文档对WS的支持,说明SLB是支持WS协议的 , 并且SLB对于WS无需配置,只需要选用HTTP监听时 , 就能够转发WS协议 。说明WS协议在SLB这边看来就是一个HTTP,这样WS走的也是七层的转发服务 。只要SLB能够正常识别WS握手协议里Request的cookie和正常识别服务器返回的Response并且往里面插入cookie,就可以利用会话保持解决重连问题 。
Go语言实现WS服务器有两种方法,一种是利用golang.org/x/net下的websocket包,另外一种方法就是自己解读Websocket协议来实现 , 由于WS协议一样是基于TCP协议之上 , 完全可以通过监听TCP端口来实现 。
客户端发送Request消息
服务器返回Response消息
其中服务器返回的Sec-WebSocket-Accept字段 , 主要是用于客户端需要验证服务器是否支持WS 。RFC6455文档中规定,在WebSocket通信协议中服务端为了证实已经接收了握手,它需要把两部分的数据合并成一个响应 。一部分信息来自客户端握手的Sec-WebSocket-Keyt头字段:Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== 。对于这个字段,服务端必须得到这个值(头字段中经过base64编码的值减去前后的空格)并与GUID"258EAFA5-E914-47DA-95CA-C5AB0DC85B11"组合成一个字符串 , 这个字符串对于不懂WebSocket协议的网络终端来说是不能使用的 。这个组合经过SHA-1掩码,base64编码后在服务端的握手中返回 。如果这个Sec-WebSocket-Accept计算错误浏览器会提示:Sec-WebSocket-Accept dismatch
如果返回成功 , Websocket就会回调onopen事件
游戏服务器的使用的TCP协议,是在协议的包头使用4Byte来声明本协议长度,然后将协议一次性发送 。但是在WS协议是通过Frame形式发送的,会将一条消息分为几个frame , 按照先后顺序传输出去 。这样做会有几个好处:
websocket的协议格式:
参数说明如下:
阿里云的SLB开启HTTP监听后,会检查过往的Request和Response请求,收到服务器返回的Response后,会往Response插入一个Cookie
客户端收到服务器的Response后,可以在Header中查到有个“Set-Cookie”字段 , 里面是SLB插入的Cookie值
客户端断开连接后 , 下次发送请求需要往Headers插入Cookie字段
分别在阿里云的两台ECS实例上部署WS服务器 , 打开8000端口,开启一个SLB服务,SLB服务选择HTTP方式监听,并且打开会话保持功能 , Cookie处理方式选择植入Cookie 。Demo服务器没有做HTTP健康监听的处理,健康检查这块可以先关掉 。
在两台ECS上启动WS服务器,然后本地运行客户端,分别测试两台服务器是否能正常连接,测试完毕后,测试SLB能否正常工作 。服务器和SLB都正常的情况下 , 运行客户端,客户端会得到以下结果
收到的三次Cookie都相同,说明Cookie是有正常植入工作的,并且三次都被SLB正确抓取了 。
收到的三次serverId也都是同样的值,说明三次都是同一个ECS上的服务器响应 。
至此,验证成功 。
Websocket+SLB会话保持能够解决超时重连和切换网络时重连的问题 。
参考:
阿里云会话保持
解答Wi-Fi与4G网络切换的困惑
WebSocket的实现原理
阿里云SLB对WebSocket的支持
HTTP Headers和Cookie
go语言http长连接的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、go语言http长连接的信息别忘了在本站进行查找喔 。

推荐阅读