WebSocket下面简称ws
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
跟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端口