关于WebSocket的一些总结

作者: NickYang 分类: 技术文章 发布时间: 2018-06-04 11:27

WebSocket下面简称ws

ws出现之前的http连接

在ws出现以前,http都是客户端发起-服务器回应的模式,全靠客户端主动交流,服务器完全是被动等待请求,回复数据。如果需要服务器主动推送信息给客户端(例如现在手机上的应用提醒),只能靠客户端主动pullinglong pulling不间断的请求服务器获取数据,并且http是无状态的,每次请求数据的时候都需要带认证信息,还需要每次进行tcp连接,非常消耗资源。

关于 pullinglong pulling 的介绍,点击查看

WebSocket协议

先来看一个ws的握手请求

GET / HTTP/1.1
Host: 127.0.0.1:8080
Connection: Upgrade
Upgrade: websocket
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: VR+OReqwhymoQ21dBtoIMQ==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits

跟http类似,不过需要带上Connection和Upgrade域,告诉服务器,我要升级为ws连接,
各个域介绍是:
* 必须是有效的http request格式
* HTTP request method 必须是GET,协议应不小于1.1 如: Get / HTTP/1.1
* 必须包括Upgrade头域,并且其值为websocket
* 必须包括Connection头域,并且其值为Upgrade
* 必须包括Sec-WebSocket-Key头域,其值采用base64编码的随机16字节长的字符序列
* 如果请求来自浏览器客户端,还必须包括Origin头域 。 该头域用于防止未授权的跨域脚本攻击,服务器可以从Origin决定是否接受该WebSocket连接
* 必须包括Sec-webSocket-Version头域,当前值必须是13
* 可能包括Sec-WebSocket-Protocol,表示client(应用程序)支持的协议列表,server选择一个或者没有可接受的协议响应之
* 可能包括Sec-WebSocket-Extensions, 协议扩展, 某类协议可能支持多个扩展,通过它可以实现协议增强
* 可能包括任意其他域,如cookie

服务器端响应如下:

HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: Y+Te7S7wQJC0FwXumEdGbv9/Mek=

说明:
* 必须包括Upgrade头域,并且其值为websocket
* 必须包括Connection头域,并且其值为Upgrade
* 必须包括Sec-WebSocket-Accept头域,其值是将请求包Sec-WebSocket-Key的值,与258EAFA5-E914-47DA-95CA-C5AB0DC85B11这个字符串进行拼接,然后对拼接后的字符串进行sha-1运算,再进行base64编码,就是Sec-WebSocket-Accept的值
* 应答包中冒号后面有一个空格
* 最后需要两个空行作为应答包结束

然后就建立通信了,后续就是ws的双向通信了,http就不用了。

ws和http一样,都是默认监听80和443端口

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注