Modbus 的RTU、ASCII、TCP解析

参考:
Modbus 的RTU、ASCII、TCP傻傻搞不清楚?一文最全解读
MODBUS通讯协议完整介绍


1. 背景

早在1971年,Modicon公司首次推出了Modbus协议,Modbus RTUModbus ASCII诞生于此。后来施耐德电气(SchneiderElectric)收购了Modicon公司,并在1997年推出了ModbusTCP协议。2004年,中国国家标准委员会正式把Modbus作为了国家标准,开启了Modbus为中国工业通信做贡献的时代。

通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。Modbus协议具有标准、开放,可以支持多种电气接口,数据帧格式简单紧凑,数据传输量大、实时性好等特点,在工业控制系统中得到了广泛的应用,已经成为通用工业标准。深入分析Modbus协议实现原理和其安全性对提高工控系统安全性有着重要的现实意义。Modbus RTUModbus ASCII主要用于串行通信领域,而Modbus TCP则常用于以太网通信。现在,Modbus已经成为工业领域通信协议标准,并且现在是工业电子设备之间相当常用的连接方式。

在这里插入图片描述

2. 协议原理

Modbus使用一种简单的Master and Slave主从协议(客户机/服务器协议)进行通信。客户机作为主站,向服务器发送请求;服务器(从站)接到请求后,对请求进行分析并作出应答。其中使用的通信帧被称为应用数据单元(Application Data Unit,ADU),它包括通信地址段、功能代码段、数据段和校验段,如下图:
在这里插入图片描述
一般使用上,监控系统(HMI)都为Master,PLC、电表、仪表等都为Slave,HMI系统一直Polling Slave的各种relay and register最新数值,然后做显示及各种逻辑计算及控制调整等处理。

其中,功能代码段和数据段组合称为协议数据单元(Protocol Data Unit or Protocol Description Unit),PDU)。功能代码段占用一个字节,取值范围为1~255,其中128~255为保留值,用于异常消息应答报文。1~127为功能代码编号,其中65~72和100~110为用户自定义编码。

3. 传输方式

Modbus 协议是一种应用层报文传输协议,包括ASCII、RTU、TCP三种报文类型,协议本身并没有定义物理层,只是定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。

Modbus 协议使用串口传输时可以选择RTU或ASCII模式,并规定了消息、数据结构、命令和应答方式并需要对数据进行校验。ASCII 模式采用LRC校验,RTU模式采用16 位CRC校验。通过以太网传输时使用TCP,这种模式不使用校验,因为TCP协议是一个面向连接的可靠协议。

4. Modbus RTU与Modbus ASCII有什么区别

Modbus是一种应用层协议,它定义了与基础网络无关的数据单元(ADU),可以在以太网(TCP/IP)或串行链路上(RS232、RS485等)进行通信(以太网ADU和串行ADU略有不同)。在串行链路上,Modbus协议有两种传输模式——ASCII模式和RTU模式。其中,ASCII是英文“American Standard Code for Information Interchange”的缩写,中文翻译为“美国国家信息交换标准编码”;RTU是英文“ Remote Terminal Unit”的缩写,中文翻译为“远程终端设备”。

首先,让我们来看看Modbus的工作原理。

Modbus采用主从(Master-Salve)通信模式,仅有主设备(Master)能对传输进行初始化,从设备(Slave)根据主设备的请求进行应答。典型的主设备包括现场仪表和显示面板,典型的从设备为可编程逻辑控制器(PLC)。

在串行链路的主从通信中,Modbus主设备可以连接一个或N(最大为247)个从设备,主从设备之间的通信包括单播模式和广播模式。

在广播模式中,Modbus主设备可同时向多个从设备发送请求(设备地址0用于广播模式),从设备对广播请求不进行响应。

在单播模式中,主设备发送请求至某个特定的从设备(每个Modbus从设备具有唯一地址),请求的消息帧中会包含功能代码和数据,比如功能代码“01”用来读取离散量线圈的状态。从设备接到请求后,进行应答并把消息反馈主设备。
在这里插入图片描述
在主从设备的通信中,可以使用ASCII模式或者RTU模式。

