网络通信专题总结之mqtt专题全局介绍

大纲:
|网络通信专题总结之mqtt专题
|mqtt简介
|mqtt实现基本流程
|mqtt与TCP的区别
|mqtt如何保障通信安全?
|什么是SSL? 什么是TLS? SSL与TLS之间的区别?
|mqtt基本通信过程
|如何进行SSL/TLS握手?
|如何进行开始会话?
|如何重建连接?

|证书是什么回事?
|心跳包是什么?
|推送以及订阅机制

|如何学习mqtt?



#mqtt简介

有一个生动的例子:请点击:
MQTT比TCP协议好在哪儿?(熊饼干)

    概念介绍[1]

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是IBM开发的一个即时通讯协议。
主要的几项特性:
1、使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合;
传统的请求/回答消息模式是需要双方同时确认后才能进行通信的;而发布/订阅消息模式则不需要。
2、对负载内容屏蔽(加密)的消息传输;
3、使用 TCP/IP 提供网络连接,但比直接用TCP/IP协议通信更加轻量化;
4、有三种消息发布服务质量:
“至多一次”,消息发布完全依赖底层 TCP/IP 网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。
“至少一次”,确保消息到达,但消息重复可能会发生。
“只有一次”,确保消息到达一次。这一级别可用于如下情况,在计费系统中,消息重复或丢失会导致不正确的结果。
5、小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量;
6、使用Last Will和Testament特性通知有关各方客户端异常中断的机制。
Last Will:即遗言机制,用于通知同一主题下的其他设备发送遗言的设备已经断开了连接。

Testament:遗嘱机制,功能类似于Last Will。

        7、基于客户端Client /代理Broker 的模式进行通信。(详细可以参考:MQTT Part 3客户端,中间人,建立连接)


    适用场景:

高并发且需要延迟低的应用。

#mqtt实现基本流程


#mqtt与TCP的区别

1.MQTT是基于TCP的应用层协议。(当然中间可能多一层,websocket)
2.而MQTT是发布/订阅协议(publish/subscribe),采用C/S模式,轻量级,适用于物联网,同时MQTT协议中的用户是通过TCP协议接入服务器(代理,broker)的。
3.MQTT是二进制格式。


mqtt相比于TCP的优点[2]

1.假设现在有一个物联网的应用,题主当然可以直接用TCP socket 做通信,实际上不少人也是这么做的。然后你就会发现: 
* 需要自己写确认重传的机制,因为TCP 连接说不定就断了。   
* 如果有很多个传感器(生产者),又要写代码管理这么多TCP连接呢。   
* 如果同时又有多个地方需要用到这些数据,还得写一个转发的逻辑。   
* 如果系统很复杂,参与人或公司很多,那通信格式要怎么定,怎么改,沟通成本就很大了。这些东西这么麻烦,又不想加班写代码,那有没有办法简便地解决呢?当然有,就是用现成的协议啦,比如MQTT。MQTT 提供两个核心功能:   
* 三个级别的QOS   
*基于订阅/发布的消息转发服务。用了MQTT, 上面提到的这些问题就都被优雅地解决掉啦。

#mqtt如何保障通信安全?

背景[3]

加密算法需要更多的计算能力,而物联网设备的性能往往非常有限。

对于以上挑战,MQTT提供了多个层次的安全特性:

网络层:有条件可以通过拉专线或者使用VPN来连接设备与MQTT代理,以提高网络传输的安全性。
传输层:传输层使用TLS加密是确保安全的一个好手段,可以防止中间人攻击(Man-In-The-Middle Attack)。客户端证书不但可以作为设备的身份凭证,还可以用来验证设备。
应用层:MQTT还提供客户标识(Client Identifier)以及用户名密码,在应用层验证设备。

#什么是SSL?什么是TLS?SSLTLS之间的区别[3]?

SSL/TLS = 非对称加密 + 对称加密 + 散列算法

        TLS是在SSL的基础上发展起来的。

什么是SSL?

SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。
较低的层为 TLS 记录协议,位于某个可靠的传输协议(例如 TCP)上面。


SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

SSL协议提供的服务主要有:

  1)认证用户和服务器,确保数据发送到正确的客户机和服务器;
  2)加密数据以防止数据中途被窃取;
  3)维护数据的完整性,确保数据在传输过程中不被改变。

什么是TLS?

TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。

TLS是非常成熟的安全协议,在握手的时候便可以创建安全连接,使得黑客无法窃听或者篡改内容了。使用TLS的时候有以下注意点:

