零入门容器云网络-5:同一宿主机上的两个网络命名空间通信方案

news2024/11/28 20:49:05

已发表的技术专栏(订阅即可观看所有专栏)
0  grpc-go、protobuf、multus-cni 技术专栏 总入口

1  grpc-go 源码剖析与实战  文章目录

2  Protobuf介绍与实战 图文专栏  文章目录

3  multus-cni   文章目录(k8s多网络实现方案)

4  grpc、oauth2、openssl、双向认证、单向认证等专栏文章目录


本篇文章主要是想模拟一下,在同一个宿主机上,多个网络命名空间之间如何通信?

有哪些可以采取的方案。

可能存在的方案:

  • 方案一:使用一对veth pair将两个命名空间直接连接起来,两个命名空间处于同网段内
  • 方案二:为两个命名空间分别设置自己的veth pair
    • 场景一:两个命名空间处于同网段时的链接情况
    • 场景二:两个命名空间处于非同网段时的链接情况
  • 方案三:使用虚拟网桥将两个不同的命名空间链接起来

也就是说,有4个测试用例

方案一:没有什么使用价值。方案三的使用价值最高。可以同时连接多个命名空间,使其通信。

1、方案一:使用一对veth pair将两个命名空间直接连接起来,两个命名空间处于同网段内

在这里插入图片描述

模拟测试将veth pair的两端分别加入两个不同的网络命名空间,测试一下连通性

ip link add veth1 type veth peer name veth2

ip netns add ns1
ip netns add ns2

ip link set veth1 netns ns1
ip link set veth2 netns ns2

ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1
ip netns exec ns2 ip addr add 10.244.1.3/24 dev veth2

ip netns exec ns1 ip link set veth1 up
ip netns exec ns2 ip link set veth2 up
ip netns exec ns1 ping -c 1 10.244.1.3
ip netns exec ns2 ping -c 1 10.244.1.2

在这里插入图片描述

在这里插入图片描述

在同一个宿主机下,veth pair链接的两个网络命名空间可以通过veth pair进行互相通信

2、方案二:为两个命名空间分别设置自己的veth pair

2.1、场景一:两个命名空间处于同网段时的链接情况

在这里插入图片描述

2.1.1、操作实战

ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b

ip netns add ns1
ip netns add ns2

ip link set veth1a netns ns1
ip link set veth2a netns ns2

ip addr add 10.244.1.3 dev veth1b
ip addr add 10.244.1.4 dev veth2b
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip addr add 10.244.1.5/24 dev veth2a

ip link set veth1b up
ip link set veth2b up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns2 ip link set veth2a up

2.1.2、测试

在执行下面的测试命令前,最好先把抓包分析的命令执行一下,

因为肯定是ping不通的。先执行抓包命令,可以观察到最初始的发包状态。

ip netns exec ns1 ping 10.244.1.5

在这里插入图片描述

2.1.3、抓包分析

分别对veth1a,veth1b, veth2a, veth2b进行抓包分析

2.1.3.1、在master节点上,进入ns1网络命名空间对veth1a

ip netns exec ns1 tcpdump -nn -i veth1a

在这里插入图片描述

2.1.3.2、在master节点上,进入ns2网络命名空间对veth2a进行抓包

ip netns exec ns2 tcpdump -nn -i veth2a

在这里插入图片描述

2.1.4、在master节点上,对veth1b抓包

tcpdump -nn -i veth1b

在这里插入图片描述

2.1.5、在master节点上,对veth2b抓包

tcpdump -nn -i veth2b

在这里插入图片描述

从抓包情况来看,至少存在一个问题

从veth1a可以正常发送ARP数据包,并且将ARP数据包直接转发到了veth1b网卡里,

veth1b网卡也发送了同样的数据包,但是,数据包从veth1b出来后,没有对应的路由;

再查看一下,当前的路由表
在这里插入图片描述

2.1.6、设置目的路由

给去往10.244.1.2,10.244.1.5的数据包添加相关路由