在ASCII(AmericanStandard Code for Information Interchange)传输模式下,消息帧以英文冒号(“:”,ASCII3A Hex)开始,以回车和换号(CRLF,ASCII 0D and 0A Hex)符号结束,允许的传输的字符集为十六进制的0~9和A~F;网络中的从设备监视传输通路上是否有英文冒号(“:”),如果有的话,就对消息帧进行解码,查看消息中的地址是否与自己的地址相同,如果相同的话,就接收其中的数据,如果不同的话,则不予理会。
在这里插入图片描述
在ASCII模式下,每个8位的字节被拆分成两个ASCII字符进行发送,比如十六进制数0xAF ,会被分解成ASCII字符“A”和“F”进行发送,发送的字符量比RTU增加一倍。ASCII模式的好处是允许两个字符之间间隔的时间长达1s而不引发通信故障,该模式采用纵向冗余校验(Longitudinal Redundancy Check ,LRC)) 的方法来检验错误。

在RTU(RemoteTerminal Unit)模式下,每个字节可以传输两个十六进制字符,比如十六进制数0xAF,直接以十六进制0xAF(二进制:10101111)进行发送,因此它的发送密度比ASCII模式高一倍;RTU模式采用循环冗余校验(CRC),下面是对RTU模式的总结:

当控制器设为在Modbus 网络上以RTU 模式通信,消息中的每个8Bit 字节都包含两个4 Bit 的十六进制字符,这种模式没有开始和结束标记。其优点是: 在同样的波特率下,可传送更多的数据。

具体格式如图所示。
在这里插入图片描述

5. Modbus TCP及其注意点

5.1 Modbus TCP协议简述

modbus TCP和modbus RTU基本相同,但是也存在一些区别

  1. 从机地址变得不再重要,多数情况下忽略。从某种意义上说从机地址被IP地址取代。
  2. CRC校验变得不再重要,甚至可以忽略。由于TCP数据包中已经存在校验,为了不重复造轮子,modbus TCP干脆取消了CRC校验。

TCP 模式是为了让Modbus 数据顺利在以太网上传输产生的,使用TCP 502 端口。该协议物理层,数据链路层,网络层,传输层都是基于TCP 协议,只在应用层,将Modbus 协议修改后封装进去; 接收端将该TCP 数据包拆封后,重新获得原始Modbus 帧,然后按照Modbus 协议规范进行解析,并将返回的数据包重新封装进TCP 协议中,返回到发送端。与串行链路传输的数据格式不同,TCP 模式去除了附加地址和校验,增加了报文头,其具体格式如下图所示。

在这里插入图片描述
在modbus TCP中包含一个MBAP头,该头包含以下几个部分。

区域长度描述客户端服务器
传输标志2字节MODBUS请求和响应传输过程中序列号客户端生成应答时复制该值
协议标志2字节MODBUS协议默认为0客户端生成应答时复制该值
长度2字节剩余部分的长度客户端生成应答时由服务器端生成
单元标志1字节从机标志(从机地址)客户端生成应答时复制该值

注:

  • 传输标志可理解为序列号,防止 MODBUS TCP通信错位,例如后发生的响应先到了主机,而早发生的响应后到主机
  • 单元标志可理解为从机地址,此时已经不再重要,因为在Modbus TCP通信中,从某种意义上说从机地址被IP地址取代。

5.2 ModbusTCP 和 TCP IP的关系

Modbus TCP可以理解为发生在TCP上的应用层协议,既然是TCP协议,那么一个完整的Modbus TCP报文必然包括TCP首部,IP首部和Ethernet首部。

5.3 主机和从机、服务端和客户端

【在Modbus协议中】

  • 主机发送Modbus请求,从机根据请求内容向主机返回响应。在Modbus协议中,主机总是主动方,从机总是被动方。

【在网络应用中】

  • 在网络应用中存在客户端和服务器端,客户端(例如浏览器)发送请求到服务器,服务器向客户端返回内容(例如HTML文本)。

【在modbus tcp中】

  • 主机是客户端,而从机是服务器端。千万不要以为服务器端重要,主机也重要。

5.4 是否可以多主机

