news 2026/4/23 15:47:22

记IP嵌入式端IP地址合法性校验

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
记IP嵌入式端IP地址合法性校验

文章目录

  • 网络地址信息合法性校验
    • 掩码校验
      • 二进制运算步骤拆解
      • 关键逻辑总结
    • IP校验
        • A类地址
        • B类地址
        • C类地址
        • D类地址
        • E类地址
      • 特殊地址说明
      • 私有地址范围
      • 逐部分解析
      • 逐部分解析
  • 网关检查
      • 逻辑拆解

网络地址信息合法性校验

对于网络信息,在由远端设置本地设备时,在防御机制上,需要对网络信息进行合法性校验,常用的我们是对msk(掩码)、IPV4、gw(网关)进行校验。
近期在研究p-net协议栈,发现一个很漂亮的校验写法,在此做一下记录。
源码:p-net协议栈中pf_cmina.c文件。

掩码校验

校验掩码,首先掩码定义是什么?

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码是一个32位地址,用于屏蔽IP地址的一部分以区别网络标识和主机标识,并说明该IP地址是在局域网上,还是在广域网上。《百度百科》

类别子网掩码的二进制数值子网掩码的十进制数值
A11111111 00000000 00000000 00000000255.0.0.0
B11111111 11111111 00000000 00000000255.255.0.0
C11111111 11111111 11111111 00000000255.255.255.0

子网掩码一定是配合IP地址来使用的。对于常用网络A、B、C类IP地址其默认子网掩码的二进制与十进制对应关系如表1所示。子网掩码工作过程是:将32位的子网掩码与IP地址进行二进制形式的按位逻辑“与”运算得到的便是网络地址,将子网掩码二进制按位取反,然后与IP地址二进制进行逻辑“与”(AND)运算,得到的就是主机地址。如:192.168.10.11 AND 255.255.255.0,结果为192.168.10.0,其表达的含义为:该IP地址属于 192.168.10.0这个网络,其主机号为11,即这个网络中编号为11的主机。


因此子网掩码在二进制中的标识以连续的1和连续的0构成。并且连续的1在高字节,0在低字节。

&emsp有效子网掩码的二进制形式必须满足:
netmask = 2 n − 2 m ( n > m ) \text{netmask} = 2^n - 2^m \quad (n > m)netmask=2n2m(n>m)
其中n nn为总位数,m mm为低位连续0的位数。例如11110000对应n = 8 n=8n=8,m = 4 m=4m=4
在p-net中应用了一个很基础的数学运算,来判断是否是合法的掩码。掩码参数为netmask;

if(!(netmask&(~netmask>>1))){returntrue;}else{returnfalse;}

二进制运算步骤拆解

1. 按位取反 (~netmask)
假设输入netmask的二进制形式为11110000(十进制240),取反后得到00001111。该操作将原掩码的所有位翻转。

2. 右移一位 (>> 1)
对取反后的值右移一位:00001111 >> 1 = 00000111。右移会在左侧补0,相当于除以2(向下取整)。

3. 按位与操作 (&)
将原始netmask与上一步结果进行按位与:
11110000 & 00000111 = 00000000
只有对应位均为1时结果位才为1,否则为0。

4. 逻辑非 (!)
若按位与结果为0(即所有位均为0),逻辑非操作将其转为true,表示该掩码有效;否则为false

关键逻辑总结

该表达式通过位运算快速检测是否存在非连续的1和0交替情况。仅当掩码的高位1和低位0严格连续时,netmask & (~netmask >> 1)的结果为0,使条件成立。

IP校验

IP地址根据其网络和主机部分的划分,主要分为五类:A、B、C、D、E。

A类地址
  • 范围:1.0.0.0 到 126.255.255.255
  • 特点
    • 保留地址:10.0.0.0/8(私有地址)。
B类地址
  • 范围:128.0.0.0 到 191.255.255.255
  • 特点
    • 保留地址:172.16.0.0/12(私有地址)。
C类地址
  • 范围:192.0.0.0 到 223.255.255.255
  • 特点
    • 保留地址:192.168.0.0/16(私有地址)。
D类地址
  • 范围:224.0.0.0 到 239.255.255.255
  • 特点
    • 用于组播(Multicast),无网络和主机划分。
    • 最高位固定为1110。
E类地址
  • 范围:240.0.0.0 到 255.255.255.255
  • 特点
    • 保留用于实验或未来使用,最高位固定为1111。

特殊地址说明

  • 127.0.0.0/8:环回地址(如127.0.0.1)。
  • 0.0.0.0:表示默认路由或无效地址。
  • 255.255.255.255:受限广播地址。

私有地址范围

  • A类:10.0.0.0/8
  • B类:172.16.0.0/12
  • C类:192.168.0.0/16

这些分类和范围是IPv4地址设计的基础,实际应用中可能结合子网划分(CIDR)进一步优化地址分配。
由与IPV4的分类,故与外围设备通信,对于IP地址的范围便有了限制。pnet协议栈对此的防御机制很全面,我们看一下。先贴代码。

#definePNAL_MAKEU32(a,b,c,d)\(((uint32_t)((a)&0xff)<<24)|((uint32_t)((b)&0xff)<<16)|\((uint32_t)((c)&0xff)<<8)|(uint32_t)((d)&0xff))/* 传参: netmask,ip */{uint32_thost_part=ip&~netmask;if((netmask==0)&&(ip==0)){returntrue;}if(!pf_cmina_is_netmask_valid(netmask)){returnfalse;}if((host_part==0)||(host_part==~netmask)){returnfalse;}if(ip<=PNAL_MAKEU32(0,255,255,255)){returnfalse;}elseif((ip>=PNAL_MAKEU32(127,0,0,0))&&(ip<=PNAL_MAKEU32(127,255,255,255))){returnfalse;}elseif((ip>=PNAL_MAKEU32(224,0,0,0))&&(ip<=PNAL_MAKEU32(239,255,255,255))){returnfalse;}elseif((ip>=PNAL_MAKEU32(240,0,0,0))&&(ip<=PNAL_MAKEU32(255,255,255,255))){returnfalse;}returntrue;}

逐部分解析

计算主机部分

uint32_thost_part=ip&~netmask;

通过IP地址与子网掩码的反码进行按位与操作,提取主机部分。主机部分用于后续判断是否为网络地址或广播地址。

全零IP和子网掩码检查

if((netmask==0)&&(ip==0)){returntrue;}

当子网掩码和IP地址均为0时,视为特殊情况直接返回有效。这种情况可能表示默认路由或无地址状态。

子网掩码有效性检查

if(!pf_cmina_is_netmask_valid(netmask)){returnfalse;}

调用外部函数pf_cmina_is_netmask_valid验证子网掩码是否合法。子网掩码必须由连续的1和0组成,例如255.255.255.0是合法的。

网络地址和广播地址检查

if((host_part==0)||(host_part==~netmask)){returnfalse;}

主机部分全0表示网络地址,主机部分全1表示广播地址,这两种情况都视为无效。

特殊IP范围检查

if(ip<=PNAL_MAKEU32(0,255,255,255)){returnfalse;}

排除0.0.0.0到0.255.255.255范围的地址,这些通常用于特殊用途。

elseif((ip>=PNAL_MAKEU32(127,0,0,0))&&(ip<=PNAL_MAKEU32(127,255,255,255))){returnfalse;}

排除127.0.0.0到127.255.255.255范围的地址,这是本地回环地址范围。

elseif((ip>=PNAL_MAKEU32(224,0,0,0))&&(ip<=PNAL_MAKEU32(239,255,255,255))){returnfalse;}

排除224.0.0.0到239.255.255.255范围的地址,这是D类多播地址范围。

elseif((ip>=PNAL_MAKEU32(240,0,0,0))&&(ip<=PNAL_MAKEU32(255,255,255,255))){returnfalse;}

排除240.0.0.0到255.255.255.255范围的地址,这是E类保留地址范围。

默认返回

returntrue;

如果以上所有检查都通过,则认为IP地址有效。### 代码功能概述
这段代码用于验证一个IPv4地址是否有效,主要检查以下几个方面:

  • 是否为网络地址或广播地址
  • 子网掩码是否有效
  • 是否属于保留或特殊用途的IP地址范围

逐部分解析

计算主机部分

uint32_thost_part=ip&~netmask;

通过IP地址与子网掩码的反码进行按位与操作,提取主机部分。主机部分用于后续判断是否为网络地址或广播地址。

全零IP和子网掩码检查

if((netmask==0)&&(ip==0)){returntrue;}

当子网掩码和IP地址均为0时,视为特殊情况直接返回有效。这种情况可能表示默认路由或无地址状态。

子网掩码有效性检查

if(!pf_cmina_is_netmask_valid(netmask)){returnfalse;}

调用外部函数pf_cmina_is_netmask_valid验证子网掩码是否合法。子网掩码必须由连续的1和0组成,例如255.255.255.0是合法的。

网络地址和广播地址检查

if((host_part==0)||(host_part==~netmask)){returnfalse;}

主机部分全0表示网络地址,主机部分全1表示广播地址,这两种情况都视为无效。

特殊IP范围检查

if(ip<=PNAL_MAKEU32(0,255,255,255)){returnfalse;}

排除0.0.0.0到0.255.255.255范围的地址,这些通常用于特殊用途。

elseif((ip>=PNAL_MAKEU32(127,0,0,0))&&(ip<=PNAL_MAKEU32(127,255,255,255))){returnfalse;}

排除127.0.0.0到127.255.255.255范围的地址,这是本地回环地址范围。

elseif((ip>=PNAL_MAKEU32(224,0,0,0))&&(ip<=PNAL_MAKEU32(239,255,255,255))){returnfalse;}

排除224.0.0.0到239.255.255.255范围的地址,这是D类多播地址范围。

elseif((ip>=PNAL_MAKEU32(240,0,0,0))&&(ip<=PNAL_MAKEU32(255,255,255,255))){returnfalse;}

排除240.0.0.0到255.255.255.255范围的地址,这是E类保留地址范围。

默认返回

returntrue;

如果以上所有检查都通过,则认为IP地址有效。

网关检查

网关就没那么多讲究了,检查一下不为0,与IP在同一子网即可。

if((gateway!=0)&&((ip&netmask)!=(gateway&netmask))){returnfalse;}returntrue;

逻辑拆解

(gateway != 0)
验证网关地址是否为非零值。若网关为0(未设置),直接跳过后续检查。
(ip & netmask) != (gateway & netmask)
通过按位与运算比较:

  • ip & netmask获取IP地址的网络标识
  • gateway & netmask获取网关的网络标识
    当两者不一致时,说明IP与网关不在同一子网。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:33:41

CANN生态核心算子库合集:赋能AIGC多模态落地的全链路算力支撑

目录 一、三大核心算子库&#xff1a;各有侧重&#xff0c;覆盖AIGC全流程需求 1. ops-cv&#xff1a;AIGC视觉处理的高效加速库 2. ops-transformer&#xff1a;AIGC核心架构的专属加速库 3. SiP库&#xff1a;AIGC信号处理的高性能加速库 二、生态协同&#xff1a;三大库…

作者头像 李华
网站建设 2026/4/23 14:43:59

数字图像处理篇---HSL颜色空间

一句话核心HSL是HSV的“近亲”&#xff0c;同样按照人类直觉组织颜色&#xff0c;但它将亮度定义得更加自然&#xff1a;50%时颜色最纯&#xff0c;两端分别是纯黑和纯白。1. HSL vs HSV&#xff1a;兄弟之争HSL和HSV非常相似&#xff0c;都是为了解决RGB不直观的问题而生的。它…

作者头像 李华
网站建设 2026/4/23 14:42:42

开绕组永磁同步电机故障诊断及容错控制技术研究

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅成品或者定制&#xff0c;扫描文章底部微信二维码。1)基于电流特征解析的快速故障诊断算法。传统故障诊断方法主要依赖电流信号的幅值特征…

作者头像 李华
网站建设 2026/4/23 13:00:20

CANN ops-nn 算子解读:Transformer注意力机制中的Softmax实现原理

好的&#xff0c;请看这篇符合要求的 CANN ops-nn 算子解读文章&#xff1a; CANN ops-nn 算子解读&#xff1a;Transformer注意力机制中的Softmax实现原理 摘要 本文深入探讨了华为CANN&#xff08;Compute Architecture for Neural Networks&#xff09;生态中 ops-nn 算子…

作者头像 李华
网站建设 2026/4/23 13:04:36

微软发布睡眠智能体后门检测新方法

微软研究人员发布了一种扫描方法&#xff0c;可在不知道触发器或预期结果的情况下识别被投毒的模型。组织在集成开放权重大语言模型时面临特定的供应链漏洞&#xff0c;其中明显的内存泄漏和内部注意力模式暴露了被称为"睡眠智能体"的隐藏威胁。这些被投毒的模型包含…

作者头像 李华