Modbus 的RTU、ASCII、TCP解析
参考:
Modbus 的RTU、ASCII、TCP傻傻搞不清楚?一文最全解读
MODBUS通讯协议完整介绍
1. 背景
早在1971年,Modicon公司首次推出了Modbus协议,Modbus RTU和Modbus ASCII诞生于此。后来施耐德电气(SchneiderElectric)收购了Modicon公司,并在1997年推出了ModbusTCP协议。2004年,中国国家标准委员会正式把Modbus作为了国家标准,开启了Modbus为中国工业通信做贡献的时代。
通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。Modbus协议具有标准、开放,可以支持多种电气接口,数据帧格式简单紧凑,数据传输量大、实时性好等特点,在工业控制系统中得到了广泛的应用,已经成为通用工业标准。深入分析Modbus协议实现原理和其安全性对提高工控系统安全性有着重要的现实意义。Modbus RTU和Modbus 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基本相同,但是也存在一些区别
- 从机地址变得不再重要,多数情况下忽略。从某种意义上说从机地址被IP地址取代。
- 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协议的具体操作内容,有效地检测并阻止来自内部/外部的异常操作和各种渗透攻击行为,对内网提供保护功能。
Modbus 的RTU、ASCII、TCP解析相关推荐
- modbus4j,rtu,ascii,tcp/ip传输模式
//感兴趣的或者需要交流的可以加qq群,大家一起讨论.群号:192656750感兴趣的或者需要交流的可以加qq群,大家一起讨论.群号:192656750 资料下载地址:https://download ...
- Modbus教程| Modbus协议,ASCII和RTU帧,Modbus工作
转载自:https://www.rfwireless-world.com/Tutorials/Modbus-Protocol-tutorial.html 这个Modbus教程涵盖了modbus协议基础 ...
- Java实现使用Modbus4j+seroUtils读取Mudbus RTU/ASCII Over TCP/IP连接设备数据
使用Modbus4j+seroUtils读取风速风向仪数据,现有设备IP,端口号,从机地址,寄存器读取开始地址,读取的寄存器数量.没有上述jar包可以自行搜索,网上资源挺多 /*** @author ...
- MODBUS主站调试工具和MODBUS从站调试工具 支持RTU、TCP、UDP三种模式
MODBUS调试工具 C#源码 包含MODBUS主站调试工具和MODBUS从站调试工具 支持RTU.TCP.UDP三种模式 开发环境VS 2012/2015/2017,.NET Framework 4 ...
- RS485接口modbus协议RTU方式
文章目录 RS485接口modbus协议RTU方式 一.RS485接口 二.Modbus通信协议 1.1 通信协议 1.2 通信方向 1.3 主从模式和寻址帧格式 1.4 modbus的主机寻址帧格式 ...
- 协议簇:TCP 解析:TCP 数据传输
简介 前面,我们分别介绍了 TCP 基础知识以及连接的建立和关闭,以及最重要的 Sequence Number 的概念. 本篇文章,我们来介绍一下 TCP 如何传输数据. 系列文章 协议簇:TCP 解 ...
- 协议簇:TCP 解析: Sequence Number
简介 序列号(Sequence Number) 是 TCP 协议中非常重要的一个概念,以至于不得不专门来学习一下.这篇文章我们就来解开他的面纱. 在 TCP 的设计中,通过TCP协议发送的每个字节都对 ...
- 协议簇:TCP 解析: 连接断开
简介 接前文 协议簇:TCP 解析: 建立连接, 我们这篇文章来看看 TCP 连接断开的过程,也就是众所周知的"四次挥手"的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇 ...
- 协议簇:TCP 解析: 建立连接
简介 接前文 协议簇:TCP 解析: 基础, 我们这篇文章来看看 TCP 连接建立的过程,也就是众所周知的"三次握手"的具体流程. 系列文章 协议簇:TCP 解析:基础 协议簇:T ...
最新文章
- 博客大事记之迁移博客到香港主机
- 五大存储模型关系模型、键值存储、文档存储、列式存储、图形数据
- 赚票子、调身子、养孩子,陌陌的中年人生活有序展开
- 【深度学习】这千层transformer让我目瞪口呆
- .NET 6 Preview 6 Released
- python中spider的用法_Spider-PyQuery基本用法(示例代码)
- 运维网发布的nagioscacti配置文档
- 苹果系统备份文件服务器地址,IOS备份到tftp服务器和升级IOS
- [转]国外英语教学网页
- 怎么用计算机录制mp3的音频,内录音频是什么_如何用电脑内录音频图文步骤
- visio用例图箭头怎么画_Visio画图(一):UML用例图
- html css javascript jdk 等离线开发手册
- java分支讵_Java实现简体字向繁体字的转换
- idea安装jclasslib和BindEd,以及使用
- kafka安装和相关命令操作——修改中
- tpshop 去掉index.php,TPshop-TPshop隐藏index.php
- C# 通过反射获取类属性标识名称
- Java DES 加密解密
- 移动开发:Android数据连接浅析
- 数学励志公式:每天进步一点点
热门文章
- 微信小程序网易云音乐轮播图右侧留白
- SSM+mysql+微信小程序网易云音乐设计与实现 毕业设计-附源码261620
- 自定义地雷数的扫雷(控制台运行)
- 星起航:抖音小店体验分低怎么办,如何提高店铺体验评分?
- 2017年下半年小虎软考备考攻略
- rar有损解压和无损解压是什么意思
- 关于科傻软件的使用感受
- matlab 画三维极值点,用Matlab找一组模拟波形的极值(含极大值、极小值、最大值)并在图中画出来...
- openGPS.cn - 关于手机号定位方面的个人理解
- matlab 复数函数拟合,lsqcurvefit拟合结果为复数