通过前面的分析,主机为客户端,那么Modbus TCP支持多个主机,在一个局域网中可存在多个主机和多个从机。从机的连接能力(连接主机的数量)由IP的最大TCP连接个数决定。

7. 功能码作用

启动Modbus事务处理的客户机创建Modbus应用数据单元。功能码(PDU中的)向服务器指示将执行哪种操作。

用一个字节编码Modbus数据单元的功能码域。有效范围是十制制1-255(128-255为异常响应保留)。当从客户机向服务器发送报文时,功能码域通过服务器执行哪种操作。

从客户机向服务器发送的报文数据域包括附加信息,服务器使用这个信息执行功能码定义的操作。这个域还包括离散项目和寄存器地址、处理项目的数量以及域中的实际数据字节数。

在某种请求中,数据域可以是不存在的,在此情况下服务器不需要任何附加信息。功能码仅说明操作。

6. Modbus数据类型

在这里插入图片描述
DI:DigitalInput(数字输入,离散输入),一个地址一个数据位,用户只能读取它的状态,不能修改。以一个 bit表示 On/Off,用来记录控制信号的状态输入,例如:开关,接触点,马达运转,超限switch…等等。于PLC上被称为Input relay、input coil等。

DO:DigitalOutput(数字输出,线圈输出),一个地址一个数据位,用户可以置位、复位,可以回读状态。以一个 bit表示 On/Off,用来输出控制信号,以激活或停止马达,警铃,灯光…等等。于PLC上被称为Output relay、Output coil等。

AI:Analog Input(模拟输入,输入寄存器),一个地址16位数据,用户只能读,不能修改,,以16 bits integer表示一个数值,用来记录控制信号的数值输入,例如:温度、流量、料量、速度、转速、文件板开度、液位、重量…等等。于PLC上被称为Input register。

AO:AnalogOutput(模拟输出,保持寄存器),一个地址16位数据,用户可以写,也可以回读,以16 bits integer表示一个数值,用来输出控制信号的数值,例如:温度、流量、速度、转速、文件板开度、饲料量…等等设定值。于PLC上被称为Output register、Holding register。

7.1 功能码分类

有三类 MODBUS 功能码:公共功能码、用户定义功能码、保留功能码。
在这里插入图片描述

公共功能码

  • 是较好地被定义的功能码,
  • 保证是唯一的,
  • MODBUS 组织可改变的,
  • 公开证明的,
  • 具有可用的一致性测试,
  • MB IETF RFC 中证明的,
  • 包含已被定义的公共指配功能码和未来使用的未指配保留供功能码。

用户定义功能码

  • 有两个用户定义功能码的定义范围,即 65 至 72 和十进制 100 至 110。
  • 用户没有 MODBUS 组织的任何批准就可以选择和实现一个功能码
  • 不能保证被选功能码的使用是唯一的。
  • 如果用户要重新设置功能作为一个公共功能码,那么用户必须启动 RFC,以便将改变引入公共分类中,并且指配一个新的公共功能码。

保留功能码

  • 一些公司对传统产品通常使用的功能码,并且对公共使用是无效的功能码。

7.2 公共功能码定义

在这里插入图片描述

8. Modbus协议安全分析

Modbus 协议是典型的工控网协议,研究其安全性对于加强工业控制网络的安全性有重要意义。一般来说,协议安全性问题可以分为两种,一种是协议自身的设计和描述引起的安全问题; 另一种是协议的不正确实现引起的安全问题。Modbus 协议也存在着两方面问题。

8.1 Modbus协议的固有问题

绝大多数工控协议在设计之初,仅仅考虑了功能实现、提高效率、提高可靠性等方面,而没考虑过安全性问题。Modbus 协议也不例外,尽管其已经成为事实上的工业标准。从前面原理分析可以看出其本身的安全性问题是: 缺乏认证、授权、加密等安全防护机制和功能码滥用问题。

( 1) 缺乏认证

认证的目的是保证收到的信息来自合法的用户,未认证用户向设备发送控制命令不会被执行。在Modbus 协议通信过程中,没有任何认证方面的相关定义,攻击者只需要找到一个合法的地址就可以使用功能码就能建立一个Modbus 通信会话,从而扰乱整个或者部分控制过程。

( 2) 缺乏授权

