我是靠谱客的博主 直率小蝴蝶,最近开发中收集的这篇文章主要介绍工控协议——S7通讯协议S7协议简介S7comm协议,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

工控协议——S7通讯协议

  • S7协议简介
    • 2. TPKT协议
    • 3.COTP协议
    • S7通信支持两种方式
  • S7comm协议
    • S7comm的结构主要分为三部分:
      • Header:

S7协议简介

S7以太网协议本身也是TCP/IP协议簇的一员,S7协议在OSI中的位置相当于将物理层和数据链路层之上的协议进行了定义,S7comm的协议栈修改程度更高,在应用层组织的数据经过COTP协议、TPKT协议的进一步处理后,最终通过TCP进行传输
在这里插入图片描述
S7协议与TCP/IP其中的对应关系:

ISO-OSI参考模型TCP/IP模型S7以太网协议模型
7-应用层4-应用层6-S7 Communication
6-表示层5-S7 Communication (COTP)
5-会话层4- S7 Communication (TPKT)
4-传输层3-传输层3-TCP(102端口)
3-网络层2-网络层2-IP
2-数据链路层1-网络接口层1-工业以太网
1-物理层

备注:这里的S7模型并不是说S7是独立于TCP/IP的,只是为了标出S7模型下比较有代表性的内容,事实上S7就是TCP的一种定制,是TCP协议簇的一种

在进行报文分析前,我们首先把s7的大概分析如下:

2. TPKT协议

TPKT(Transport Service ontop of the TCP):通过TCP的传输服务。介于TCP和COTP之间。属于传输服务类的协议,它为上层的COTP和下层TCP进行了过渡。功能为在COTP和TCP之间建立桥梁,其内容包含了上层协议数据包的长度。一般与COTP一起发送,当作Header段。我们常用的RDP协议(remote desktop protocol,windows的远程桌面协议)也是基于TPKT的,TPKT的默认TCP端口为102(RDP为3389),其实它本身为payload增加的数据并不多,主要就是以下几个:
在这里插入图片描述
version,1byte,表明版本信息
reserved,1byte,看到这个名字就知道是保留的了
length,2byte,包括payload和这三部分在内的总长度

接下我们用2018工控比赛流量包来实际看一眼:
在这里插入图片描述
可以看到,版本号是3号,长度为31,除此之外该层并没有什么有用信息了

3.COTP协议

COTP协议的全称是(Connection-Oriented Transport Protocol),即面向连接的传输协议,从这个名字就可以看出,它的传输必然是依赖于连接的,所以在传输数据前必然有类似TCP握手建立链接的操作。

接下来我们看看具体的流量包:

