您的位置:首页 > 理论基础 > 计算机网络

关于WebSocket的一些总结

2018-06-04 11:27 2867 查看
WebSocket下面简称ws

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类似,不过需要带上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


服务器端响应如下:

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端口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  HTTP WebSocket ws