⼯控协议-s7通讯协议
⼯控协议——S7通讯协议
S7协议简介
2. TPKT协议
3.COTP协议
S7通信⽀持两种⽅式
S7comm协议
S7comm的结构主要分为三部分:
Header:
S7协议简介
S7以太⽹协议本⾝也是TCP/IP协议簇的⼀员,S7协议在OSI中的位置相当于将物理层和数据链路层之上
的协议进⾏了定义,S7comm的协议栈修改程度更⾼,在应⽤层组织的数据经过COTP协议、TPKT协议的进⼀步处理后,最终通过TCP进⾏传输
S7协议与TCP/IP其中的对应关系:
备注:这⾥的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握⼿建⽴链接的操作。
接下来我们看看具体的流量包:
接下来我们看看他们所携带的数据:
可以看到,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))的类型,⼀般由以下⼏种:
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和我们之前的并不⼀样,打开仔细瞧瞧
2.S7 协议⼯作流程

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。