MQTT和Websocket的区别是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MQTT和Websocket的区别是啥相关的知识,希望对你有一定的参考价值。

参考技术A MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议。
而WebSocket则是浏览器与服务器全双工通信
(MQTTMessage Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议,有可能成为物联网的重要组成部分。该协议支持所有平台,几乎可以把所有联网物品和外部连接起来,被用来当做传感器和致动器(比如通过Twitter让房屋联网)的通信协议。
WebSocket protocol 是html5一种新的协议。它实现了浏览器与服务器全双工通信(full-duplex)。一开始的握手需要借助HTTP请求完成。
参考技术B   MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是轻量级基于代理的发布/订阅的消息传输协议,设计思想是开放、简单、轻量、易于实现。这些特点使它适用于受限环境。例如:
  ①网络代价昂贵,带宽低、不可靠。
  ②在嵌入设备中运行,处理器和内存资源有限。
  该协议的特点有:
  ①使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
  ②对负载内容屏蔽的消息传输。
  ③使用 TCP/IP 提供网络连接。
  ④有三种消息发布服务质量:
  ⑤"至多一次",消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
  ⑥"至少一次",确保消息到达,但消息重复可能会发生。
  ⑦"只有一次",确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
  ⑧小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
  ⑨使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。
  WebSocket则提供使用一个TCP连接进行双向通讯的机制,包括网络协议和API,以取代网页和服务器采用HTTP轮询进行双向通讯的机制。
  本质上来说,WebSocket是不限于HTTP协议的,但是由于现存大量的HTTP基础设施,代理,过滤,身份认证等等,WebSocket借用HTTP和HTTPS的端口。由于使用HTTP的端口,因此TCP连接建立后的握手消息是基于HTTP的,由服务器判断这是一个HTTP协议,还是WebSocket协议。 WebSocket连接除了建立和关闭时的握手,数据传输和HTTP没丁点关系了。
  由此可知两者的应用场景不一样:
  MQTT是为了物联网场景设计的基于TCP的Pub/Sub协议,有许多为物联网优化的特性,比如适应不同网络的QoS、层级主题、遗言等等。
  WebSocket是为了HTML5应用方便与服务器双向通讯而设计的协议,HTTP握手然后转TCP协议,用于取代之前的Server Push、Comet、长轮询等老旧实现。
  两者之所有有交集,是因为一个应用场景:如何通过HTML5应用来作为MQTT的客户端,以便接受设备消息或者向设备发送信息,那么MQTT over WebSocket自然成了最合理的途径了。

MQTT和WebSocket

严格来说,MQTT跟WebSocket关系不大。他们不是在一个层级的。

 

MQTT和TCP、WebSocket的关系可以用下图一目了然:

fd8bfc1a045c026261782533cc48529e

 

参考资料:

http://www.zhihu.com/question/21816631

 

WebSocket的优势

以前,很多网站使用轮询实现推送技术。轮询是在特定的的时间间隔(比如1秒),由浏览器对服务器发出HTTP request,然后由服务器返回最新的数据给浏览器。轮询的缺点很明显,浏览器需要不断的向服务器发出请求,然而HTTP请求的header是非常长的,而实际传输的数据可能很小,这就造成了带宽和服务器资源的浪费。

Comet使用了AJAX改进了轮询,可以实现双向通信。但是Comet依然需要发出请求,而且在Comet中,普遍采用了长链接,这也会大量消耗服务器带宽和资源。

于是,WebSocket协议应运而生。 浏览器通过 JavaScript 向服务器发出建立 WebSocket 连接的请求,连接建立以后,客户端和服务器通过 TCP 连接直接交换数据。WebSocket 连接本质上是一个 TCP 连接。

WebSocket在数据传输的稳定性和数据传输量的大小方面,具有很大的性能优势。Websocket.org 比较了轮询和WebSocket的性能优势:

HTTP 轮训每次需要返回871个字节,websocket每次只需要2个字节

Use Case A: 1,000个客户端每秒接受一个message,网络吞吐量 (2*1,000)=2,000 bytes = 16,000 每秒bits

Use Case B: 10,000个客户端每秒接受一个message,网络吞吐量 (2*10,000)=20,000 bytes = 160,000 每秒bits

Use Case C: 100,000个客户端每秒接受一个message,网络吞吐量 (2*100,000)=200,000 bytes = 1,600,000 每秒bits

poll-ws-compare

参考:

http://segmentfault.com/a/1190000000382788

Spring 4.0 中的 WebSocket 架构 
http://www.oschina.net/translate/websocket-architecture-in-spring-4-0

MQTT

 

MQTT 协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,它具有以下主要的几项特性:

    • 非常小的通信开销(最小的消息大小为 2 字节),小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量。
    • 支持各种流行编程语言(包括 C,Java,Ruby,Python 等等)且易于使用的客户端;
    • 使用发布 / 订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
    • 对负载内容屏蔽的消息传输。
    • 使用 TCP/IP 提供网络连接。
    • 有三种消息发布服务质量,让消息能按需到达目的地,适应在不稳定工作的网络传输需求 :
      • "至多一次",消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
      • "至少一次",确保消息到达,但消息重复可能会发生。
      • "只有一次",确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
    • 使用 Last Will 和 Testament 特性通知有关各方客户端异常中断的机制。

以上是关于MQTT和Websocket的区别是啥的主要内容,如果未能解决你的问题,请参考以下文章

websocket在webRTC中的作用是啥?

mqtt与socket的区别

websocket 和 socket.io 之间的区别是啥

mqtt与socket的区别

MQTT和WebSocket

同时使用 Python Tornado 后端、WebSocket 监听器和 MQTT 客户端