如何/为何使用socket实现网络通信

谈思实验室 2023-01-29 17:55

点击上方蓝字谈思实验室

获取更多汽车网络安全资讯


我相信大家刚开始学socket的时候,都跟我一样。

云里雾里的,对socket的概念很模糊。

这篇文章我打算从一个初学者的角度开始聊起,让大家了解下我眼里的socket是什么以及socket的原理和内核实现。

socket的概念

故事要从一个插头说起。

插头与插座

当我将插头插入插座,那看起来就像是将两者连起来了。

风扇与电力系统建立"连接"

而插座的英文,又叫socket

巧了,我们程序员搞网络编程时也会用到一个叫socket的东西。

其实两者非常相似。通过socket,我们可以与某台机子建立"连接",建立"连接"的过程,就像是将插口插入插槽一样。

大概概念是了解了,但我相信各位对socket其实还是很模糊。

我们从大家最熟悉的使用场景开始说起。

socket的使用场景

我们想要将数据从A电脑的某个进程发到B电脑的某个进程。

这时候我们需要选择将数据发过去的方式,如果需要确保数据要能发给对方,那就选可靠的TCP协议,如果数据丢了也没关系,看天意,那就选择不可靠的UDP协议。

初学者毫无疑问,首选TCP

TCP是什么

那这时候就需要用socket进行编程。

于是第一步就是创建个关于TCP的socket。就像下面这样。

sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

这个方法会返回socket_fd,它是socket文件的句柄,是个数字,相当于socket的身份证号。

得到了socket_fd之后,对于服务端,就可以依次执行bind()listen()accept()方法,然后坐等客户端的连接请求。

对于客户端,得到socket_fd之后,你就可以执行connect()方法向服务端发起建立连接的请求,此时就会发生TCP三次握手。

握手建立连接流程

连接建立完成后,客户端可以执行send() 方法发送消息,服务端可以执行recv()方法接收消息,反过来,服务器也可以执行send()客户端执行recv()方法。

到这里为止,就是我们大部分程序员最熟悉的使用场景。

socket的设计

现在,socket我们见过,也用过,但对大部分程序员来说,它是个黑盒

那既然是黑盒,我们索性假设我们忘了socket。重新设计一个内核网络传输功能。

网络传输,从操作上来看,无非就是,发数据和远端之间互相收发数据。也就是对应着写数据读数据

读写收发

但显然,事情没那么简单。

这里还有两个问题。

第一个是,接收端和发送端可能不止一个,因此我们需要一些信息做下区分,这个大家肯定很熟悉,可以用IP和端口。IP用来定位是哪台电脑,端口用来定位是这台电脑上的哪个进程。

第二个是,发送端和接收端的传输方式有很多区别,可以是可靠的TCP协议,也可以是不可靠的UDP协议,甚至还需要支持基于icmp协议ping命令

sock是什么

写过代码的都知道,为了支持这些功能,我们需要定义一个数据结构去支持这些功能。

这个数据结构,叫sock

为了解决上面的第一个问题,我们可以在sock里加入IP和端口字段。

sock加入IP和端口字段

而第二个问题,我们会发现这些协议虽然各不相同,但还是有一些功能相似的地方,比如收发数据时的一些逻辑完全可以复用。按面向对象编程的思想,我们可以将不同的协议当成是不同的对象类(或结构体),将公共的部分提取出来,通过"继承"的方式,复用功能。

基于各种sock实现网络传输功能

于是,我们将功能重新划分下,定义了一些数据结构。

继承sock的各类sock

sock最基础的结构,维护一些任何协议都有可能会用到的收发数据缓冲区。

inet_sock特指用了网络传输功能的sock,在sock的基础上还加入了TTL端口,IP地址这些跟网络传输相关的字段信息。说到这里大家就懵了,难道还有不是用网络传输的?有,比如Unix domain socket,用于本机进程之间的通信,直接读写文件,不需要经过网络协议栈。这是个非常有用的东西,我以后一定讲讲(画饼)。

inet_connection_sock 是指面向连接sock,在inet_sock的基础上加入面向连接的协议里相关字段,比如accept队列,数据包分片大小,握手失败重试次数等。虽然我们现在提到面向连接的协议就是指TCP,但设计上linux需要支持扩展其他面向连接的新协议

