关于WebSocket的一些总结
2018-06-04 11:27
2867 查看
WebSocket下面简称ws
关于
C++
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连接,
各个域介绍是:
* 必须是有效的
*
* 必须包括
* 必须包括
* 必须包括
* 如果请求来自浏览器客户端,还必须包括
* 必须包括
* 可能包括
* 可能包括
* 可能包括任意其他域,如
服务器端响应如下:
C++
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: Y+Te7S7wQJC0FwXumEdGbv9/Mek=
说明:
* 必须包括
* 必须包括
* 必须包括
* 应答包中冒号后面有一个空格
* 最后需要两个空行作为应答包结束
然后就建立通信了,后续就是ws的双向通信了,http就不用了。
ws和http一样,都是默认监听80和443端口
ws出现之前的http连接
在ws出现以前,http都是客户端发起-服务器回应的模式,全靠客户端主动交流,服务器完全是被动等待请求,回复数据。如果需要服务器主动推送信息给客户端(例如现在手机上的应用提醒),只能靠客户端主动pulling或
long pulling不间断的请求服务器获取数据,并且http是无状态的,每次请求数据的时候都需要带认证信息,还需要每次进行tcp连接,非常消耗资源。
关于
pulling和
long pulling的介绍,点击查看
WebSocket协议
先来看一个ws的握手请求C++
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
1 2 3 4 5 6 7 8 9 10 11 12 | 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 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
服务器端响应如下:
C++
HTTP/1.1 101 Web Socket Protocol Handshake
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: Y+Te7S7wQJC0FwXumEdGbv9/Mek=
1 2 3 4 5 | 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端口
相关文章推荐
- 关于WebSocket的一些总结
- OTA升级中关于update.zip包的一些总结【转】
- EMF的一些总结(2)——关于EMF的序列化
- 关于C++中的虚拟继承的一些总结
- 关于一些c/c++小问题的总结
- 关于“手机”一些术语的小总结
- 关于测试中常用到的一些方法、策略总结
- 关于iOS开发证书的一些总结(很有用)
- django1.6 使用userprofile 以及一些关于用户系统的总结
- 关于HTML和Css的一些总结
- 关于编码的一些总结
- 关于账单页面的一些变态问题总结
- 关于移动端的一些总结
- 关于 Android Dex 方法限制的一些总结
- 关于java中this的一些总结
- java关于日期的一些常用方法总结
- 关于推送系统设计的一些总结与思考(一)
- 关于IOS中GCD,NSThread和NSOperation的一些总结
- 关于java初学的一些笔记总结(收集+总结)与大家分享,关于自学java,有好的建议可以回帖。
- 关于Linux安装python画图遇到的一些问题总结