TLS 记录协议提供的连接安全性具有两个基本特性:   

1.私有――对称加密用以数据加密(DES 、RC4 等)。对称加密所产生的密钥对每个连接都是唯一的,且此密钥基于另一个协议(如握手协议)协商。记录协议也可以不加密使用。   
2.可靠――信息传输包括使用密钥的MAC进行信息完整性检查。安全哈希功能( SHA、MD5 等)用于 MAC 计算。记录协议在没有 MAC 的情况下也能操作,但一般只能用于这种模式,即有另一个协议正在使用记录协议传输协商安全参数。


SSL和TLS之间的区别:


我们先来看一下SSL和TLS发展的历史:
互联网加密通信协议的历史,几乎与互联网一样长。

1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。
1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。
1996年,SSL 3.0版问世,得到大规模应用。
1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。
2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。

由此可见:


1.TLS是基于SSL的基础上发展起来的。TLS的主要目标是使SSL更安全
2.TLS就是SSL的新版本3.1。支持的最高TSL协议版本version,从低到高依次 SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2,当前基本不再使用低于 TLSv1 的版本;
3.实现HTTPS协议访问,就需要SSL证书,TLS是SSL与HTTPS安全传输层协议名称。
4.SSL与TLS两者所使用的算法是不同的,SSL使用的是MAC哈希算法,TLS使用的是RFC-2104定义的HMAC算法,两者差异是在填充字节与密钥之间一个使用的是连接运算,一个使用的是异或运算,MAC和HMAC在取值范围也是不同的,但是安全度是相同的!
5.TLS和SSL不能共用,因为在认证证书时TLS指定必须与TLS之间交换证书,因为TLS与SSL所使用的加密算法是不同的,所以不能把TLS与SSL一并使用。

6.在加密数据前会额外填充一部分在SSL中,填充后的数据长度要达到密文块长度的最小整数倍,而在TLS中,填充后的数据长度可以是密文块长度的任意整数倍(但填充的最大长度为255字节),并和公开密钥拼接,随后在跟着密文,这种方式可以防止基于对报文长度进行分析的攻击!


#如何进行SSL/TLS握手?[3]

SSL/TLS握手过程分析:
基本方式:
1.基于RSA握手和密钥交换的客户端验证服务器
        2.基于证书的客户端验证服务器
可以参考:(讲得非常详细)
HTTPS加密协议详解(四):TLS/SSL握手过程
         SSL协议详解(非常详细,包括加密的细节)


#证书是什么回事[3]?

在SSL/TLS握手的过程中,会涉及到请求公钥以及用私钥解密的过程。因为公钥中不包含服务器的信息,因此这个过程中客户端无法确认服务器身份的合法性,很容易在客户端与服务端之间出现中间人截获信息。
为了,需要这么做:
尽可能使用高版本的TLS。
验证X509证书链防止中间人攻击。
尽量使用有CA发布的证书。

证书是很关键的一环。为了确保获取的公钥途径是合法的,能够验证服务器的身份信息,为此需要引入权威的第三方机构CA(如光网CA)。CA 负责核实公钥的拥有者的信息,并颁发认证"证书",同时能够为使用者提供证书验证服务。
接下来,请求公钥以及用私钥解密的过程就会涉及到证书了。服务端发给客户端的证书中就包含了公钥等信息。
具体介绍可以参考:
HTTPS加密协议详解(三):PKI 体系


#心跳包是什么[4]?

心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包。
说明;broker是服务端的意思。

心跳机制可以确认连接仍然是打开的,并且broker和客户端都连接上了对方。因此客户端可以设定一个几秒钟的时间间隔,并在连建立后按此间隔来发送消息给broker。心跳的间隔时间是broker和客户端所能接受的最长的通信周期。


MQTT的说明书描述如下:
客户端有职责来确保发送的数据包间隔不超过心跳周期。如果没有数据包待发,那么客户端必须发送一个PINGREQ包。


这意味着只要消息被频繁地交换,而且心跳时长也没有超出阈值,那么就没有必要再发送额外的消息来确认连接是否开着了。
但是如果客户端在心跳周期内没有任何消息可以发送,那么它必须发送一个PINGREQ包给broker来确认它本身和broker仍然可用。
如果客户端没有在1.5倍心跳周期内发送PINGREQ或者其他数据,那么broker必须与客户端断开连接。同样的,如果broker没有在规定的时间内响应,客户端也应该主动断开连接。


