WebSocket

143 阅读4分钟

介绍

WebSocket是HTML5下一种新的协议

实现了浏览器与服务器的全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的

WebSocket是一个持久化的协议

原理

1、WebSocket约定了一个通信的规范,通过一个握手的机制,客户端和服务器之间可以建立一个类似tcp的链接,从而方便它们之间的通信

2、在websocket出现之前,web交互一般是基于http协议的短连接或者长连接

3、websocket是一种全新的协议,不属于http无状态协议,协议名为"ws"

webSocket和http的关系

相同点:

1、都是基于tcp的,都是可靠性传输协议

2、都是应用层协议

不同点:

1、webSocket是双向通信协议,模拟socket协议,可以双向发送或接收信息

2、HTTP是单向的

3、websocket是需要浏览器和服务器握手建立连接的

4、http是浏览器发起向服务器的链接,服务器预先并不知道这个链接

联系:

WebSocket在建立握手时,数据是通过http传输的,但是建立之后,真正的传输时候是不需要http协议的

总结连接过程:

1、客户端发起http请求,经过3次握手后,建立起TCP连接;http请求里存放websocket支持的版本号等信息,如:Upgrade,connection,websocket-version等

2、服务器收到客户端握手的请求后,同样采取http协议回馈数据

3、客户端收到连接成功的消息后,开始借助于TCP传输信道进行全双工通信

websocket解决的问题

http存在的问题
  1. http是一种无状态协议,每当一次会话完成后,服务器端都不知道下一次的客户端是谁,需要知道对方是谁,才进行相应的响应,因此本身对实时通讯都是一种极大的障碍
  2. http协议采取一次请求,一次响应,每次请求和响应都携带大量的header头,对于实时通讯来说,解析请求头也是需要一定的时间,因此,效率也更底下
  3. 最重要的是,需要客户端主动发,服务端被动发,也就是一次请求,一次响应,不能实现主动发送
长轮训/ajax轮询

对于以上情况就出现了http解决的第一个方法---长轮训

  • 基于http的特性,简单点说,就是客户端发起长轮询,如果服务端的数据没有发生变更,会 hold 住请求,直到服务端的数据发生变化,或者等待一定时间超时才会返回。返回后,客户端又会立即再次发起下一次长轮询

ajax轮询

  • 基于http的特性,简单点说,就是规定每隔一段时间就由客户端发起一次请求,查询有没有新消息,如果有,就返回,如果没有等待相同的时间间隔再次询问

websocket的改进

image.png 特点:

  1. 真正的全双工,建立连接后,客户端和服务器端是完全平等的,可以互相主动请求,而http长连接基于http,是传统的客户端对服务器端发起请求的模式
  2. HTTP长连接中,每次数据交换除了真正的数据部分外,服务器和客户端还要大量交换HTTP header,信息交换效率很低。Websocket协议通过第一个request建立了TCP连接之后,之后交换的数据都不需要发送 HTTP header就能交换数据,这显然和原有的HTTP协议有区别所以它需要对服务器和客户端都进行升级才能实现(主流浏览器都已支持HTML5)

有状态协议,无状态协议

根据服务器或服务器端软件保存状态或会话信息的要求来区分的

无状态协议

客户端根据当前状态向服务器发送请求并返回服务器响应的网络协议类型;不需要服务器为多个请求保留会话信息或每个通信伙伴的状态。

UDP(用户数据报协议)、DNS(域名系统)是无状态协议的例子

无状态协议的静默特性

  1. 无状态协议简化了服务器设计
  2. 需要较少的资源,因为系统不需要跟踪多链路通信和会话细节
  3. 每个信息包都是独立传输,无需参考任何其他包
  4. 每个通信都是离散的,与之前/之后的通信无关
有状态协议

如果客户端向服务器发送请求,那么它期待某种响应,如果他没有得到任何响应,那么它会重新发送请求

有状态协议的静默特征

  1. 有状态协议通过跟踪连接信息为客户端提供更好的性能
  2. 有状态的应用程序需要后备存储
  3. 有状态的请求总是依赖于服务器端的状态
区别

image.png