授权是保证不同的特权操作需要由拥有不同权限的认证用户来完成,这样可大大降低误操作与内部攻击的概率。目前,Modbus 协议没有基于角色的访问控制机制,也没有对用户分类,没有对用户的权限进行划分,这会导致任意用户可以执行任意功能。

( 3) 缺乏加密

加密可以保证通信过程中双方的信息不被第三方非法获取。Modbus 协议通信过程中,地址和命令全部采用明文传输,因此数据可以很容易的被攻击者

捕获和解析,为攻击者提供便利。

( 4) 功能码滥用

功能码是Modbus 协议中的一项重要内容,几乎所有的通信都包含功能码。目前,功能码滥用是导致Modbus 网络异常的一个主要因素。例如不合法报文长度,短周期的无用命令,不正确的报文长度,确认异常代码延迟等都有可能导致拒绝服务攻击。

8.2 协议实现产生的问题

虽然Modbus 协议获得了广泛的应用,但是在实现具体的工业控制系统时,开发者并不具备安全知识或者没有意识到安全问题。这样就导致了使用Modbus 协议的系统中可能存在各种各样的安全漏洞。

( 1) 设计安全问题

Modbus 系统开发者重点关注的是其功能实现问题,安全问题在设计时很少被注意到。设计安全是指设计时充分考虑安全性,解决Modbus 系统可能出现的各种异常和非法操作等问题。比如在通信过程中,某个节点被恶意控制后发出非法数据,就需要考虑这些数据的判别和处理问题。

( 2) 缓冲区溢出漏洞

缓冲区溢出是指在向缓冲区内填充数据时超过了缓冲区本身的容量导致溢出的数据覆盖在合法数据上,这是在软件开发中最常见也是非常危险的漏洞,可以导致系统崩溃,或者被攻击者利用来控制系统。Modbus 系统开发者大多不具备安全开发知识,这样就会产生很多的缓冲区溢出漏洞,一旦被恶意者利用会导致严重的后果。

( 3) Modbus TCP 安全问题

目前,Modbus 协议已经可以在通用计算机和通用操作系统上实现,运行于TCP /IP 之上以满足发展需要。这样,TCP /IP 协议自身存在的安全问题不可避免地会影响到工控网络安全。非法网络数据获取,中间人,拒绝服务, IP 欺骗,病毒木马等在IP 互联网中的常用攻击手段都会影响Modbus 系统安全。

8.3 安全建议

目前,Modbus 系统采取的安全防护措施普遍不足,这里参考信息安全业内研究并结合工控系统自身的安全问题,提出了一些安全建议,能够有效地降低工业控制系统面临的威胁。

( 1) 从源头开始

工控网络漏洞,很大一部分是其实现过程出现的漏洞。如果从源头开始控制,从Modbus 系统的需求设计、开发实现、内部测试和部署等阶段,全生命周期的介入安全手段,融入安全设计、安全编码以及安全测试等技术,可以极大地消除安全漏洞,降低整个Modbus 系统的安全风险。

( 2) 异常行为检测

异常行为代表着可能发生威胁,不管是有没有攻击者,因此开发针对Modbus 系统的专用异常行为检测设备可以极大提高工控网络的安全性。针对Modbus 系统,首先要分析其存在的各种操作行为,依据“主体,地点,时间,访问方式,操作,客体”等行为描述成一个六元组模型; 进而分析其行为是否属于异常; 最终决定采取记录或者报警等措施。

( 3) 安全审计

Modbus 的安全审计就是对协议数据进行深度解码分析,记录操作的时间、地点、操作者和操作行为等关键信息,实现对Modbus 系统的安全审计日志记录和审计功能,从而提供安全事件爆发后的时候追查能力。

( 4) 使用网络安全设备

使用入侵防御和防火墙等网络安全设备。防火墙是一个串行设备,通过设置,只允许特定的地址访问服务端,禁止外部地址访问Modbus 服务器,可以有效的防止外部入侵; 入侵防御设备可以分析Modbus协议的具体操作内容,有效地检测并阻止来自内部/外部的异常操作和各种渗透攻击行为,对内网提供保护功能。

  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

吮指原味张

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值