#推送以及订阅机制[5]?

    mqtt是基于客户端Client /代理Broker的通信模式。

    MQTT的客户端,包含发布者和订阅者,分别负责发布消息和订阅消息。(通常情况下,一个MQTT实体同时具备发布者和订阅者两重功能)。任何包含了MQTT运行库并且通过任意网路类型连接到MQTT broker的且具备微控制器的设备都称为MQTT客户端。

    和MQTT客户端协作的另一部分是MQTT broker,其被称为发布/订阅协议的心脏部分,根据具体的实现不同,一个broker可以支持数以千计的客户端并发连接。broker的主要职责是接受所有消息,并将其过滤后分发给不同的消息订阅者。它也可以根据订阅内容和未送达的消息来保持持久的会话。broker的另一个职责是验证和授权客户端。

    推送和订阅都是基于一个共同的主题。推送者向着某个主题发布消息,所有对应该主题的订阅者都会收到这条消息。

    

#如何学习mqtt?

使用开源mosquitto服务器

有很多MQTT服务器,包括开源的,可以安装于不同平台。mosquitto蚊子就是很有名的一个开源服务器。也就是说完全兼容mqtt协议,而且可以通过抓包工具查看以及分析mqtt具体协议组成。


有一篇很好的文章介绍mosquitto的使用以及mqtt,可以参考:
MQTT比TCP协议好在哪儿?(张琪)


#疑问解析:

mqtt的客户端的端口一定是8883吗?
仅允许相关端口的流量传递到MQTT代理,比如MQTT over TCP使用1883,而MQTT over TLS使用8883。

mqtt代理是什么?

代理即broker。broker的主要职责是接受发布者发布的所有消息,并将其过滤后分发给不同的消息订阅者。具体可以参考”mqtt如何订阅和推送”


mqtt有遗言机制,但好像遇到过客户端上线时并没有收到服务端在客户端上线前的消息?

这跟设置mqtt服务质量QOS有关。请参考mqtt简介-基本概念。



为什么有了证书还需要引入随机数?
不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于 SSL 协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。


参考:

[1]mqtt[EB/OL].https://baike.baidu.com/item/MQTT/3618851?fr=aladdin,2016-06-30/2018-04-01.

[2]弗雷德.MQTT比TCP协议好在哪?[EB/OL].https://www.zhihu.com/question/23373904/answer/298625767

[3]张琪.MQTT比TCP协议好在哪?[EB/OL].https://www.zhihu.com/question/23373904/answer/298625767

[4]qinwenbo.MQTT Part 10 心跳和客户端替换[EB/OL].https://www.jianshu.com/p/0d8c63b1bcab

[5]qinwenbo.MQTT Part 3 客户端,中间人(Broker),建立连接[EB/OL].https://www.jianshu.com/p/ff77386467e1

(非常专业的介绍)
HTTPS加密协议详解(一):HTTPS基础知识
HTTPS加密协议详解(二):TLS/SSL工作原理
HTTPS加密协议详解(三):PKI 体系
HTTPS加密协议详解(四):TLS/SSL握手过程
HTTPS加密协议详解(五):HTTPS性能与优化
https://www.gworg.com/ssl/405.html

MQTT--入门
https://blog.csdn.net/qq_28877125/article/details/78325003

MQTT比TCP协议好在哪儿?
https://www.zhihu.com/question/23373904

关于ISO七层模型你应该知道的东西
https://blog.csdn.net/scu_cindy/article/details/74529287#%E5%85%B3%E4%BA%8E%E5%8D%8F%E8%AE%AE%E4%BD%A0%E5%BA%94%E8%AF%A5%E7%9F%A5%E9%81%93%E8%BF%99%E4%BA%9B

七层协议和四层协议
https://www.cnblogs.com/isonre/p/7017608.html

SSL与TLS的区别以及介绍
https://blog.csdn.net/anningzhu/article/details/77517432

SSL与TLS的区别
https://www.2cto.com/net/201709/678689.html

SSL协议详解(非常详细,包括加密的细节)
http://www.cnblogs.com/zhuqil/archive/2012/10/06/2712768.html

浅谈HTTPS协议和SSL、TLS之间的区别与关系
https://zhangzifan.com/https-http-tls-ssl.html

图解SSL/TLS协议
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html

SSL/TLS协议运行机制的概述

http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

对比一些MQTT的代理(broker)

https://www.jianshu.com/p/dac397a77c17


猜你喜欢

转载自blog.csdn.net/tommymusk/article/details/80452305