介绍
websocket是HTML5的一个新协议,属于应用层协议,它基于TCP传输协议,并复用HTTP的握手通道。它允许服务端向客户端传递信息,实现浏览器和客户端双工通信。websocket弥补了HTTP不支持长连接的特点。
websocket
下面是一个典型的websocket握手
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://example.com
可以看到相对于HTTP的头部多了一个头部,其实我们就可以说,websocket借用了HTTP的握手,是HTTP的一个解决特定问题的补丁。 我们在看看上面的头部相对HTTP头部都有哪些变化。
Upgrade: websocket
Connection: Upgrade
这就是websocket的核心,告诉服务器这是websocket请求,而不是http请求
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Sec-WebSocket-Key
是一个Base64 encod的值,是一个随机生成的,用于验证是否是真正的websocket
Sec-WebSocket-Protocol
是一个用户定义的字符串,用来区分同URL下,不同的服务需要不同的协议
Sec-WebSocket-Version
是websocket的版本号。
那么服务端就会返回下列东西
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
Sec-WebSocket-Accept
表示经过服务器确认,并且对客户端的Sec-WebSocket-Key进行了加密。
Sec-WebSocket-Protocol
表示最终使用的协议。
区别
- HTTP获取数据的时候,需要不断的问服务端是否有我要的数据 ,如果有数据就返回数据,没有就过一段时间再次询问服务端是否有我需要的数据。websocket只建立一次连接,那么这个连接就不会断,服务端如果有数据的话,会自动返回数据给客户端。
- HTTP是无状态的,意思它健忘,上一次的请求和这次的请求都没什么联系,我们需要引用cookie才能解决。那么在websockt中,因为是一次长连接,那么这就不用一次次加入cookie