1.1.1.2/24与/22是同一个IP吗?子网掩码才是网络身份的真正决定者
有人问我1.1.1.2/24和1.1.1.2/22是同一个 IP 吗这个问题看着基础但放在网络工程师面试里能一句话答对的人真不多。很多人只看到前面的1.1.1.2一样就脱口而出“是同一个 IP”可一旦把/24和/22这两个子网掩码带进去事情就没那么简单了。今天我把这个“基础问题”从头到尾拆开讲清楚包括二进制运算、网络边界、路由行为、通配符掩码以及工作中最容易踩的几个坑。1. 表面看地址一样网段身份却完全不同1.1 一个 IP 的完整身份 地址 掩码我们在日常口语里说“这台机器 IP 是 1.1.1.2”其实是一种偷懒的说法。严格的网络术语里一个 IPv4 地址的完整定义必须带上子网掩码比如1.1.1.2/24或者1.1.1.2/255.255.255.0。为什么掩码这么重要因为 IP 地址本质上是 32 位二进制数它被切成了“网络部分”和“主机部分”两段。网络部分决定“这台设备属于哪个小区”主机部分决定“在小区里的几号楼几零几”。子网掩码就是那把切刀它告诉你 32 位里前多少位是网络部分后多少位是主机部分。/24的意思是前 24 位是网络位后 8 位是主机位子网掩码写作255.255.255.0。/22的意思是前 22 位是网络位后 10 位是主机位子网掩码写作255.255.252.0。切法不同归属自然不同。可以这样理解1.1.1.2是那个门牌号子网掩码是街道办事处的管辖范围定义。/24说“这条街只包含 1.1.1.1 到 1.1.1.254”而/22说“这个片区包含 1.1.0.1 到 1.1.3.254”。同一个门牌号在两种行政划分下归属的小区范围完全不一样。1.2 CIDR 写法到底在说什么/24、/22这种写法叫 CIDR无类域间路由它把子网掩码压缩成一个斜杠加数字。这个数字就是掩码里连续 1 的个数。/2411111111.11111111.11111111.00000000也就是255.255.255.0/2211111111.11111111.11111100.00000000也就是255.255.252.0注意/22的第三个八位组是11111100前 6 位是 1后 2 位是 0。这意味着第三个八位组里也有主机位而不是像/24那样第三个八位组全是网络位。就是这“多了 2 位主机位”让整个网络范围往后扩了一大截。很多新手习惯把 IP 段看成“四段十进制”但计算机不这么看。路由器拿到一个 IP 和掩码只做一件事把 32 位二进制数做“与”运算得到网络地址。掩码里的 1 保留网络位0 清掉主机位。所以判断两个 IP 是不是同一个网段不是看前三位数字而是看“IP 与掩码”的结果是否相同。1.3 工程语境里的“同一个 IP”指什么如果只讨论地址字段1.1.1.2/24和1.1.1.2/22确实都是1.1.1.2数字相同。但在工程上“这台机器的 IP”通常默认包含掩码因为掩码直接决定通信行为决定它认为哪些地址在本地直连网段哪些需要走网关决定它发出的 ARP 请求会问谁决定广播地址是多少广播报文能覆盖多大范围决定路由表里直连路由是哪一条所以我的结论是严格说这不是同一个 IP因为网络身份不同如果只谈地址值数字相同但这不是网络层面上有效的表达。后面的内容我会把这个结论用二进制算给你看再用真实命令验证。2. 手把手算一遍/24 与 /22 的网络边界2.1 从进制开始把两个掩码都转成二进制拿1.1.1.2来说先把它拆成四组二进制第一段1 00000001第二段1 00000001第三段1 00000001第四段2 00000010所以完整写下来是00000001.00000001.00000001.00000010/24的掩码是11111111.11111111.11111111.00000000/22的掩码是11111111.11111111.11111100.00000000求网络地址就是把 IP 和掩码逐位做“与”运算AND1 AND 1 11 AND 0 00 AND 0 0。对/24来说1.1.1.2 和 255.255.255.0 做与运算00000001.00000001.00000001.00000010 AND 11111111.11111111.11111111.00000000 00000001.00000001.00000001.00000000结果是1.1.1.0这个就是1.1.1.2/24的网络地址。对/22来说1.1.1.2 和 255.255.252.0 做与运算关键在于第三个八位组第三段 IP00000001 第三段掩码11111100 按位与 00000000前面两位00被保留成网络位但1的二进制是00000001和11111100与完之后低两位直接归零第三段变成了0。所以完整结果是00000001.00000001.00000000.00000000即1.1.0.0这就是1.1.1.2/22的网络地址。看到区别了吧同一个 IP 地址因为掩码不同算出来的网络地址从1.1.1.0变成了1.1.0.0。1.1.1.2/22根本不属于“1.1.1.0/22”这个网络因为第三段的1被掩码截断了——它落进了1.1.0.0/22这个大网段里。2.2 网络地址、广播地址和可用主机范围算完网络地址再算广播地址。广播地址就是把主机位全部置 1。更准确的做法是网络地址 OR 掩码取反。/24的掩码取反是0.0.0.255网络地址1.1.1.0OR0.0.0.2551.1.1.255。所以1.1.1.2/24的广播地址是1.1.1.255。/22的掩码取反是0.0.3.255网络地址1.1.0.0OR0.0.3.2551.1.3.255。所以1.1.1.2/22的广播地址是1.1.3.255。主机范围就是网络地址 1 到广播地址 -1配置网络地址广播地址可用主机范围可用主机数1.1.1.2/241.1.1.01.1.1.2551.1.1.1 ~ 1.1.1.2542541.1.1.2/221.1.0.01.1.3.2551.1.0.1 ~ 1.1.3.2541022主机数的计算公式是2^(32-掩码位数) - 2减掉的 2 个地址是网络地址和广播地址。/24是2^8 - 2 254/22是2^10 - 2 1022。这个差异非常直观/22的广播域是/24的四倍。2.3 为什么 /22 覆盖了四个 /24而不是一个“更大的 C 段”很多人习惯把/22理解成“IP 地址第三段直接从 1 到 2”这是错的。/22覆盖的是第三段中“低 2 位所有组合”的网段。第三段掩码是11111100低 2 位是主机位所以第三段数字的变化规律是00000000 - 0 00000001 - 1 00000010 - 2 00000011 - 3也就是说1.1.0.0/22实际覆盖了1.1.0.0/24、1.1.1.0/24、1.1.2.0/24、1.1.3.0/24四个 C 段。再往外一格1.1.4.0/22覆盖的就是1.1.4.0/24到1.1.7.0/24。所以1.1.0.0/22和1.1.4.0/22是两个完全不重叠的相邻大网段中间以 4 为步进。这一点在规划地址时特别重要。如果给用户分配了1.1.0.0/22那1.1.4.x绝不在范围内不能直接用。反过来如果用户拿了一个1.1.5.2/22的地址他的网络地址其实是1.1.4.0而不是1.1.5.0。3. 在真实设备上验证掩码不同行为完全不同3.1 Linux 命令行三分钟验证直连路由和广播域纸上算完最好还是上机验证一下不用真路由器一台 Linux 虚机就能做。先临时配一个/24ip addr add 1.1.1.2/24 dev eth0 ip addr show eth0 ip route show这时ip route里会出现一条直连路由1.1.1.0/24 dev eth0 proto kernel scope link src 1.1.1.2再看广播地址ip addr show eth0 | grep brd输出里brd 1.1.1.255说明这台机器的广播地址是1.1.1.255。然后把掩码改成/22ip addr del 1.1.1.2/24 dev eth0 ip addr add 1.1.1.2/22 dev eth0 ip route show直连路由立刻变了1.1.0.0/22 dev eth0 proto kernel scope link src 1.1.1.2广播地址也变成1.1.3.255。同一张网卡同一个 IP 数字只改了掩码路由表里的直连网段就完全不同了。这说明什么说明路由器看待这台设备的“网络身份”全变了。这台设备现在认为1.1.0.1、1.1.2.1、1.1.3.1都是自己的直连邻居不用经过网关就可以直接通信而/24模式下它只会把1.1.1.x当作本地网段访问1.1.2.x一律发网关。3.2 ARP 报文现场/22 会把谁当成邻居再进一步抓个包看看 ARP 请求的范围变化。在 Linux 上先抓包tcpdump -i eth0 -e -nn arp 然后ping 1.1.0.1。注意这里的 IP 是1.1.0.1在/24配置下 ping 它本机会认为它是非本地地址直接丢给网关不会发 ARP 请求。但在/22配置下本机认为1.1.0.1和自己是同一网段于是直接广播 ARP Request问“谁是 1.1.0.1请告诉我你的 MAC”。抓包输出里你会看到ARP, Request who-has 1.1.0.1 tell 1.1.1.2目标 MAC 是广播地址ff:ff:ff:ff:ff:ff。这就是掩码影响二层行为的直接证据。这个知识点在排障时特别有用。一个很经典的“玄学故障”是把服务器掩码从/24错改成/22结果它开始对网段外的设备直接发 ARP 请求。如果中间交换机开启了端口隔离、DHCP Snooping 或者广播抑制这些 ARP 请求会被丢掉表现为“能 ping 通某些设备但另一些设备时通时不通”抓包才能看出问题。3.3 路由器的最长前缀匹配/24 和 /22 同时存在怎么说还有一个常见场景路由器上同时存在1.1.0.0/22和1.1.1.0/24两条路由。此时去往1.1.1.2的流量会走哪一条答案是/24。因为路由器遵循最长前缀匹配原则Longest Prefix Match匹配到的前缀越长路由越精确优先级越高。/24比/22多匹配了 2 位所以更精确优先被选中。这个原则是超网聚合能工作的基础。内部网络可以精细地维护1.1.1.0/24的路由向外部宣告聚合后的1.1.0.0/22外界流量先按/22进到这台路由器路由器内部再按更具体的/24转发。两层路由各司其职既缩小了路由表又不丢精度。所以在看路由表时如果看到某个 IP 同时命中多条路由不要惊慌按最长前缀匹配去判断实际转发路径就行了。4. 掩码取反与通配符/22 在 ACL 和路由协议里的用法4.1 子网掩码怎么取反成通配符掩码热词里有一个“子网掩码取反怎么取”这在我们日常配置里非常常见尤其是 ACL 和 OSPF 的 network 命令。取反的方法很简单把子网掩码的二进制 0 和 1 互换再转回十进制。/24掩码255.255.255.0取反就是0.0.0.255。/22掩码255.255.252.0取反就是0.0.3.255。这里的反掩码叫通配符掩码Wildcard Mask它的作用不是“切分网段”而是“匹配范围”。0 表示必须严格匹配的位1 表示可以忽略的位。0.0.3.255的意思是前 22 位必须匹配后 10 位任意。这正好和/22的语义一致。很多人会把0.0.3.255写成0.0.0.3这是错的。0.0.0.3只忽略了第四段的低 2 位范围变成了一个“只有 4 个地址”的小集合完全不是 /22 想要的效果。快速换算技巧/22因为第三段低 2 位是主机位所以第三段通配符部分是2^2 - 1 3第四段 8 位全是主机位所以是255。于是得到0.0.3.255。我陪人排查过一个 ACL 不生效的问题配置里写的反掩码就是0.0.0.255但实际网段是192.168.8.0/22导致匹配范围只覆盖了192.168.8.0/249 段、10 段、11 段的流量全从 ACL 边上漏过去了。这种问题不抓包、不看配置细节真的很难找到。4.2 OSPF 宣告和 ACL 里的实际配置在 Cisco 设备上OSPF 宣告/22网段可以这样写router ospf 1 network 1.1.0.0 0.0.3.255 area 0华为设备类似ospf 1 area 0.0.0.0 network 1.1.0.0 0.0.3.255ACL 里匹配1.1.0.0/22范围的写法是access-list 100 permit ip 1.1.0.0 0.0.3.255 any这个 ACL 的作用就是放行源地址在1.1.0.0到1.1.3.255之间的所有 IP 流量。如果你把通配符写错ACL 要么只匹配一小段要么匹配范围大到失控两种都是事故现场。OSPF 的 network 命令其实也是同一个逻辑。设备把宣告的网络地址和通配符掩码做匹配只要接口 IP 落在范围内就在该接口上启动 OSPF。很多人以为 OSPF 宣告必须写“接口上的实际 IP 加上接口实际掩码的反掩码”其实不是你可以写一个比你实际网段更大的范围只要覆盖住接口 IP 就行只不过这样会把范围内所有接口都拉进 OSPF需要谨慎使用。4.3 /22 的典型应用场景超网聚合与地址规划/22在实际工作中最常见的场景是超网聚合。假设一个分支办公室有四个业务网段10.10.8.0/24办公终端10.10.9.0/24无线网络10.10.10.0/24服务器区10.10.11.0/24物联网设备如果向总部上报路由逐条宣告要写四条路由。但如果这四个网段在地址规划时连续排列就可以聚合成一条10.10.8.0/22直接宣告到主干。总部路由表少三条记录收敛速度也更快。聚合的前提是地址规划整齐。如果这四个网段是从10.10.9.0/24到10.10.12.0/24中间跨了不连续的块那就没法用单个/22聚合。所以地址分配从第一天起就要考虑连续性否则后面聚合非常痛苦。另外宽带接入服务商给小企业分配地址时也经常给/22这种段因为企业需要公网 IP 数量往往不止 254 个。理解/22的边界才能准确判断服务商给的地址范围到底有多大避免把广播地址当可用地址用。5. 常见问题速查掩码、IP 冲突、端口连通性排查5.1 “明明同一个 IP为什么会冲突”IP 冲突是网络排障里的常客。表现形式是某台设备突然上不了网或者网络时好时坏查看系统日志可能看到“IP 地址冲突”的提示。排查过程我一般这样做先看本机 IP 和掩码ip addr showWindows 用ipconfig /all看 ARP 表Linux 用ip neigh showWindows 用arp -a如果发现同一个 IP 对应了两个 MAC 地址基本就是冲突了更直接的做法是抓包tcpdump -i eth0 -e -nn arp观察 ARP Request 和 Reply 的来源 MAC冲突的来源往往不是“两个设备配了完全一样的 IP”还有可能是掩码不一致导致网段重叠。比如一台设备配了10.10.8.5/24另一台配了10.10.8.5/22前者认为自己在10.10.8.0/24后者认为自己在10.10.8.0/22两个广播域搅在一起网关就可能收到来自同一个 IP 的两个 ARP 应答导致终端流量被错误引导。5.2 “掩码配错”有哪些表现掩码配错是新手常犯的错而且表现很有迷惑性症状可能原因排查思路能 ping 通网关但上不了外网网关地址不在本机计算出的网段内本机把网关当成了外部地址导致无法正确转发重新核对 IP、掩码、网关三者关系跨网段设备时通时不通/22 掩码让本机误以为远端设备在同一网段直接发 ARP 而不是走网关中间交换机丢包抓包看是否有大量 ARP 请求发往非本地网段广播报文异常扩散掩码太大广播域扩大广播消耗大增检查所有设备的掩码配置一致性DHCP 获取到地址但无法上网DHCP 地址池是 /22但客户端被强制配置了 /24广播地址不一致对比 DHCP 配置文件与客户端掩码判断掩码配错的快捷方法把本机 IP 和掩码做 AND 运算算出网络地址再检查网关地址是否落在这个网络范围内。如果网关不在那掩码一定有问题。5.3 telnet/nc 测端口、抓包定位问题一页纸热词里有“telnet ip 端口命令怎么看通不通”这也是排查服务不可用时的第一步。最简单的测试方法telnet 1.1.1.2 443如果端口通终端一般会显示连接成功的提示或者进入一个空白界面光标闪烁这时按Ctrl ]可以进入 telnet 命令模式再输入quit退出。如果端口不通通常会提示Trying 1.1.1.2... telnet: connect to address 1.1.1.2: Connection refusedConnection refused一般表示主机可达但目标端口没有服务在监听。Connection timed out则通常表示主机不可达或者中间防火墙把包丢了这两种情况要分开处理。如果系统没有 telnet 客户端新版 Windows 默认不装可以用更轻量的工具替代nc -zv -w 3 1.1.1.2 443-z表示只扫描端口不发送数据-v显示详细输出-w 3表示超时 3 秒。也可以直接用一个脚本快速探测多个端口for port in 22 80 443 3306; do timeout 2 bash -c echo /dev/tcp/1.1.1.2/$port 2/dev/null echo $port open || echo $port closed done这个脚本依赖 Bash 的/dev/tcp特性在 Linux 上常用方便批量测试。如果端口测试显示通了但业务还是异常那就需要抓包分析。抓包时重点关注 TCP 三次握手是否完整SYN、SYN-ACK、ACK 有没有丢包以及应用层报文是否正常。tcpdump -i eth0 host 1.1.1.2 and port 443是常用的过滤条件能精准定位抓取指定 IP 和端口的流量。6. 基础问题往往是排障效率的分水岭我个人在实际排障中最大的体会是大部分网络故障追到最后都是一个“基础概念不扎实”的问题。掩码、广播域、ARP、最长前缀匹配这些单独拿出来都很简单但组合在一起就能演化出千奇百怪的现象。回到开头那个问题1.1.1.2/24和1.1.1.2/22到底是不是同一个 IP答案取决于你怎么定义“IP”。如果你只看地址数字那确实一样如果你站在网络设备的角度看它们的网络地址、广播地址、直连路由、ARP 行为全都不同。工程上为了不产生歧义我建议每次报地址都带掩码比如直接说“这台机器是 1.1.1.2/24”而不是丢一个光秃秃的1.1.1.2出来。最后分享一个小技巧面试基础岗位或者带新人时我习惯让他们口算/22的地址范围。能在一分钟内算出10.10.8.0/22覆盖了哪几个/24、广播地址是多少的人基础基本过关算不出来的人后面排障大概率要绕弯路。这个习惯保持了很多年帮我筛掉了不少“只会配置命令、不懂原理”的简历。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →