西门子300PLC与PC通信
通过路由器把电脑和PLC进行连接起来,使用博途V16进行下载硬件配置。确保能够通信后,使用wireshark进行抓包分析。
西门子PLC和电脑通信最主要是使用S7协议。但是在这之前会有一些数据包,建立连接,确认身份。
西门子PLC与PC通信使用的是TCP 102端口,一开始需要进行的其实就是TCP的三次握手,但是又不像普通的三次握手那样。
在三次握手之后,会又电脑端向PLC进行COTP通信,这个也是基于TCP协议的一个通信,其实也就是在TCP的数据端,使用TCP payload
废话不多说,直接上图
payload字段,就是红色圈起来的部分。
特别注意,在三次握手后的这个包,使用的是TCP封装起来的COTP协议,有很多的网友表示,这个其实是S7协议里面的会话层和表示层,会话层使用的是TPKT结构,一般占4个字节,第一个字节是版本号,一般为0x03,第二个字节是保留字节,剩下两个字节是payload的总长度。
TPKT的结构为: 0 (Unsigned integer, 1 byte): Version,版本信息。 1 (Unsigned integer, 1 byte): Reserved,保留(值为0×00)。 2-3 (Unsigned integer, 2 bytes): Length,TPKT、COTP、MMS三层协议的总长度,也就是TCP的payload的长度。(COTP中length不包括本身长度)
具体情况如图
在经过会话层的TPKT结构后,紧接着的就是COTP协议
)COTP协议:COTP(ISO 8073/X.224 COTP Connection-Oriented Transport Protocol)是OSI 7层协议定义的位于TCP之上的协议。COTP以“Packet”为基本单位来传输数据,这样接收方会得到与发送方具有相同边界的数据。
COTP协议分为两种形态,分别是COTP连接包(COTP Connection Packet)和COTP功能包(COTP Fuction Packet)。
COTP连接包的头结构为:
0 (Unsigned integer, 1 byte): Length,COTP后续数据的长度(注意:长度不包含length的长度),一般为17 bytes。
1 (Unsigned integer, 1 byte): PDU type,类型有:
0x1: ED Expedited Data,加急数据 0x2: EA Expedited Data Acknowledgement,加急数据确认 0x4: UD,用户数据 0x5: RJ Reject,拒绝 0x6: AK Data Acknowledgement,数据确认 0x7: ER TPDU Error,TPDU错误 0x8: DR Disconnect Request,断开请求 0xC: DC Disconnect Confirm,断开确认 0xD: CC Connect Confirm,连接确认 0xE: CR Connect Request,连接请求 0xF: DT Data,数据传输
2~3 (Unsigned integer, 2 bytes): Destination reference.目标的引用,可以认为是用来唯一标识目标
4~5 (Unsigned integer, 2 bytes): Source reference.源的引用,同上
6 (1 byte): opt,其中包括Extended formats、No explicit flow control,值都是Boolean类型。前四位标识class,也就是标识类别,倒数第二位对应Extended formats,是否使用拓展样式,倒数第一位对应No explicit flow control,是否有明确的指定流控制。
7~? (length-7 bytes, 一般为11 bytes): Parameter,参数。一般参数包含Parameter code(Unsigned integer, 1 byte)、Parameter length(Unsigned integer, 1 byte)、Parameter data三部分。
code,1byte,标识类型,主要有:
0xc0,tpdu的size,tpdu即传送协议数据单元,也就是传输的数据的大小 0xc1,src-tsap,源的端到端传输。 0xc2,dst-tsap,目标的端到端传输。
Parameter length,长度
Parameter data数据。
长度: 0x11 PDU类型(CRConnect Request 连接请求) : 0x0E 目标引用: 0x0000 源引用: 0x0007 扩展格式/流控制: 0x00 参数代码SRC-TASP: 0xC1 参数长度: 0x02 SourceTSAP:0x0100 参数代码DST-TASP: 0xC2 参数长度: 0x02 DestinationTSAP:0x0102 参数代码TPDU-Size: 0xC0 参数长度: 0x01 TPDU大小: 0x0A
COTP连接确认包
长度: 0x11 PDU类型(CCConnect Confirm 连接确认) : 0x0D 目标引用: 0x0007 源引用: 0x0003 扩展格式/流控制: 0x00 参数代码TPDU-Size: 0xC0 参数长度: 0x01 TPDU大小: 0x0A 参数代码SRC-TASP: 0xC1 参数长度: 0x02 SourceTSAP:0x0100 参数代码DST-TASP: 0xC2 参数长度: 0x02 DestinationTSAP:0x0102
确认包和连接包,其实就在于第二个字节那里,第二个字节是PDU类型,还有就是源引用和目标引用部分有所改变。
剩下的S7协议部分,请看后续