在这里插入图片描述
首先是TCP的三次握手,在192.168.25.146与192.168.25.139间建立了TCP连接,之后是两个COTP的包,注意,这里wireshark为我们标注出了CR和CC,后面的COTP包都是DT,这里的CR和CC其实分别是connect request(请求连接)和connect confirm(确认连接)的,也就是建立连接的过程,之后连接建立成功后,发送DT包,也就是data ,是在发送数据。
(备注:wireshark是网络封包分析软件:下载地址为:https://www.wireshark.org/download.html有兴趣的可以去下载了解一下)

接下来我们看看他们所携带的数据:
在这里插入图片描述
可以看到,DT包和连接包有着明显的不同,连接包明显多了一堆内容,这其实是COPT包的两种形态,COTP连接包(COTP Connection Packet)和COTP功能包(COTP Fuction Packet)

首先来看COPT连接包,通过上面的wireshark的分析我们可以看到,主要有以下几个字段:

  • length,1byte,数据的长度,但并不包含length这个字段(至于为什么这样,不清楚)
  • PDU type,1 byte,标识类型,图中的0x0d即为连接确认的类型,常有的还有
    • 0xe,连接请求
    • 0x0d,连接确认
    • 0x08,断开请求
    • 0x0c,断开确认
    • 0x05,拒绝
  • DST reference,2byte,目标的引用,可以认为是用来唯一标识目标
  • SRC reference,2byte,源的引用,同上
  • option,1byte,可以看到wireshark将8位拆为了前四位和后两位:
    • 前四位标识class,也就是标识类别
    • 倒数第二位对应Extended formats,是否使用拓展样式
    • 倒数第一位对应No explicit flow control,是否有明确的指定流控制
  • parameter,附加的参数字段,参数可以有多个,每个参数又由以下几个字段构成:
    • code,1byte,标识类型,主要有:
      • 0xc0,tpdu的size,tpdu即传送协议数据单元,也就是传输的数据的大小(是否和前面的length有重复之处?)
      • 0xc1,src-tsap,翻译过来应该叫源的端到端传输(在完整的TCP/IP协议栈中,这个字段代表的是应用与应用之间的通信,我这里猜测可能是为了),但从西门子给的手册来看,它标记的应该是机架号,可是不管我怎么查,也没有找到wireshark解析出的字符串。那么逆向我们找不到答案,就只能正向来了,在parameter字段的最后我们再来详细说这到底是个啥。
        在这里插入图片描述
      • 0xc2,dst-tsap,同上,之后我们再探索
    • length,长度
    • 对应的数据
      接着COPT功能包,其实个人感觉这两种包可以归为一种,但是看到文献都是分为两种的,那我们也就划分为两种吧
      length,1byte,长度
      PDU type,1 byte,图中为0x0f,即为数据传输,此外的type都不太常用,这里不再提了(其实是我没找到相关的流量包……有这方面流量的大佬希望补全以下)
      option,1byte,以位为单位划分:
      第一位,标识是否为最后一个数据包(从这可以看出,COPT协议当数据较多时,会分为几个单元传输
      后七位,标识TPDU的number
      到这COPT包我们就算是分析的彻彻底底了,当然,上面还留了个小问题,parameter里的tsap到底是个什么东西?

S7通信支持两种方式

1.基于客户端(Client)/服务器(Server)的单边通信;
客户端(Client)/服务器(Server)模式是最常用的通信方式,也称作S7单边通信。在该模式中,只需要在客户端一侧进行配置和编程;服务器一侧只需要准备好需要被访问的数据,不需要任何编程(服务器的“服务”功能是硬件提供的,不需要用户软件的任何设置)。
2.基于伙伴(Partner)/伙伴(Partner)的双边通信;
有时候,我们需要双向的数据操作,这就要使用伙伴(Partner)/伙伴(Partner)通信模式。
伙伴(Partner)/伙伴(Partner)通信模式也称为S7双边通信,也有人称其为客户端(Client)—客户端(Client)模式。不管是什么名字,该通信方式有如下几个特点:

  • 通信双方都需要进行配置和编程;
  • 通信需要先建立连接。主动请求建立连接的是主动伙伴(Active Partner),被动等 待建立连接的是被动伙伴(Passive Partner);
  • 当通信建立后,通信双方都可以发送或接受数据;

举例:在S7-300中,使用FB12(BSend)/FB13(BRecv)进行发送和接收。当一方调用发送指令时,另一方必须同时调用接收指令才能完成数据的传输。

S7comm协议

S7comm的结构主要分为三部分:

Header
Header:主要是数据的描述性信息,包含长度信息,PDU参考和消息类型常量,最重要的是要表明PDU的类型
Parameter:参数,随着不同类型的PDU会有不同的参数
Data:数据,该数据是一个可选字段来携带数据,例如存储器值,块代码,固件数据等。
如下图:
在这里插入图片描述

Header:

在这里插入图片描述
在这里插入图片描述
Protocol id 1 byte,即协议的id,始终设置为0x32
ROSCTR 1byte,pdu(协议数据单元(Protocol Data Unit))的类型,一般由以下几种:

  • 0x01-job:开工干活的意思,主设备通过job向从设备发出“干活”的命令,具体是读取数据还是写数据由parameter决定
  • 0x02-ack:确认 确认有没有数据字段
  • 0x03-ack-data:从设备回应主设备的job
  • 0x07-Userdata:原始协议的扩展,参数字段包含请求/响应id,(用于编程/调试,SZL读取,安全功能,时间设置,循环读取…)

Reserved:2byte,保留,始终设置为0x0000
PDU reference:|pdu的参考–由主站生成,每次新传输递增,用于链接对其请求的响应,Little-Endian(注意:这是WinCC,Step7和其他西门子程序的行为,它可能是随机的生成后,PLC只将其复制到回复中)
parameter length:参数的长度
error class:错误类型,像是图中的0x00就是没有错误的意思,而常见的请求错误则是0x85
error code:错误码,结合错误类型来确定错误,图中的0x00同样是没有错误的意思
关于具体的错误类型和错误码的信息大家可以自行搜索,因为太多了这里就不再展开说明了。
推荐地址:https://www.jianshu.com/p/19798f2768e1

Parameter:取决于不同的pdu类型,
下面来看看具体的流量包

可以看到该pdu为job,也就是主设备在发号施令,而通过parameter可以看到,function是0x04的read,也就是读取数据,item count意思是后续跟了几个item,该pdu就一个,所以为1。

而这个item的结构就有要单独说说了:
variable specification,1byte,一般就是0x12
Length:Length of following address specification,数据的长度
Syntax Id:符号id,一个标志,决定了一些格式性问题,这里是0x10是Address data S7-Any pointer-like DBx.DBXx.x的意思,具体意思我们下面再提,详细的大家还是可以去自己看看,主要就是对于后续的寻址起到了一定的限定
Transport size: 传输大小,也可以认为是传输类型,在这是4,也就是WORD
DB number: 就是数据块编号的意思,0就代表要找的东西不在数据块里
Area: 要操作的“东西”,比如0x82,就是读设备的输出,通过这一位也可以看到,我们要读的数据不在DB里,所以DB number为0,如果为DB的话,这1byte应该为0x84
Address: 具体的地址,如下图所示,前五位没用到,第六位到第二十一位是Byte地址,最后三位是Bit的地址

首先,它定义了格式为Address data S7-Any pointer-like DBx.DBXx.x,然后指定了读取的”东西“为设备的输出,读取的大小为word,其实到这里这个pdu的全部信息就已经分析完了,为了更好的理解上面定义的格式,我们还是继续看一下。

它读的DB number是0那么根据格式就是DB0.DBXx.x,而读取的address是Byte为0,Bit为0,也就是DB0.DBX0.0,如果我们指定的”东西“为数据块的话,就按照这种格式读取。这就是格式的意思,再比如说0xb2,描述为Symbolic address mode of S7-1200,实际上格式就是符号地址,就不再是这样的组织形式了。

再来看看上个pdu的相应,这里截图没截到header,header最值得关注的是pdu的类型,这里是0x03,也就是我们之前提到过的对于job的相应
而paramter部分可以看到,function是与job pdu的相同的。Data部分就是传回来的具体数据了,return code是返回码,用来标识job让干活的结果,这里是0xff,代表的是成功的意思,除了这个,还有以下几种:
0x01,硬件错误
0x03,想访问的东西不让访问
0x05,地址越界了
0x06,你请求的数据类型和请求的”东西“的数据类型不一致
接着是data的长度(是真的data的长度,不包含前面),最后就是具体的data了,可以看到,这里读到的是0x0000。

下面结合具体案例分析
工业协议数据流量包分析
在这里插入图片描述
可以看到一大堆的协议,不过整体思路还是刚才清晰的,首先是ARP协议去找mac地址(不知道arp的,补一下计算机网络的知识吧……),接着是标准的TCP三次握手,接着是COTP的建立连接(要不以后我叫他两次握手?),接着就到了S7comm和modbus来具体干活了。
思路体现如下:
ARP–>mac地址–>TCP三次握手–>COTP建立连接–>S7comm干活

我们可以看到这个job和我们之前的并不一样,打开仔细瞧瞧

我们看到parameter中的funtion为0xf0,是建立通信的意思,这其实是和上面的TCP、COPT有些相似的,都是在两个设备之间建立通信,而参数的主要信息是MAX AMQ calling和MAX AMQ called。
下面一个ack_data的pdu自然是相应建立通信的意思了,经过TCP握手、COPT建立连接、S7comm建立通信,这样设备间的通信才正式建立完毕了。
往后的S7comm可以看到是read,也就是在读数据,数据包和上面提到的一样,
总结
S7comm作为一个私有协议,它的可出题点其实更多,而且由于是私有协议,很多地方都还有挖掘的空间,这篇文章只是带大家按照我的思路,从无到有的分析了S7comm的各个部分,肯定有不完全正确的地方,也肯定有细节没有考虑到,希望大家能更进一步,探索更多的秘密。
数据来源:https://github.com/w3h/icsmaster/tree/master/pcap

2.S7 协议工作流程

  1. client与server通过socket建立连接,过程是标准的TCP连接方式,这一步完成连接的建立
  2. client发送COTP,请求连接PLC,报文中包含CR Connect Request和Destination TSAP,从而标识出CPU的机架号和槽号
  3. PLC返回COTP,确认连接,报文中包含CC Connect Confirm,此时server已经明确client与哪个CPU进行通讯
  4. client发送S7 Communication给server,报文中包含Setup communication,即通讯请求
  5. server返回S7
    Communication给client,报文的ROSCTR为ACK_DATA,有确认的意思,包含了对作业请求的回复
  6. client与server发送交换数据的报文,仍以S7 Communication完成

注:2-5的步骤中,2与3完成数据传输前连接的功能,4与5则完成连接之后的通讯请求,如果绕过通讯请求的建立,在有TCP时就进行数据交换,服务器一般会直接断连
另外推荐几个有用的协议网站
开源通信库snap7:http://snap7.sourceforge.net/
S7 wireshark解析器:https://sourceforge.net/projects/s7commwireshark/
S7捕获包:https://github.com/gymgit/s7-pcaps
PLC4X: http://plc4x.apache.org/protocols/s7/index.html

最后

以上就是直率小蝴蝶为你收集整理的工控协议——S7通讯协议S7协议简介S7comm协议的全部内容,希望文章能够帮你解决工控协议——S7通讯协议S7协议简介S7comm协议所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部