WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,但是它和http最大的不同有两 点:1.WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser/UA都能主动的向对方发送或接收数据,就像 Socket一样,不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;2.WebSocket需要通过握手连接,类 似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。
下面是一个简单的建立握手的时序图:
![](https://img.haomeiwen.com/i9772012/7b2a5181ebd3bde4.png)
websocket握手过程
这里简单说明一下WebSocket握手的过程。
当Web应用程序调用new WebSocket(url)接口时,Browser就开始了与地址为url的WebServer建立握手连接的过程。
1、建立连接
Browser与WebSocket服务器通过TCP三次握手建立连接,如果这个建立连接失败,那么后面的过程就不会执行,Web应用程序将收到错误消息通知。
2、向服务端发送握手请求
在TCP建立连接成功后,客户端向服务器发送请求,请求报文中的重点内容如下:
GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
从GET处可以看出,这是一个基于HTTP的请求。接下来的Upgrade字段和Connection字段完成了对HTTP协议的升级(HTTP Upgrade Request)。Upgrade字段通知服务器,现在要使用一个升级版协议——websocket。接下来是Sec-WebSocket-Key字段,这个字段是一串生成的BASE64加密的密钥,它被一同发送到服务器端。
此外还有诸如Sec-WebSocket-Version、Sec-WebSocket-Protocol等字段,由于是可选字符,对WebSocket协议的实质影响不大,同时为了文章更简洁更容易理解,先不进行介绍。
3、服务器端进行处理
服务器收到客户端请求后要进行响应。首先服务器需要处理客户端传递过来的Sec-WebSocket-Key。服务器端有一个全局唯一标识符GUID,这个是固定的。服务器端将客户端传来的字符串和服务器端的GUID拼接到一起后进行SHA1处理,再进行一次BASE64加密,准备将其返回客户端。
4、服务器端返回响应
服务器端处理完成后,将给客户端返回响应报文,重要部分如下:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
第一行再次表明此次连接的建立是以HTTP协议为基础的。同时返回了101状态码。101状态码是switching protocols,表示服务器已经理解了客户端的请求,并将通过Upgrade子段通知客户端采用WebSocket协议来完成这个请求。那么协议是什么时候升级到WebSocket的呢?当发送完这个响应最后的空行后,服务器就会切换到Upgrade消息头定义的WebSocket协议。至此完成了从HTTP协议升级的WebSocket协议的过程。同时需要注意,如果返回的状态码不是101,就表示握手升级的过程失败了。中间两行就不用说了,最后一行Sec-WebSocket-Accept返回的就是服务器端处理后的字符串。只有返回了这个字符串才表明握手成功了,返回其他的字符串都表示握手失败。
5、为什么websocket连接是持久的
websocket协议底层是基于tcp实现的,tcp协议连接本身是持久的,http协议的不持久性是因为http协议将tcp挥手断开了,websocket协议没有进行挥手操作。
网友评论