记录一次大炮打蚊子的modbustcp通讯连接异常问题

news/2025/1/11 20:57:49/文章来源:https://www.cnblogs.com/WuLaRua/p/18521583

一.问题描述

某种场景下,安装有Ubuntu22系统的设备A开机后,1-2min内设备E遥控器不能遥控设备A移动,之后恢复正常。

二.设备组网

设备A和设备C之间使用modbustcp协议进行通讯。

三.首战

3.1 查看日志

放开该端口的modbus查询帧日志打印,发现整体的帧格式,发现返回了modbus数据帧,但是返回帧是82错误码的帧,可能是由网络问题导致的。

3.2 ping查看网络通路通信状况

使用ping命令,ping从机ip,查看是否能ping通,并查看丢包率,确认通路良好,延迟低、无丢包。

3.3 mNetAssist网络调试助手

在ubuntu主机上面安装网络调试助手mNetAssist,测试查询数据正常。

3.3.1 使用方法

在ubuntu上运行mNetAssist查询从机数据:

  1. 协议类型选择TCP客户端;
  2. 服务器IP和端口为指定的modbus从机的ip地址和端口;
  3. 本地IP填写主机查询网口的ip,本地端口随便填写会自动分配;
  4. 发送设置要勾选按十六进制发送;
  5. 接收设置可以勾选显示日期和按十六进制显示;

设置好之后,点击服务器端口下方的连接网络,如果成功建立连接,会变为断开网络,之后在本地IP下面填入要发送的modbus数据帧,点击发送,如果成功查询到数据,上方的数据接收区会显示查询结果。

注意,1、2、3、4如果设置不正确,则可能无法建立网络连接,或者发送查询数据无反应。

3.3.2 安装方法

通过百度网盘分享的文件:网络调试助手win_linux.zip

链接:https://pan.baidu.com/s/1MjVtxmtU4hTBV8wDKPN4_g

提取码:t4nu

--来自百度网盘超级会员V8的分享

下载压缩包,解压后参考其中readme.txt中的操作。

3.4 使用wireshark抓包

Ubuntu主机安装wireshark进行抓包,可以观察到,确实在开机一段时间后才开始建立连接进行通讯。同时还注意到在开机之后一段时间内,有其他的ip在和从机建立连接,并且进入了retransmission阶段,在该ip和从机重连结束后,目标主从机开始正常连接。

3.5 首战总结分析

首战,到此为止没有什么意外发现,也是在意料之中。

当前问题为开机1-2min内手柄无法遥控机器,开机之后,电脑连接路由器wifi需要一定时间,网络调试助手和wireshark都是桌面端,连接wifi之后远程桌面操作软件更需要一定时间,现在可能需要彻底搞清楚从刚刚开机到连接成功之间的网络状态。

因为是linux主机,所以可以考虑使用开机自启动脚本实现开机之后程序自启动执行所需操作。

四.再战

4.1 modbuspoll

上面我们安装的mNetAssist网络调试助手是桌面软件,需要在界面手动修改各项参数,然后建立连接,进行查询,不能应用于开机脚本自启动中,因此,我们需要找一款可以以命令行的方式工作的modbus数据帧查询软件,我选择了modbuspoll。

  • ModbusPoll使用方法

mbpoll 192.168.11.12 -p 460 -B -0 -a 1 -t 1 -r 0 -c 0x10 -v

参数功能说明:

4.2 tcpdump

因为wireshark也是图形化界面操作,想要用脚本在开机后自启动抓包,就需要一款命令行操作的抓包工具,我选择了tcpdump。

直接抓取所有接口的流量:sudo tcpdump -i any -w capture.pcap

4.3开机自启动实现方式

4.3.1方式一.应用程序级启动方式

以tcpdump自启动脚本为例:

  1. 首先来写一个抓取数据包的脚本tcpdump_self_start_cap.sh:

#!/bin/bash

current_time=$(date +"%Y%m%d-%H%M%S")

echo "password" | sudo -S tcpdump -i any -w capture_${current_time}.pcap

注:

password:为执行sudo命令时需要输入的密码

-S: 想要sudo命令从管道中读取echo输入的密码,必须加这个参数

  1. 在Activities → start application → Add → Command中输入:

gnome-terminal -x bash -c "/....../tcpdump_self_start_cap.sh"

  1. 最终效果

该方法实现的开机自启动脚本,linux开机启动后,远程桌面登录linux系统,就会打开一个终端,并自动执行脚本程序,但是如果开机启动后不远程连接桌面,该脚本就一直不会自启动,显然这种方式并不是真正的开机自启动,也无法达到我想要的效果。

4.3.2方式二.系统级启动方式

同样以tcpdump为例,tcpdump执行脚本还是上面的脚本tcpdump_self_start_cap.sh。

1.在/etc/systemd/system路径下添加tcpdump_capture.service脚本,脚本内容如下:

[Unit]

Description=Capture network traffic using tcpdump

After=network.target

[Service]

User=root

ExecStart=/....../tcpdump_self_start_cap.sh

Restart=always

[Install]

WantedBy=multi-user.target

  1. 执行如下命令

sudo systemctl enable tcpdump_capture.service

sudo systemctl start tcpdump_capture.service

  1. 执行效果

系统开机后,不需要连接linux主机,就会自动启动脚本执行相应操作

4.4 再战总结分析

将tcpdump抓包和modbuspoll数据帧查询脚本均加入开机自启动服务,复现问题场景,观察到,开机启动后短时间内modbuspoll就可以和从机通讯,1-2min后问题软件才开始和modbus从机通讯。

dmesg、syslog和journalctl日志也未发现网络异常,经过两次测试验证,可以确认问题程序之外的其他方面应该没有问题,因此重新回到问题程序,推测是程序的什么地方耗费了较长的时间。

五.终战

5.1 回归日志和问题程序

回看之前保存的问题情况下的日志,仔细观察后发现:

tcp初始化之后一直到tcp成功连接,中间居然隔了133s,其中主要时间都浪费在了初始化和第一次连接之间:

回看代码,发现初始化到建立连接之间并没有什么耗时的操作,大胆推测是建立连接的过程比较耗时,于是在connect函数执行前后添加日志打印:

...”...before connect...”...;

sc_ -> connect(...);

...”...after connect...”...;

复现问题场景之后,可以看到:

目前想到的解决办法是调用connect函数建立连接时,增加超时时间,尚未测试验证

5.2 终战总结分析

1.看日志还是要认真仔细一点;

2.学习别人的源码还是要细节一点;

PS:希望这篇记录能对大家在使用文中提及的工具上有所帮助,更深的帮助应该是没有了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/825604.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读数据工程之道:设计和构建健壮的数据系统25查询

查询1. 查询 1.1. 通过理解查询、建模和转换​,你会掌握将原始数据转化为下游利益相关者可用数据的工具 1.2. 被很多人熟知的SQL,这是最流行和通用的查询语言 1.3. 查询是数据工程、数据科学和数据分析的基础 1.4. 在了解数据转换的基本模式和技术之前,你需要了解什么是查询…

制作一个龙芯旧世界的 dotnet sdk docker 镜像

本文将和大家分享如何制作一个在龙芯旧世界上可跑的 dotnet sdk docker 镜像,以及我的踩坑过程以下是我的 dockerfile 文件,内容特别简单 FROM cr.loongnix.cn/library/debian:buster WORKDIR /root RUN apt-get update -y && \apt-get install -y --no-install-reco…

18-网络安全测评技术与标准

18.1 概况 1)概念 :指参照一定的标准规范要求,通过一系列的技术和管理方法,获取评估对象的网络安全状况信息,对其给出相应的网络安全情况综合判定。 网络安全测评对象通常包括信息系统的组成要素或信息系统自身。2)发展1983年,美国国防部颁布《可信计算机系统评估准则 T…

修改PE导入表注入DLL——实例图文教程——让你看的明明白白

其实通过修改PE导入表注入DLL的教程很多,本文也只是其中的沧海一粟而已,但既然写出来,自我感觉应该还是有一点自我的东西的,至少自认为做到了思路清晰,每步都有据可依,让看客应该能做到“看的明明白白”!本贴以《英雄无敌》1游戏程序为例子,向其添加一个DLL,调用其中的…

《机器人SLAM导航核心技术与实战》第1季:第10章_其他SLAM系统

《机器人SLAM导航核心技术与实战》第1季:第10章_其他SLAM系统 视频讲解【第1季】10.第10章_其他SLAM系统-视频讲解【第1季】10.1.第10章_其他SLAM系统_RTABMAP算法【第1季】10.2.第10章_其他SLAM系统_VINS算法【第1季】10.3.第10章_其他SLAM系统_机器学习与SL第1季:第10章_其…

web安全作业(SQL注入1)

web安全作业(SQL注入) 理论作业 1.什么是盲注?盲注的类型? 2.报错注入常用的函数有哪些?请分别解释其用法? 3.时间盲注的payload构造方法?用到的函数及其用法? 4.DNS Log注入原理?前提条件及应用场景分别是什么? 1. 开发人员屏蔽了报错信息,导致攻击者无法通过报错信…

RHEL9.4搭建虚拟机实验环境

日期:2024.10.27 目的:搭建Linux虚拟机环境供学习测试,无图形界面。同等硬件配置下性能上要优于Windows上运行的虚拟化解决方案。 参照:鸟哥Linux私房菜服务器篇 RockyLinux 9版 https://linux.vbird.org/linux_server/rocky9/ Linux中国 如何在 Rocky Linux 9 / AlmaLinux…

o1-mini首战Codeforces

chatgpt-o1-mini挑战codeforces它来了,找了最近的一场比赛,准备来试试效果如何,比赛链接https://codeforces.com/contest/2032 首先上场的是第一题 A - Circuit 我直接开问通过上述方法和代码,可以快速准确地解决问题,并满足题目中的时间和空间限制。 然后提交,果然没问题…

python bytecode解析

python bytecode解析 前言 我们的电脑是怎么运行的呢?计算机内部的 CPU 处理器是个硅片,上面雕刻着精心布置的电路,输入特定的电流,就能得到另一种模式的电流,而且模式可以预测,给这些模式起上名字并赋予含义,我们就可以说这种电流模式代表加法,电脑的工作原理就是如此…

09-XSS键盘监听、cookie窃取文件上传绕过

1、XSS (1)使用pikachu平台练习XSS键盘记录、前台XSS盲打攻击获取cookie,利用cookie实现登录XSS键盘记录docker打开pikachu靶场,进入pikachu后端修改/var/www/html/pkxss/rkeypress/rk.js文件在存储型XSS模块输入payload(以dvwa靶场测试)监听记录成功获取cookie信息实现登…

2.TiUP 部署 DM 集群

TiUP 是 TiDB 4.0 版本引入的集群运维工具,TiUP DM 是 TiUP 提供的使用 Golang 编写的集群管理组件,通过 TiUP DM 组件就可以进行日常的运维工作,包括部署、启动、关闭、销毁、扩缩容、升级 DM 集群以及管理 DM 集群参数。 安装 TiUP DM 组件: tiup install dm dmctl 生成模…