ip route add 10.244.1.2 dev veth1b
ip route add 10.244.1.5 dev veth2b
route -n

在这里插入图片描述

添加完路由后,抓包情况没有发生变化,不再重复截图了。

这个时候,需要关注一下内核参数proxy_arp了。

2.1.7、为什么需要设置proxy_arp参数了?

下面纯属于个人理解:

如果你了解ARP的原理,就会发现:

当veth1a发起的ARP请求到达veth1b后,veth1b网卡进行解析ARP请求,发现目的IP并非自己。

因此,我不需要回复此APR请求。

所以,程序就卡在这里了,veth1a不停的发送,Veth1b不停的丢弃。

因此,如果打破僵局的话,需要veth1b进行回复一下,代理别人回复一下。

就需要用到了proxy_arp参数了。

2.1.8、为veth1b设置一下proxy_arp参数

2.1.8.1、proxy_arp什么意思呢?

是否开启arp代理,开启arp代理的话则会以自己的mac地址回复arp请求,0为不开启,1则开启。

可以参考一下,下面的网址
https://imliuda.com/post/1015

2.1.8.2、为veth1b网卡设置proxy_arp参数

在宿主机上,执行下面的命令

echo 1 > /proc/sys/net/ipv4/conf/veth1b/proxy_arp

执行完,继续观察一下各网卡的发送情况

veth1a的抓包变化
在这里插入图片描述

veth1b对veth1a的ARP请求,进行了回复。也就是替10.244.1.5进行了回复,

这种行为,称为代理回复。

veth1b的抓包变化
在这里插入图片描述

veth1a收到ARP的回复后,就立刻发起了icmp请求,并且将数据包转发给了veht1b.

veth2b
在这里插入图片描述

veth1b发起的数据包,经过路由判断,将数据包发送给了veth2b

2.1.9、为veth2b设置proxy_arp参数

echo 1 > /proc/sys/net/ipv4/conf/veth2b/proxy_arp

在这里插入图片描述

2.1.10、重新测试

ip netns exec ns1 ping 10.244.1.5

在这里插入图片描述

2.1.11、下面提供一下,完整的创建命令

ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b

ip netns add ns1
ip netns add ns2

ip link set veth1a netns ns1
ip link set veth2a netns ns2

ip addr add 10.244.1.3 dev veth1b
ip addr add 10.244.1.4 dev veth2b
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip addr add 10.244.1.5/24 dev veth2a

ip link set veth1b up
ip link set veth2b up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns2 ip link set veth2a up

ip route add 10.244.1.2 dev veth1b
ip route add 10.244.1.5 dev veth2b

echo 1 > /proc/sys/net/ipv4/conf/veth1b/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/veth2b/proxy_arp

echo 1 > /proc/sys/net/ipv4/ip_forward

测试命令

ip netns exec ns1 ping 10.244.1.5

还可以进行日志追踪设置

iptables -t raw -A PREROUTING -p icmp -j TRACE

iptables -t raw -A OUTPUT -p icmp -j TRACE

查看日志

tail -f /var/log/messages

关于/proc/sys/net/ipv4/ip_forward

在这里插入图片描述

你可以做一些测试,在上面测试正常的情况下,将ip_forward关闭,看看还能ping通不。

在稍微总结一下
直接看下面的图
在这里插入图片描述

个人理解:

是将ICMP数据包封装到IP报文里,然后,将IP报文封装到以太网帧里。

因此,veth2b其实,收到的应该是以太网帧。为了简单,图里说的是IP报文。

veth2b收到IP报文后,对IP报文头进行解析,获得源IP是10.244.1.2,目的IP是10.244.1.5

veth2b第一次向veth2a进行转发时,不知道Veth2a的MAC地址,

因此向veth2a发起了ARP请求。从上面对veth2b进行抓包分析里,可以看出来。

veth2a收到ARP请求后,会进行回复

veth2b收到veth2a的回复后,会将IP报文发送给veth2a,

veth2a收到IP报文后,会进行解析,获取ICMP数据包,并进行反馈。

但是,veth2a并不知道10.244.1.2的Mac地址,因此,它也需要发起ARP请求。

因此,接下来,就是回复过程了,跟前面介绍原理一样了。

协议的封装过程,会在后面的tap章节进行介绍。

其实,这个解释,可能经不起推敲的;因为在上面的测试用例中,当在ns1 ping宿主机上的eth0网卡时,

只添加了路由,并没有为veth1设置proxy_arp参数;

2.1.12、请求过程,数据包的报文内容

下面是master节点上的
在这里插入图片描述

上面是ns1网络命名空间,下面是ns2网络命名空间

下面的分析,仅供参考

  • 当veth1b网卡接收到veth1a发送的数据包后,对报文进行解析
  • 发现目的MAC是自己的,因此,需要接收此数据包,
  • 继续解析,发现目的IP是10.244.1.5
  • 查询路由,发现去往10.244.1.5,需要通过veth2b网卡发送
  • 交由veth2b网卡处理,veth2b网卡发现目的IP是10.244.1.5,需要发送ARP协议,获取10.244.1.5IP对应的MAC地址
  • 获取到MAC地址后,经由网络协议栈重新封装,构建新的以太网帧
  • 交由veth2b网卡发送出去。

(主要是网卡的具体功能,以及跟网络协议栈调用顺序,并不是非常了解。)

2.1.13、请求过程,都经历了哪些iptables规则链

为了验证测试,需要在master节点添加日志埋点;

此过程,需要使用到rsyslog服务

2.1.13.1、安装rsyslog服务

2.1.13.1.1、安装rsyslog服务
yum -y install rsyslog
2.1.13.1.2、更新配置文件
echo "kern.*     /var/log/iptables.log" >> /etc/rsyslog.conf 

在这里插入图片描述

.*,表示所有等级的消息都添加到iptables.log文件里

信息等级的指定方式

  • .XXX,表示 大于XXX级别的信息
  • .=XXX,表示等于XXX级别的信息
    • 如,kern.=notice /var/log/iptables.log, 将notice以上的信息添加到iptables.log里
  • .!XXX, 表示在XXX之外的等级信息
2.1.13.1.3、重启rsyslog服务
systemctl restart rsyslog

systemctl status  rsyslog

在这里插入图片描述

2.1.13.2、在master节点上,添加日志埋点

将当前的日志统计清零

iptables -t nat -Z
iptables -t filter -Z

插入日志埋点前,先查看一下,当前的现状

iptables -t nat -nvL PREROUTING --line-number
iptables -t filter -nvL FORWARD --line-number
iptables -t nat -nvL POSTROUTING --line-number

插入日志埋点

iptables -t nat -A PREROUTING -p icmp -j LOG --log-prefix "Nat-PREROUTING-1-"
iptables -t filter -A FORWARD -p icmp -j LOG --log-prefix "Filter-FORWARD-1-"
iptables -t nat -A POSTROUTING -p icmp -j LOG --log-prefix "Nat-POSTROUTING-1-"

实时查看日志

tail -f /var/log/iptables.log

2.1.13.3、重新发起请求

ip netns exec ns1 ping 10.244.1.5

在这里插入图片描述

再次查看日志
在这里插入图片描述

看上面的图,一共发送了5次请求

再看一下,iptables.log日志,一共有12条记录。

  • 前4条记录,是第1次请求和反馈经过的规则链,请求经过了PREROUTING->FORWARD-POSTROUTING,反馈经过了FORWARD链
  • 第5,6条记录,是第2次请求和反馈经过的规则链,请求和反馈都只经过FORWARD链
  • 第7,8条记录,是第3次请求和反馈经过的规则链,请求和反馈都只经过FORWARD链
  • 第9,10条记录,是第4次请求和反馈经过的规则链,请求和反馈都只经过FORWARD链
  • 第11,12条记录,是第5次请求和反馈经过的规则链,请求和反馈都只经过FORWARD链

