-
手把手教你手撸通讯协议----S7协议解析
- 网站名称:手把手教你手撸通讯协议----S7协议解析
- 网站分类:技术文章
- 收录时间:2025-09-10 22:48
- 网站地址:
“手把手教你手撸通讯协议----S7协议解析” 网站介绍
1、理论知识
补上上一篇文章的链接!
数据流方向:
下面这个图很清晰的解释数据包是怎么从网卡一路到应用程序的。
当网卡接收到来自外部调解好的电平信号,网卡将电信号转化为数据缓存到网卡缓存区,然后通过DMA协议将数据同步到内存区域中,CPU直接访问内存,将网卡的数据进行截取,并将截取好的数据发送到应用程序进行拆包解析。
2、协议封装
以上图为例:
由于TCP协议需要各种校验、确认,涉及的知识点有点多,暂时图中以UDP协议为例,其实以太网的协议类似于俄罗斯套娃,从用户层的数据包,到传输层是加上了UDP在传输层的协议头:UDPhdr,然后网络层再在这个帧上加上了一个ip协议头:iphdr;而后到链路层,又加上了ether_hdr协议头,最终通过物理层将数据转化成电平或者光信号传递出去。
接下去,我们用代码实现一个udp包怎么打包并发送,来深入理解网络是怎么工作的。
首先我们创建一个用户的数据包:body[0];
链路层还未产生ip地址,所以链路层的地址发现主要以mac地址的方式进行通讯,mac的地址长度为6 bytes;链路层的协议主要由2个bytes确定:
接下来我们要进行网络层的网络头进行打包:
网络层比链路层复杂很多,此时需要产生ip地址,也包含了很多功能。网络层的主要架构如下图所示:
代码如下:
主要包含了版本号,首部长度,服务类型,字节数,标识,标志,片偏移,生存时间(TTL),协议,首部校验和,源IP地址,目的IP地址,选项,数据等格式。
在传输层中,产生了端口号:如常见的102端口、80端口、3306端口、44818端口、502端口。
3、数据解析
以下以西门子的S7协议为例,S7协议与上位机通讯主要基于可靠的TCP协议。以下包主要包含了从第五层到第七层的详细数据解析。
读取数据发送报文
- TPKT(第五层:会话层)
- 该层总共占4个字节:
- 版本号:0x03
- 预留:0x00
- 长度:0x001F
- COTP(第六层:表示层)
- 该层总共占3个字节:
- 长度:0x02
- PDU类型(DT Data):0XF0
- 目标引用:0x80
- S7Communication(第七层:应用层)
- 该层总用占24个字节,并且分两部分:
- Header:
- 协议ID(Protocol ID):0x32
- Ack_Data:0x01
- 预留:0x0000
- 协议数据单元引用:0x037D
- 参数长度:0x000E
- 数据长度:0x0000
- Parameter:
- 功能码Read Var:0x04
- 通信项数:0x01
- 通信项1:
- 通信项Header
- 变量指定:0x12
- 地址长度:0x0A
- SyntaxID:0x10
- 传输数据类型byte:0x02
- 通信项Param
- 读取长度:0x04
- DB号:0x01
- 存储区类型DB存储区:0x84
- 开始字节:0x000000
返回帧:
报文说明:
- TPKT(第五层:会话层)
- 该层总共占4个字节:
- 版本号:0x03
- 预留:0x00
- 长度:0x001D
- COTP(第六层:表示层)
- 该层总共占3个字节:
- 长度:0x02
- PDU类型(DT Data):0XF0
- 目标引用:0x80
- S7Communication(第七层:应用层)
- 该层总用占22个字节,并且分两部分:
- Header:
- 协议ID(Protocol ID):0x32
- Ack_Data:0x03
- 预留:0x0000
- 协议数据单元引用:0x037D
- 参数长度:0x0002
- 数据长度:0x0008
- 错误等级:0x00
- 错误代码:0x00
- Parameter:
- 功能码Read Var:0x04
- 通信项数:0x01
- 通信项1:
- 返回结果Success:0xFF
- 传输数据类型Byte/Word/DWord:0x04
- 长度:0x0020
- 数据:0x00000000
- 该返回报文说明读取的4个字节数值均为0
解包的实现代码:
其实做工业协议的解析都是按照规则一步一步进行拆解。
更多相关网站
- 携TCL同步院线 乐视HDR曲面4K电视发布
- Apple 苹果 iPhone 14 Pro Max 智能手机屏幕测评报告 「SOOMAL」
- OPPO A3 Pro支持IP69级防水:防水,更防高压喷热水
- 游戏早报:尺度惊人!写实向3D动作手游《欲神幻想》开启预约
- 如何计算UDP头的checksum_udp的校验和怎么计算
- 使用 eBPF 和 Rust 模拟开放端口,实现欺骗端口扫描器
- 第22届上海国际电影节金爵盛典将首次运用5G+4K技术全程直播
- 图像压缩技术的跃迁:从JPEG2000到JPEG XS的音视频传输革命
- SONY 索尼 HDR-AZ1 佩戴式摄影机_索尼hdr系列摄像机
- Python 高级编程之网络编程 Socket(六)
- MFC IP地址控件、拆分按钮和超链接
- 「观潮」4K HDR高动态范围制作技术(下)
- 轻量易部署!Coolbpf 发布不依赖 Clang 的脚本化编程特性 lwcb
- 探索eBPF:Linux内核的黑科技_bsd linux
- 【小知识点】一个netfilter forward hook的例子
- 动手写一个基于Linux内核的网络数据包拦截扩展
- 苹果12pro和13pro外观有哪些区别?
- 网卡VXLAN的offload技术介绍_vnic网卡
- 最近发表
- 标签列表
-
- mydisktest_v298 (35)
- sql 日期比较 (33)
- document.appendchild (35)
- 头像打包下载 (35)
- 梦幻诛仙表情包 (36)
- java面试宝典2019pdf (26)
- disk++ (30)
- 加密与解密第四版pdf (29)
- iteye (26)
- centos7.4下载 (32)
- intouch2014r2sp1永久授权 (33)
- jdk1.8.0_191下载 (27)
- axure9注册码 (30)
- 兔兔工程量计算软件下载 (27)
- ccproxy破解版 (31)
- aida64模板 (28)
- engine=innodb (33)
- shiro jwt (28)
- segoe ui是什么字体 (27)
- head first java电子版 (32)
- clickhouse中文文档 (28)
- jdk-8u181-linux-x64.tar.gz (32)
- 计算机网络自顶向下pdf (34)
- -dfile.encoding=utf-8 (33)
- jdk1.9下载 (32)