1. WebSocket 是什么?
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它基于TCP/IP协议,但独立于HTTP协议。
全双工: TCP 连接的两端,同⼀时间⾥,双⽅都可以主动向对⽅发送数据。这就是所谓的全双⼯。
半双工: 现在使⽤最⼴泛的 HTTP/1.1 ,也是基于TCP协议的,同⼀时间⾥,客户端和服务器只能有⼀⽅主动发数据,这就是所谓的半双⼯。
2. 怎么建立WebSocket 连接?
浏览器在 TCP 三次握⼿建⽴连接之后,都统⼀使⽤ HTTP 协议先进⾏⼀次通信。
- 如果此时是普通的 HTTP 请求,那后续双⽅就还是⽼样⼦继续⽤普通 HTTP 协议进⾏交互。
- 如果这时候是想建⽴ WebSocket 连接,就会在 HTTP 请求⾥带上⼀些特殊的header 头,如下:
Connection: Upgrade
Upgrade: WebSocket
Sec-WebSocket-Key: T2a6wZlAwhgQNqruZ2YUyg==\r\n
这些 header 头的意思是,浏览器想升级协议(Connection: Upgrade),并且想升级成 WebSocket 协议(Upgrade: WebSocket)。同时带上⼀段随机⽣成的 base64 码(Sec-WebSocket-Key),发给服务器。
如果服务器正好⽀持升级成 WebSocket 协议。就会⾛ WebSocket 握⼿流程,同时根据客户端⽣成的
base64 码,⽤某个公开的算法变成另⼀段字符串,放在 HTTP 响应的 Sec-WebSocket-Accept 头⾥,同时带上 101状态码(协议转换) ,发回给浏览器。HTTP 的响应如下:
HTTP/1.1 101 Switching Protocols\r\n
Sec-WebSocket-Accept: iBJKv/ALIW2DobfoA4dmr3JHBCY=\r\n
Upgrade: WebSocket\r\n
Connection: Upgrade\r\n
之后,浏览器也⽤同样的公开算法将 base64码 转成另⼀段字符串,如果这段字符串跟服务器传回来的字符串⼀致,验证通过。
就这样经历了⼀来⼀回两次 HTTP 握⼿,WebSocket就建⽴完成了,后续双⽅就可以使⽤ webscoket 的数据格式进⾏通信了。
WebSocket和HTTP⼀样都是基于TCP的协议。经历了三次TCP握⼿之后,利⽤ HTTP 协议升级为 WebSocket 协议。
WebSocket只有在建⽴连接时才⽤到了HTTP,升级完成之后就跟HTTP没有任何关系了。
WebSocket的数据格式是数据头(内含payload⻓度) + payload data 的形式,这是因为 TCP 协议本身就是全双⼯,但直接使⽤纯裸TCP去传输数据,会有粘包的"问题"。为了解决这个问题,上层协议⼀般会⽤消息头+消息体的格式去᯿新包装要发的数据。⽽消息头⾥⼀般含有消息体的⻓度,通过这个⻓度可以去截取真正的消息体。
HTTP 协议和⼤部分 RPC 协议,以及WebSocket协议,都是这样设计的。
2. WebSocket 的使用场景
WebSocket完美继承了 TCP 协议的全双⼯能⼒,它适⽤于需要服务器和客户端(浏览器)频繁交互的⼤部分场景,⽐如⽹⻚/⼩程序游戏,⽹⻚聊天室,以及⼀些类似⻜书这样的⽹⻚协同办公软件。
总结
- TCP 协议本身是全双⼯的,但我们最常⽤的 HTTP/1.1,虽然是基于 TCP 的协议,但它是半双⼯的,对于⼤部分需要服务器主动推送数据到客户端的场景,都不太友好,因此我们需要使⽤⽀持全双⼯的WebSocket 协议。
- 在 HTTP/1.1 ⾥,只要客户端不问,服务端就不答。基于这样的特点,对于登录⻚⾯这样的简单场
景,可以使⽤定时轮询或者⻓轮询的⽅式实现服务器推送(comet)的效果。 - 对于客户端和服务端之间需要频繁交互的复杂场景,⽐如⽹⻚游戏,都可以考虑使⽤ WebSocket 协议。
- WebSocket 和 socket ⼏乎没有任何关系,只是叫法相似。
- 正因为各个浏览器都⽀持 HTTP协 议,所以 WebSocket 会先利⽤HTTP协议加上⼀些特殊的 header头进⾏握⼿升级操作,升级成功后就跟 HTTP 没有任何关系了,之后就⽤ WebSocket 的数据格式进⾏收发数据。
来源:图解网络-小林coding