2.1.13.4、经历的iptables规则链

在这里插入图片描述

2.2、场景二:两个命名空间处于非同网段时的链接情况

2.2.1、网络拓扑

在这里插入图片描述

接下来,我们提供两种方式来实现上面的网络拓扑

2.2.2、操作实战一

ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b

ip netns add ns1
ip netns add ns2

ip link set veth1a netns ns1
ip link set veth2a netns ns2

ip addr add 10.244.1.3 dev veth1b
ip addr add 10.244.2.2 dev veth2b
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip addr add 10.244.2.3/24 dev veth2a

ip link set veth1b up
ip link set veth2b up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns2 ip link set veth2a up

ip route add 10.244.1.2 dev veth1b
ip route add 10.244.2.3 dev veth2b
ip netns exec ns1 route add -net 10.244.2.0/24 dev veth1a
ip netns exec ns2 route add -net 10.244.1.0/24 dev veth2a

echo 1 > /proc/sys/net/ipv4/conf/veth1b/proxy_arp
echo 1 > /proc/sys/net/ipv4/conf/veth2b/proxy_arp

echo 1 > /proc/sys/net/ipv4/ip_forward

该方式,完全跟同网段是一样的。

从ns1里ping ns2

ip netns exec ns1 ping 10.244.2.3

在这里插入图片描述

从ns2里ping ns1也是可以的

ip netns exec ns2 ping 10.244.1.2

2.2.3、操作实战二

ip link add veth1a type veth peer name veth1b
ip link add veth2a type veth peer name veth2b

ip netns add ns1
ip netns add ns2

ip link set veth1a netns ns1
ip link set veth2a netns ns2

ip addr add 10.244.1.3 dev veth1b
ip addr add 10.244.2.2 dev veth2b
ip netns exec ns1 ip addr add 10.244.1.2/24 dev veth1a
ip netns exec ns2 ip addr add 10.244.2.3/24 dev veth2a

ip link set veth1b up
ip link set veth2b up
ip netns exec ns1 ip link set veth1a up
ip netns exec ns2 ip link set veth2a up

ip route add 10.244.1.0/24 dev veth1b
ip route add 10.244.2.0/24 dev veth2b
ip netns exec ns1 route add -net 10.244.2.0/24 gw 10.244.1.3 dev veth1a
ip netns exec ns2 route add -net 10.244.1.0/24 gw 10.244.2.2 dev veth2a

echo 1 > /proc/sys/net/ipv4/ip_forward

将宿主机作为路由器来使用。

在这里插入图片描述

测试,如下:

ip netns exec ns1 ping 10.244.2.3

2.3、方案三:使用虚拟网桥将两个不同的命名空间链接起来

本方案,可以参考后续的网桥相关文章

3、总结

  • 如果你已经看过<<基于veth pair+snat技术实现内部网络访问本局域网的其他宿主机>>的文章后,可以思考一下,为什么在这篇文章里,没有使用proxy_arp代理转发参数呢?同样,在场景二里的操作实战二中也没有使用proxy_arp代理转发参数?

    • 本篇文章里使用了proxy_arp代理转发参数,是因为?
      • snat文章里,设置默认路由,并指定了网关地址,将veth1b网卡设置为网关了,当数据包去往10.211.55.0/24路由时,都会将数据包发送给网关,通过ARP是可以获取网关的MAC地址的。
      • 而本篇文章里没有在ns1网络命名空间里设置默认路由,因此,当veth1a发送ARP协议获取10.244.1.5IP对应的MAC地址时,veth1b网卡虽然收到了ARP数据包,发现目的IP并非是自己,就丢弃了;因此,需要让veth1b代理回答一下arp协议。
  • 本测试用例,实际中,就是同一个节点上容器之间如何通信

可以重点关注几个事情?

是否跨网段了,是否设置了路由,指定了网关,通过哪个网卡发送出去的?

ARP协议用来干什么的?

proxy_arp代理转发?什么时候使用代理转发

网桥不用设置代理转发,应该是默认支持的。

网卡之间数据包转发时,经过了哪些链?第一次,跟第二次,,,,,经过的链是否一样?

当然,一开始,总结不好,等时间长了,做了很多练习,就会发现。

好像,来来回回,就这些东西。

只是,一开始,比较乱而已。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android 虚拟分区详解(一) 参考资料推荐

文章目录0. 导读1. Android 官方 VAB 文档1.1 公开文档1.2 半公开文档2. Device Mapper 文档2.1 device mapper 文档2.2 dmsetup 工具2.3 COW 介绍3. Android 源码4. 参考资料汇总5. 后续计划6. 其它Android Virtual A/B 系统简称 VAB&#xff0c;我在这一系列里面又将其称为虚…

【LeetCode每日一题:813. 最大平均值和的分组~~~前缀和+递归+记忆化搜索】

题目描述 给定数组 nums 和一个整数 k 。我们将给定的数组 nums 分成 最多 k 个相邻的非空子数组 。 分数 由每个子数组内的平均值的总和构成。 注意我们必须使用 nums 数组中的每一个数进行分组&#xff0c;并且分数不一定需要是整数。 返回我们所能得到的最大 分数 是多少…

前端面试整理

Js 1. Localstorage、sessionStorage、cookie、session的区别 &#xff08;1&#xff09;web storage和cookie的区别&#xff1a; Cookie(不设置过期时间) sessionStorage WebStorage的目的是克服由cookie所带来的一些限制&#xff0c;当数据需要被严格控制在客户端时&…

C/C++ 深入浅出C++模板(上)

不知道你是否思考过一个问题&#xff0c;那就是为什么C有丰富的库&#xff0c;而C语言却没有&#xff1f;比如说C有STL库&#xff0c;线程库等。其实一个很重要的因素就是因为C引入了泛型编程这个概念&#xff0c;也就是我们熟悉的模板。今天我们就一起来深入理解什么是泛型编程…

如何将文字转语音?这几个软件可以将文字转语音

最近有朋友向我求助说&#xff0c;自己在学校的社团里准备了一个话剧节目&#xff0c;需要为这个节目进行旁白配音&#xff0c;但是里面的台词不仅绕口&#xff0c;还有一些是生僻字&#xff0c;念起来有点困难。要是碰上自己的课程比较多的时候&#xff0c;难以兼顾两边的工作…

使用Apache搭建网站

❤️痛苦不是失败&#xff0c;而是你本可以❤️ 实验环境 CentOS7.3&#xff08;1611&#xff09;版本、Apache2.4&#xff0c;vsftpd3.0 本次实验目的 1.编译安装httpd 2.优化路径 3.并将鲜花网站上传到web服务器为网页目录&#xff08;当然其他网站源码也可以&#xff09;…

CMU 15-213 CSAPP. Ch11. Dynamic Memory Allocation

CMU 15-213 CSAPP (Ch1~Ch3) CMU 15-213 CSAPP (Ch5~Ch7) CMU 15-213 CSAPP (Ch8) CMU 15-213 CSAPP (Ch9) CMU 15-213 CSAPP (Ch10) CMU 15-213 CSAPP (Ch11) 视频链接 课件链接 课程补充 该课程使用 64位 编译器&#xff01; Ch11. Dynamic Memory Allocation 11.1 Basic c…

【附源码】计算机毕业设计JAVA政府人才机构在线考试系统2021

【附源码】计算机毕业设计JAVA政府人才机构在线考试系统2021 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1…

《web课程设计》基于HTML+CSS+JavaScript典的中医药大学网(11个页面)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

基于Python监测键盘输入并发出声音的坤音键盘

代码和软件在公众号【走神研究所】发送【键盘】关键字获取。这是一款基于python的桌面小工具&#xff0c;能够实时显示你敲击键盘的按键&#xff0c;并且当摁下“J”、“N”、“T”、“M”时会发出坤音。具体视频演示和代码原理在这里打开程序&#xff0c;随意摁下键盘&#xf…

2022/11/27一周总结

项目 redis 安装以及启动 切换到redis根目录运行cmd&#xff0c;先启动服务端redis-server.exe 2.输入redis-cli并回车&#xff08;redis-cli是客户端程序&#xff09;如图正常提示进入&#xff0c;并显示正确端口号&#xff0c;则表示服务已经启动。 基本知识 数据类型 St…

算法提升:图的Dijkstra(迪杰斯特拉)算法

目录 概念 思路 代码 概念 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的&#xff0c;因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法&#xff0c;解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始&#xf…

【Hack The Box】linux练习-- Ophiuchi

HTB 学习笔记 【Hack The Box】linux练习-- Ophiuchi &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月27日&#x1f334; &#x1…

MySQL的执行计划explain

select_type&#xff1a;表示的查询类型 SIMPLE&#xff1a;表示查询语句不包含子查询和union;PRIMARY&#xff1a;表示此查询是最外层的查询&#xff1b;UNION: 表示此查询是UNION的第二个或后续的查询&#xff1b;DEPENDENT UNION&#xff1a;表示此查询是UNION的第二个或后续…

ARM Developer Keil MDK 5.X Crack

ARM Developer Keil MDK是面向各种STM32微控制器产品的全面软件开发解决方案&#xff0c;提供创建、编译和调试嵌入式应用程序时所需的一切资源。MDK包括真正的Arm编译器和易于使用的Keil uVision IDE/调试器&#xff0c;可与STM32CubeMX和软件包连接。MDK还提供各种专业的中间…

Faster R-CNN详解

Faster R-CNN Faster R-CNN是作者Ross Girshick继Fast R-CNN后的又一力作。使用VGG16作为网络的backbone&#xff0c;推理速度在GPU上达到5fps(包括候选区域的生成)&#xff0c;准确率也有进一步的提升。在2015年的ILSVRC以及COCO竞赛中获得多个项目的第一名。 Faster R-CNN算…

Easyrecovery2022硬盘磁盘U盘免费数据恢复软件

EasyRcovery的软件支持因各种原因损坏或误删的文件&#xff0c;文档&#xff0c;照片&#xff0c;视频&#xff0c;音频&#xff0c;电子邮件等等类型的数据它都可以恢复。同时&#xff0c;这款软件不仅仅支持u盘的数据恢复&#xff0c;移动硬盘&#xff0c;磁盘&#xff0c;sd…

【POJ No. 3067】 公路交叉数 Japan

【POJ No. 3067】 公路交叉数 Japan 北大 OJ 题目地址 【题意】 东海岸有N 个城市&#xff0c;西海岸有M 个城市&#xff08;N ≤1000&#xff0c;M ≤1000&#xff09;&#xff0c;将建成K 条高速公路。每个海岸的城市从北到南编号为1, 2, ……每条高速公路都是直线&#xf…

计算机网络---TCP流量控制和拥塞控制

&#xff08;一&#xff09; TCP 流量控制 TCP提供流量控制服务来消除发送方&#xff08;发送速率太快&#xff09;使接收方缓存区溢出的可能性&#xff0c;因此 流量控制是一个速度匹配服务&#xff08;让发送方慢一点&#xff0c;要让接收方来得及接收&#xff0c;实现匹配发…

Qt编写物联网管理平台(支持win/linux/mac/嵌入式linux/modbus等)

一、前言 这个物联网综合管理平台前后迭代了五年&#xff0c;一点一滴慢慢积累起来&#xff0c;从最开始的只有modbus串口协议解析以及简单的表格显示数据&#xff0c;慢慢的逐渐增加了tcp_rtu支持&#xff0c;用户管理模块&#xff0c;地图监控模块&#xff0c;而后为了拓展性…