websocket
websocket是为了解决HTTP协议中的一些问题。因为HTTP是无状态,短连接。
HTTP协议下,客户端主动连接服务端;客户端发起一次请求,服务端返回一次响应。也就是说,客户端没有发起请求的时候,服务端是不能主动给客户端返回响应的。
websocket解决了这个问题,它将创建一个持久连接,然后客户端和服务器基于这个连接可以进行收发数据。
websocket是建立在HTTP协议之上的(这是为了兼容现有浏览器),websocket的连接是由浏览器发起,这个连接是建立在TCP协议之上的。在握手阶段采用HTTP协议。 下面来看一个请求实例。
我们来一一解读一些关键点。 General
- Request URL: ws://localhost:8000/ws 协议变了,从HTTP变成了ws.
- Status Code: 101 Switching Protocols 服务端返回101状态码,表示服务器应客户端升级协议的请求对协议进行切换。
Response Headers
- Connection: Upgrade 该字段如果为Upgrade,则表示协议升级
- Upgrade: websocket 该字段表示升级后的协议,例如这里的websocket.
- Sec-WebSocket-Accept: mXiTS1gdAOfW1eBr91jIGsv71J4= Sec-WebSocket-Accept 是经过服务器确认,并且加密过后的 Sec-WebSocket-Key(Sec-WebSocket-Key是客户端在请求的时候携带的参数)。服务器接受处理后将Sec-WebSocket-Key设置的字符串和固定UUID(258EAFA5-E914-47DA-95CA-C5AB0DC85B11)连接起来,再经过SHA-1散列(160位)、base-64编码设置到服务器的响应报文Sec-WebSocket-Accept中返回给客户端。
- Sec-WebSocket-Extensions: permessage-deflate Sec-WebSocket-Extensions是客户端在发起请求的时候携带的扩展参数,服务器会根据自身情况和客户端协商,然后返回协商结果。
Request Headers
- Connection: Upgrade 客户端请求服务器段对连接进行升级
- Upgrade: websocket Connection请求升级,但是没有说升级为什么协议,Upgrade指明了升级的协议
- Sec-WebSocket-Version: 13 这是告诉服务器所使用的websocket协议的版本
- Sec-WebSocket-Key: iWGEKNbNdeLvB0OdelWHLA== Sec-WebSocket-Key是一个base64 编码的密文,服务器拿到这个值之后,然后加密。作为Sec-WebSocket-Accept 的值返回给客户端
- Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits 客户端发生给服务器的扩展字段
以上过程都是利用http通信完成的,称之为websocket协议握手(websocket Protocol handshake),经过握手之后,客户端和服务端就建立了websocket连接,以后的通信走的都是websocket协议了。
总结为websocket握手需要借助于http协议,建立连接后通信过程使用websocket协议。同时需要了解的是,该websocket连接还是基于我们刚才发起http连接的那个TCP连接。一旦建立连接之后,我们就可以进行数据传输了,websocket提供两种数据传输:文本数据和二进制数据。
到这里大家又都基本明白了,为什么叫做“websocket”,因为这个东西本质上就是借鉴socket的思想来实现的。在传输数据之前,必须要先建立连接。当连接一旦建立,那么客户端就可以和服务器直接通信了。
websocket挺好的,就是低版本的浏览器不支持。