一、websocket简介
websocket是一种在单个TCP连接上进行全双工通信的协议。
websocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。
二、背景
很多网站为了实现推送技术,所用的技术都是轮询。
轮询是在特定的时间间隔,由浏览器对客户端发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然后HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的宽带等资源。
在这种情况下,HTML5定义了websocket协议,能更好的节省服务器资源和宽带,而且能够更实时地进行通讯。
三、优点
1、控制开销
创建连接后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。
2、实时性更强
由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少。
3、保持连接状态
与HTTP不同的是,Websocket需要先创建连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
4、更好的二进制支持
5、支持扩展和更好的实现压缩效果
四、原理
websocket同HTTP一样也是应用层的协议,但是它是一种双向通信协议,建立在TCP之上的。
连接过程(握手过程)
1、客户端、服务器建立TCP连接,三次握手。
这是通信的基础,传输控制层,若失败后续都不执行。
2、TCP连接成功后,客户端通过HTTP协议向服务器传送websocket支持的版本号信息。(开始前的HTTP握手)
3、服务器收到客户端的握手请求后,同样采用HTTP协议回馈数据。
4、当收到了连接成功的消息后,通过TCP通道进行传输通信。
五、websocket和socket的关系
socket其实并不是一个协议,而是为了方便使用TCP和UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。
socket是应用层与TCP/IP协议通信的中间软件抽象层,它是一组接口。在设计模式中,socket其实就是一个门面模式,它把复杂的TCP/IP协议隐藏在socket接口后面,对用户来说,一组简单的接口就是全部,让socket去组织数据,以符合指定的协议。
两台主机通信,必须通过socket连接,socket则利用TCP/IP协议建立TCP连接。TCP连接则更依靠于底层的IP协议,IP协议的连接则依赖于链路层等更低层次。
websocket则是一个典型的应用层协议。
来源:https://www.zhangshengrong.com/p/nDa9jWORNj/