+关于WebSocket的一些总结

405 阅读2分钟

ws出现之前的http连接

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

关于 pulling 和 long 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

ShellCopy

跟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=

ShellCopy

说明:

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

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

阅读 1发布于 刚刚