工业协议之 S7

S7 协议

1.S7协议模型

    首先应当明确的是,S7以太网协议本身也是TCP/IP协议簇的一员,S7协议在OSI中的位置相当于将物理层和数据链路层之上的协议进行了定义,其中的对应关系大致为:
 

模型对比
OSI模型 TCP/IP协议模型 S7 以太网模型
应用层(Application Layer) 应用层(Application Layer) S7 Communication
表示层(Presentation Layer) COTP
会话层(Session Layer) TPKT
传输层(Transport Layer) 传输层(Transport Layer) TCP
网络层(Network Layer) 网际层(Internet Layer) IP
数据链路层(Data Link Layer) 链路层(Link Layer) 工业以太网
物理层(Physical Layer)

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

  1. TCP/IP协议:有不同的说法,4层和5层模型的区别在于有没有将低两层分开看待
  2. TPKT(Transport Service ontop of the TCP):通过TCP的传输服务。介于TCP和COTP之间。属于传输服务类的协议,功能为在COTP和TCP之间建立桥梁,其内容包含了上层协议数据包的长度。一般与COTP一起发送,当作Header段工业协议之 S7_第1张图片
  3. COTP(Connection-Oriented Transport Protocol):面向连接的传输协议。与TCP一样都是为了可靠地传输用户数据,但是TCP基于字节流而COTP基于数据包,表现形式上就是COTP将数据包从一个用户传输到另一个用户,接受方可以获得和发送方完全一样的数据边界;而TCP通过流传输,因此TCP协议通常需要加入标志信息来标识自己的边界,比如上述的TPKT就是完成了一个这样的功能。
    工业协议之 S7_第2张图片
    如上图所示,出于复用服务端和客户端之间会话的目的,COTP的字段中包含了TSAP(传输服务访问点),TSAP共2个字节,其中第二个字节为机架号+插槽号,插槽号位于0-4bit,机架号位于5-7bit。在连接建立时匹配TSAP,在数据传输时由2个字节(目标,源)参考代替
  4. COTP中的字段含义:
    i)PDU Type :协议数据单元类型,一般在建立连接时为CR Connect Request,确认连接时为CC Connect Confirm,即连接请求和连接确认
    ii)Source TSAP:源设备的TSAP( KEPSERVER OPC)
    iii)Destination TSAP:目的设备的TSAP(S7-200 SMART PLC)
  5. S7 Communication:包含三个整体字段,根据协议功能(Parameter.Function)不同,Data字段的存在与否可能变化,一般请求类function的报文可能只包含前两部分:
    工业协议之 S7_第3张图片
    工业协议之 S7_第4张图片

    i)Header:一般包含长度信息,如Parameter length,Data length;PDU参考(PDU Reference)等
    ii)Parameter:内容和结构根据PDU的消息和功能差异较大
    iii)Data:可选字段,用来携带数据,比如存储器值,块代码,固件数据等。
    补充:Parameter.Function中的取值及其对应的功能:
    Function与Code对应关系
    Parameters Code Parameters Function
    0x00 diagnostics
    0x04 read
    0x05 write
    0x1a request_download
    0x1b download_block
    0x1c end_download
    0x1d start_download
    0x1e upload
    0x1f end_upload
    0x28 plc_control
    0x29 plc_stop
    0xf0 setup communication

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时就进行数据交换,服务器一般会直接断连

3.补充内容

3.1 西门子 PLC

  •     西门子S7-300模型图:工业协议之 S7_第5张图片
    • 标号与对应模块及功能:
      模块及功能
      编号 模块 功能
      1 电源模块 供电专用
      2 CPU模块 负责处理信息
      4 通信模块 进行网络传输,同时也是平时接入fuzz的模块
      5 数字量输入模块(DI) 数字信息输入接口
      6 数字量输出模块(DO) 取决于编码:有时候数字模块的指示灯会根据信息进行变化
      7 模拟量输入模块(AI) 模拟信息输入接口
      8 模拟量输出模块(AO) 模拟信息输出接口

      很明显,数字信息与模拟信息的输入输出通道非复用。
      补充:关于上表中提到的fuzz:fuzz指模糊测试,总的来说就是使用特定的协议模板来随机生成数据构成包,然后发送给server查看server是否响应和响应结果是否正确,从而发现可能造成安全性问题的漏洞。针对S7的fuzz而言,无论使用何种fuzz策略,都必须保证TPKT和COTP格式的正确,同时还要注意字节长度length字段的正确。否正生成的数据包最终会无法通过验证,也就无法完成预定的测试目标。

3.2 西门子S7 通信场景

  1. 西门子通信
    西门子的设备使用不同的现场总线协议,如:MPI,Profibus,IE,Profinet等。其中Profinet将PLC连接至IO模块,并非设备的管理协议。而S7 以太网通信协议,用于将PLC连接至pc站。
  2. 数据报的字段和关系
    工业协议之 S7_第6张图片
     
    此处也再次强调下S7 协议其实还是TCP的一部分,是TCP协议簇的一部分

3.3 S7 PDU 详细字段含义

  1. S7 协议中的TCP/IP实现依赖于面向块ISO传输服务,S7 协议包含在TPKT和ISO-COTP协议中,允许PDU通过TCP承载。S7 协议是面向功能/命令的协议,这决定了传输中会包含请求与对应的回应,在建立连接的时候就确定并行传输的数量和PDU的最大长度。
  2. Header详细字段 
    Header Details
    字段名 长度 含义 备注
    Protocol ID 1byte 协议常量 始终为0x32(S7 协议的类型编号)
    Message Type/ ROSCTR 1byte 消息的一般类型 消息中的其它字段对这个字段依赖性很大,类型决定要做的事,自然也决定了需要准备
    常见的type和对应的功能码 0x01:Job Request 主站发送的请求,如读写存储器,读写块,启动/停止设备,通信设置
    0x02:Ack 从站发送的简单确认,没有数据字段
    0x03:Ack-Data 带有可选数据字段的确认,包含对作业请求的回复
    0x07:Userdata 原始协议的扩展,参数字段包含请求/响应id(常用于编程/调试,SZL读取,安全功能,时间设置,循环读取等)
    Reserved 2byte 始终设置为0x0000 可能忽略
    PDU Reference 2byte 由主站生成,每次新传输时递增,用于链接对其请求的响应,Little-Endian 只是属于WinCC,Step 7和其它西门子程序的行为,它可能是随机生成之后,PLC将其复制到回复中
    Parameter Length 2byte 参数字段的长度 Big-Endian
    Data Length 2byte 数据字段的长度 Big-Endian
    Error class 1byte 错误信息 仅出现在Ack-Data中,正常时为0x00
    Error code 1byte 错误信息代码 仅出现在Ack-Data中,正常时为0x00
  3.  Parameter详细字段(尚未完成,最近有其他事要做。。。)
    Parameter参数取决于Message Type和功能代码。此处的描述只针对Job Request和Ack-Data,二者的parameter都是以Function 开头,其余字段受Function类型的影响,变化很大。
    在交换信息开始前,会话会互发消息,即分别发送Job Request和Ack-Data,完成协商Ack队列的大小和最大PDU长度的功能,双方都说明自身支持的值。Ack队列的长度决定了可以在没有确认的情况下同时启动的并行作业数量。PDU和队列长度都是大端模式。具体内容包含:
    parameter字段含义
    字段名 含义
    Function 函数功能,一般为功能代码,通信设置为0xf0
    Reserverd 保留字段,默认为0x00
    Max AmQ calling Ack队列的大小
    Max Amq called  
       

     

你可能感兴趣的:(工业协议)