tcp_sock 就是正儿八经的tcp协议专用的sock结构了,在inet_connection_sock基础上还加入了tcp特有的滑动窗口拥塞避免等功能。同样udp协议也会有一个专用的数据结构,叫udp_sock

好了,现在有了这套数据结构,我们将它们跟硬件网卡对接一下,就实现了网络传输的功能。

提供socket层

可以想象得到,这里面的代码肯定非常复杂,同时还操作了网卡硬件,需要比较高的操作系统权限,再考虑到性能和安全,于是决定将它放在操作系统内核里。

既然网络传输功能做在内核里,那用户空间的应用程序想要用这部分功能的话,该怎么办呢?

这个好办,本着不重复造轮子的原则,我们将这部分功能抽象成一个个简单的接口。以后别人只需要调用这些接口,就可以驱动我们写好的这一大堆复杂的数据结构去发送数据。

那么问题来了,怎么样将这部分功能暴露出去呢?让其他程序员更方便的使用呢?

既然跟远端服务端进程收发数据可以抽象为“读和写”,操作文件也可以抽象为"读和写",正好有句话叫,"linux里一切皆是文件",那我们索性,将内核的sock封装成文件就好了。创建sock的同时也创建一个文件文件有个句柄fd,说白了就是个文件系统里的身份证号码,通过它可以唯一确定是哪个sock

这个文件句柄fd其实就是 sock_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP) 里的sock_fd

将句柄暴露给用户,之后用户就可以像操作文件句柄那样去操作这个sock句柄。在用户空间里操作这个句柄,文件系统就会将操作指向内核sock结构。

是的,操作这个特殊的文件就相当于操作内核里对应的sock

通过文件找到sock

有了sock_fd句柄之后,我们就需要提供一些接口方法,让用户更方便的实现特定的网络编程功能。这些接口,我们列了一下,发现需要有send()recv()bind()listen()connect()这些。到这里,我们的内核网络传输功能就算设计完成了。

现在是不是眼熟了,上面这些接口方法其实就是socket提供出来的接口

所以说,socket其实就是个代码库 or 接口层,它介于内核和应用程序之间,提供了一些高度封装过的接口,让我们去使用内核网络传输功能

基于sock实现网络传输功能

到这里,我们应该明白了。我们平时写的应用程序里代码里虽然用了socket实现了收发数据包的功能,但其实真正执行网络通信功能的,不是应用程序,而是linux内核。相当于应用程序通过socket提供的接口,将网络传输的这部分工作外包给了linux内核

这听起来像不像我们最熟悉的前后端分离的服务架构,虽然这么说不太严谨,但看上去linux就像是被分成了应用程序和内核两个服务。内核就像是后端,暴露了好多个api接口,其中一类就是socket的send()recv()这些方法。应用程序就像是前端,负责调用内核提供的接口来实现想要的功能。

进程通过socket调用内核功能

看到这里,我担心大家会有点混乱,来做个小的总结

在操作系统内核空间里,实现网络传输功能的结构是sock,基于不同的协议和应用场景,会被泛化为各种类型的xx_sock,它们结合硬件,共同实现了网络传输功能。为了将这部分功能暴露给用户空间的应用程序使用,于是引入了socket层,同时将sock嵌入到文件系统的框架里,sock就变成了一个特殊的文件,用户就可以在用户空间使用文件句柄,也就是socket_fd来操作内核sock的网络传输能力。

这个socket_fd是一个int类型的数字。现在回去看socket的中文翻译,套接字将它理解为一用于连的数,是不是就觉得特别合理了。

网络分层与基于sock实现网络传输功能

socket如何实现网络通信

上面关于怎么实现网络通信功能这一块一笔带过了。

现在我们来聊聊。

这套sock的结构其实非常复杂。我们以最常用的TCP协议为例,简单了解下它是怎么实现网络传输功能的。

我将它分为两阶段,分别是建立连接数据传输

建立连接

对于TCP,要传数据,就得先在客户端和服务端中间建立连接

在客户端,代码执行socket提供的connect(sockfd, "ip:port")方法时,会通过sockfd句柄找到对应的文件,再根据文件里的信息指向内核的sock结构。通过这个sock结构主动发起三次握手。

TCP三次握手

在服务端握手次数还没达到"三次"的连接,叫半连接,完成好三次握手的连接,叫全连接。它们分别会用半连接队列全连接队列来存放,这两个队列会在你执行listen()方法的时候创建好。当服务端执行accept()方法时,就会从全连接队列里拿出一条全连接。

半连接队列和全连接队列

至此,连接就算准备好了,之后,就可以开始传输数据

虽然都叫队列,但半连接队列其实是个hash表,而全连接队列其实是个链表。

那么问题来了,为什么半连接队列要设计成哈希表而全连接队列是个链表?这个在我在我之前写的《没有accept,能建立TCP连接吗?》 已经提到过,不再重复。

数据传输

为了实现发送和接收数据的功能,sock结构体里带了一个发送缓冲区和一个接收缓冲区,说是缓冲区,但其实就是个链表,上面挂着一个个准备要发送或接收的数据。

当应用执行send()方法发送数据时,同样也会通过sock_fd句柄找到对应的文件,根据文件指向的sock结构,找到这个sock结构里带的发送缓冲区,将数据会放到发送缓冲区,然后结束流程,内核看心情决定什么时候将这份数据发送出去。

接收数据流程也类似,当数据送到linux内核后,数据不是立马给到应用程序的,而是先放在接收缓冲区中,数据静静躺着,卑微的等待应用程序什么时候执行recv()方法来拿一下。就像我的文章,躺在你的推文列表里,卑微的等一个点赞关注转发三连。懂?

sock的发送和接收缓冲区

IP和端口其实不在sock下,而在inet_sock下,上面这么画只是为了简化。。。

那么问题来了,发送数据是应用程序主动发起,这个大家都没问题。

那接收数据呢?数据从远端发过来了,怎么通知并给到应用程序呢?

这就需要用到等待队列

sock内的等待队列

当你的应用进程执行recv()方法尝试获取(阻塞场景下)接收缓冲区的数据时。

  • • 如果有数据,那正好,取走就好了。这点没啥疑问。

  • • 但如果没数据,就会将自己的进程信息注册到这个sock用的等待队列里,然后进程休眠。如果这时候有数据从远端发过来了,数据进入到接收缓冲区时,内核就会取出sock的等待队列里的进程,唤醒进程来取数据。

recv时无数据进程进入等待队列

有时候,你会看到多个进程通过fork的方式,listen了同一个socket_fd。在内核,它们都是同一个sock,多个进程执行listen()之后,都嗷嗷等待连接进来,所以都会将自身的进程信息注册到这个socket_fd对应的内核sock的等待队列中。如果这时真来了一个连接,是该唤醒等待队列里的哪个进程来接收连接呢?这个问题的答案比较有趣。

  • • 在linux 2.6以前,会唤醒等待队列里的所有进程。但最后其实只有一个进程会处理这个连接请求,其他进程又重新进入休眠,这些被唤醒了又无事可做最后只能重新回去休眠的进程会消耗一定的资源。就好像你在广东的街头,想问路,叫一声靓仔,几十个人同时回头,但你其实只需要其中一个靓仔告诉你路该怎么走。你这种一不小心动这靓仔的场景,在计算机领域中,就叫惊群效应

  • • 在linux 2.6之后,只会唤醒等待队列里的其中一个进程。是的,socket监听的惊群效应问题被修复了。

惊群效应

看到这里,问题又来了。

服务端 listen 的时候,那么多数据到一个 socket 怎么区分多个客户端的?

以TCP为例,服务端执行listen方法后,会等待客户端发送数据来。客户端发来的数据包上会有源IP地址和端口,以及目的IP地址和端口,这四个元素构成一个四元组,可以用于唯一标记一个客户端。

其实说四元组并不严谨,因为过程中还有很多其他信息,也可以说是五元组。。。但大概理解就好,就这样吧。。。

四元组

服务端会创建一个新的内核sock,并用四元组生成一个hash key,将它放入到一个hash表中。

四元组映射成hash键

下次再有消息进来的时候,通过消息自带的四元组生成hash key再到这个hash表里重新取出对应的sock就好了。所以说服务端是通过四元组来区分多个客户端的

多个hash_key对应多个客户端

sock怎么实现"继承"

最后遗留一个问题。

大家都知道linux内核是C语言实现的,而C语言没有类也没有继承的特性,是怎么做到"继承"的效果的呢?

在C语言里,结构体里的内存是连续的,将要继承的"父类",放到结构体的第一位,就像下面这样。

struct tcp_sock {
    /* inet_connection_sock has to be the first member of tcp_sock */
    struct inet_connection_sock inet_conn;
        // 其他字段
}

struct inet_connection_sock {
    /* inet_sock has to be the first member! */
    struct inet_sock   icsk_inet;
        // 其他字段
}

然后我们就可以通过结构体名的长度来强行截取内存,这样就能转换结构体,从而实现类似"继承"的效果。

// sock 转为 tcp_sock
static inline struct tcp_sock *tcp_sk(const struct sock *sk)
{
    return (struct tcp_sock *)sk;
}
内存布局

总结

  • • socket中文套接字,我理解为一用于连的数。并不一定准确,欢迎评论。

  • • sock在内核,socket_fd在用户空间,socket层介于内核和用户空间之间。

  • • 在操作系统内核空间里,实现网络传输功能的结构是sock,基于不同的协议和应用场景,会被泛化为各种类型的xx_sock,它们结合硬件,共同实现了网络传输功能。为了将这部分功能暴露给用户空间的应用程序使用,于是引入了socket层,同时将sock嵌入到文件系统的框架里,sock就变成了一个特殊的文件,用户就可以在用户空间使用文件句柄,也就是socket_fd来操作内核sock的网络传输能力。

  • • 服务端可以通过四元组来区分多个客户端。

  • • 内核通过c语言"结构体里的内存是连续的"这一特点实现了类似继承的效果。





码上报名

WISS 2023 第四届世界物联网安全及数据安全治理峰会火热报名中,3月9-10日,上海




码上报名

AutoSec 7周年年会暨中国汽车网络安全及数据安全合规峰会,5月10-11日,上海


更多文章

智能网联汽车信息安全综述

华为蔡建永:智能网联汽车的数字安全和功能安全挑战与思考

汽车数据合规要点

车载以太网技术发展与测试方法

车载以太网防火墙设计

SOA:整车架构下一代的升级方向

软件如何「吞噬」汽车?

汽车信息安全 TARA 分析方法实例简介

汽车FOTA信息安全规范及方法研究

联合国WP.29车辆网络安全法规正式发布

滴滴下架,我却看到数据安全的曙光

从特斯拉被约谈到车辆远程升级(OTA)技术的合规

如何通过CAN破解汽

会员权益: (点击可进入)谈思实验室VIP会员


END

微信入群

谈思实验室专注智能汽车信息安全、预期功能安全、自动驾驶、以太网等汽车创新技术,为汽车行业提供最优质的学习交流服务,并依托强大的产业及专家资源,致力于打造汽车产业一流高效的商务平台。

 

每年谈思实验室举办数十场线上线下品牌活动,拥有数十个智能汽车创新技术的精品专题社群,覆盖BMW、Daimler、PSA、Audi、Volvo、Nissan、广汽、一汽、上汽、蔚来等近百家国内国际领先的汽车厂商专家,已经服务上万名智能汽车行业上下游产业链从业者。专属社群有:信息安全功能安全自动驾驶TARA渗透测试SOTIFWP.29以太网物联网安全等,现专题社群仍然开放,入满即止。


扫描二维码添加微信,根据提示,可以进入有意向的专题交流群,享受最新资讯及与业内专家互动机会。


谈思实验室,为汽车科技赋能,推动产业创新发展!

谈思实验室 深入专注智能汽车网络安全与数据安全技术,专属汽车网络安全圈的头部学习交流平台和社区。平台定期会通过线上线下等形式进行一手干货内容输出,并依托丰富产业及专家资源,深化上下游供需对接,逐步壮大我国汽车安全文化及产业生态圈。
评论 (0)
  •   电磁数据展示系统平台解析   北京华盛恒辉电磁数据展示系统平台是实现电磁数据高效展示、分析与管理的综合性软件体系,以下从核心功能、技术特性、应用场景及发展趋势展开解读:   应用案例   目前,已有多个电磁数据展示系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据展示系统。这些成功案例为电磁数据展示系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与预处理   智能分析处理   集成频谱分析、时频变换等信号处理算法,自动提取时域频域特征;
    华盛恒辉l58ll334744 2025-05-13 10:20 388浏览
  • 一、量子自旋态光学操控1、‌拓扑量子态探测‌磁光克尔效应通过检测拓扑磁结构(如磁斯格明子)的磁光响应,实现对量子材料中非平庸拓扑自旋序的非侵入式表征。例如,二维量子磁体中的“拓扑克尔效应”可通过偏振光旋转角变化揭示斯格明子阵列的动态演化,为拓扑量子比特的稳定性评估提供关键手段。2、‌量子态调控界面‌非厄米磁光耦合系统(如法布里-珀罗腔)通过耗散调控增强克尔灵敏度,可用于奇异点附近的量子自旋态高精度操控,为超导量子比特与光子系统的耦合提供新思路。二、光子量子计算架构优化1、‌光子内存计算器件‌基于
    锦正茂科技 2025-05-13 09:57 57浏览
  •   军事仿真推演系统平台核心解析   北京华盛恒辉军事仿真推演系统平台以计算机仿真技术为基石,在功能、架构、应用及效能上展现显著优势,成为提升军事作战与决策能力的核心工具。   应用案例   目前,已有多个仿真推演系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润仿真推演系统。这些成功案例为仿真推演系统的推广和应用提供了有力支持。   一、全流程功能体系   精准推演控制:覆盖推演启动至结束全流程。   智能想定管理:集成作战信息配置、兵力部署功能。   数据模型整合
    华盛恒辉l58ll334744 2025-05-14 17:11 87浏览
  • 在当下的商业版图中,胖东来宛如一颗璀璨的明星,散发着独特的光芒。它以卓越的服务、优质的商品以及独特的企业文化,赢得了消费者的广泛赞誉和业界的高度关注。然而,近期胖东来与自媒体博主之间的一场激烈对战,却如同一面镜子,映照出了这家企业在光环背后的真实与挣扎,也引发了我们对于商业本质、企业发展以及舆论生态的深入思考。​冲突爆发:舆论场中的硝烟弥漫​2025年4月,抖音玉石博主“柴怼怼”(粉丝约28万)突然发难,发布多条视频直指河南零售巨头胖东来。他言辞犀利,指控胖东来在玉石销售方面存在暴利行为,声称其
    疯人评 2025-05-14 13:49 89浏览
  •   军事领域仿真推演系统的战略价值与发展前瞻   北京华盛恒辉仿真推演系统通过技术创新与应用拓展,已成为作战效能提升的核心支撑。以下从战略应用与未来趋势展开解析:   应用案例   目前,已有多个仿真推演系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润仿真推演系统。这些成功案例为仿真推演系统的推广和应用提供了有力支持。   一、核心战略应用   1. 作战理论创新引擎   依托低成本仿真平台,军事人员可高效验证新型作战概念。   2. 装备全周期优化   覆盖武器
    华盛恒辉l58ll334744 2025-05-14 16:41 102浏览
  • 在当下竞争激烈的 AI 赛道,企业高层的变动往往牵一发而动全身,零一万物近来就深陷这样的动荡漩涡。近日,零一万物联合创始人、技术副总裁戴宗宏离职创业的消息不胫而走。这位在大模型基础设施领域造诣颇深的专家,此前在华为云、阿里达摩院积累了深厚经验,在零一万物时更是带领团队短期内完成了千卡 GPU 集群等关键设施搭建,其离去无疑是重大损失。而这并非个例,自 2024 年下半年以来,李先刚、黄文灏、潘欣、曹大鹏等一众联创和早期核心成员纷纷出走。
    用户1742991715177 2025-05-13 21:24 165浏览
  • 在电动出行领域的激烈角逐中,九号公司呈上一份营收净利双涨的成绩单。报告显示,九号公司2024年全年实现总营收141.96亿元,同比增长38.87%;扣非后归母净利润达10.62亿元,同比大幅增长157.24%。更值得关注的是,公司整体毛利率提升3.06个百分点至28.24%,展现出强劲的盈利能力。可当将视角拉远,对标爱玛、雅迪等行业巨擘,便会发现九号的成绩不过是小巫见大巫。财报数据显示,爱玛 2024 年营收 216.06 亿元,净利润 19.8
    用户1742991715177 2025-05-12 19:31 35浏览
  • 感谢面包板论坛组织的本次测评活动,本次测评的对象是STM32WL Nucleo-64板 (NUCLEO-WL55JC) ,该测试板专为LoRa™应用原型构建,基于STM32WL系列sub-GHz无线微控制器。其性能、功耗及特性组合经过精心挑选,支持通过Arduino® Uno V3连接,并利用ST morpho接头扩展STM32WL Nucleo功能,便于访问多种专用屏蔽。STM32WL Nucleo-64板集成STLINK-V3E调试器与编程器,无需额外探测器。该板配备全面的STM
    无言的朝圣 2025-05-13 09:47 205浏览
  •   电磁数据管理系统深度解析   北京华盛恒辉电磁数据管理系统作为专业的数据处理平台,旨在提升电磁数据的处理效率、安全性与可靠性。以下从功能架构、核心特性、应用场景及技术实现展开分析:   应用案例   目前,已有多个电磁数据管理系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润电磁数据管理系统。这些成功案例为电磁数据管理系统的推广和应用提供了有力支持。   一、核心功能模块   数据采集与接入:实时接收天线、频谱仪等设备数据,兼容多协议接口,确保数据采集的全面性与实时性
    华盛恒辉l58ll334744 2025-05-13 10:59 300浏览
  • 文/Leon编辑/cc孙聪颖‍2025年1月至今,AI领域最出圈的除了DeepSeek,就是号称首个“通用AI Agent”(智能体)的Manus了,其邀请码一度被炒到8万元。很快,通用Agent就成为互联网大厂、AI独角兽们的新方向,迅速地“卷”了起来。国外市场,Open AI、Claude、微软等迅速推出Agent产品或构建平台,国内企业也在4月迅速跟进。4月,字节跳动、阿里巴巴、百度纷纷入局通用Agent市场,主打复杂的多任务、工作流功能,并对个人用户免费。腾讯则迅速更新腾讯元器的API接
    华尔街科技眼 2025-05-12 22:29 165浏览
  • 一、蓝牙射频电路设计的核心价值在智能穿戴、智能家居等物联网设备中,射频性能直接决定通信质量与用户体验。WT2605C等蓝牙语音芯片的射频电路设计,需在紧凑的PCB空间内实现低损耗信号传输与强抗干扰能力。射频走线每0.1dB的损耗优化可使通信距离提升3-5米,而阻抗失配可能导致30%以上的能效损失。二、射频走线设计规范1. 阻抗控制黄金法则50Ω标准阻抗实现:采用4层板时,顶层走线宽度0.3mm(FR4材质,介电常数4.3)双面板需通过SI9000软件计算,典型线宽1.2mm(1.6mm板厚)阻抗
    广州唯创电子 2025-05-13 09:00 36浏览
  •   舰艇电磁兼容分析与整改系统平台解析   北京华盛恒辉舰艇电磁兼容分析与整改系统平台是保障海军装备作战效能的关键技术,旨在确保舰艇电子设备在复杂电磁环境中协同运行。本文从架构、技术、流程、价值及趋势五个维度展开解析。   应用案例   目前,已有多个舰艇电磁兼容分析与整改系统在实际应用中取得了显著成效。例如,北京华盛恒辉和北京五木恒润舰艇电磁兼容分析与整改系统。这些成功案例为舰艇电磁兼容分析与整改系统的推广和应用提供了有力支持。   一、系统架构:模块化智能体系   电磁环境建模:基
    华盛恒辉l58ll334744 2025-05-14 11:22 93浏览
  • 在全球能源结构转型加速推进与政策驱动的双重作用下,油气输送、智慧水务及化学化工等流体计量场景正面临效率革命与智能化升级的迫切需求。传统机械式流量计虽在工业初期有效支撑了基础计量需求,但其机械磨损、精度衰减与运维困难等固有缺陷已难以适应现代工业对精准化、智能化与可持续发展的多维诉求。在此背景下,超声波流量计则凭借着高精度探测、可实时监测、无侵入式安装、无阻流部件、易于维护与绿色环保等优势实现了突破性发展,成为当代高精度流体计量体系中不可或缺的重要一环。该技术不仅是撬动能源利用效率提升、支撑智慧管网
    华普微HOPERF 2025-05-14 11:49 60浏览
我要评论
0
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