简述 WebSocket 是如何进行传输的
一、什么是 WebSocket ? WebSocket ——一种在 2011 年被互联网工程任务组( IETF )标准化的协议。
WebSocket 解决了一个长期存在的问题:既然底层的协议( HTTP )是一个请求 / 响应模式的交互序列,
那么如何实时地发布信息呢?
AJAX 提供了一定程度上的改善,但是数据流仍然是由客户端所发送的请求驱动的。
还有其他的一些或多或少的取巧方式(Comet) WebSocket 规范以及它的实现代表了对一种更加有效的解决方案的尝试。
简单地说,WebSocket 提供了“在一个单个的 TCP 连接上提供双向的通信……结合 WebSocket API ……
它为网页和远程服务器之间的双向通信提供了一种替代 HTTP 轮询的方案。
但是最终它们仍然属于扩展性受限的变通之法。也就是说,WebSocket 在客户端和
服务器之间提供了真正的双向数据交换。
WebSocket 连接允许客户端和服务器之间进行全双工通信,
以便任一方都可以通过建立的连接将数据推送到另一端。
WebSocket 只需要建立一次连接,就可以一直保持连接状态。这相比于轮询方式的不停建立连接显然效率要大大提高。
Web 浏览器和服务器都必须实现 WebSockets 协议来建立和维护连接。 特点
HTML5 中的协议,实现与客户端与服务器双向,基于消息的文本或二进制数据通信
适合于对数据的实时性要求比较强的场景,如通信、直播、共享桌面,特别适合于客户与服务频繁交互的情况下,如实时共享、多人协作等平台。
采用新的协议,后端需要单独实现
客户端并不是所有浏览器都支持
# WebSocket 协议
WebSocket协议是一种双向通信协议,它建立在TCP之上,同http一样通过TCP来传输数据,
但是它和http最大的不同有两点:
- WebSocket是一种双向通信协议,在建立连接后,WebSocket服务器和Browser/UA都能主动的向对方发送或接收数据,就像Socket一样,
不同的是WebSocket是一种建立在Web基础上的一种简单模拟Socket的协议;
- WebSocket需要通过握手连接,类似于TCP它也需要客户端和服务器端进行握手连接,连接成功后才能相互通信。
下面是一个简单的建立握手的时序图:
这里简单说明一下WebSocket握手的过程。
当Web应用程序调用new WebSocket(url)接口时,Browser就开始了与地址为url的WebServer建立握手连接的过程。
Browser与WebSocket服务器通过TCP三次握手建立连接,如果这个建立连接失败,那么后面的过程就不会执行,Web应用程序将收到错误消息通知。
在TCP建立连接成功后,Browser/UA通过http协议传送WebSocket支持的版本号,协议的字版本号,原始地址,主机地址等等一些列字段给服务器端。
例如:
- WebSocket服务器收到Browser/UA发送来的握手请求后,如果数据包数据和格式正确,客户端和服务器端的协议版本号匹配等等,
就接受本次握手连接,并给出相应的数据回复,同样回复的数据包也是采用http协议传输。
- Browser收到服务器回复的数据包后,如果数据包内容、格式都没有问题的话,就表示本次连接成功,触发onopen消息,此时Web开发者就可以在此时通过send接口想服务器发送数据。否则,握手连接失败,Web应用程序会收到onerror消息,并且能知道连接失败的原因。
# WebSocket与TCP、Http协议之间的关系
WebSocket与http协议一样都是基于TCP的,所以他们都是可靠的协议,
Web开发者调用的WebSocket的send函数在browser的实现中最终都是通过TCP的系统接口进行传输的。
WebSocket和Http协议一样都属于应用层的协议,那么他们之间有没有什么关系呢?
答案是肯定的,WebSocket在建立握手连接时,数据是通过http协议传输的,正如我们之前所看到的“GET/chat HTTP/1.1”,
这里面用到的只是http协议一些简单的字段。但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。
具体关系可以参考下图: