S15

IP 与子网

点击正文段落选定收藏或划线位置;未选定时使用屏幕内第一段。

课内目录

在 S13 中,IP 位于网际层,负责让数据包沿着网络到达目标主机。现在把这个抽象任务变成可以核对的配置:给出地址和掩码,你应当能算出它属于哪个网络;给出目标地址,你应当能解释主机为何直接发送,或者为何先找网关。沿用 S6、S8 阅读命令输出的方法,本课把计算结果与 Linux 的接口、路由、邻居记录逐项对应。

1 为何需要地址,又为何要划分子网

设想办公室只有 8 台电脑,大家接在交换机上,管理员还可以手工记住每台设备。设备增加到 8000 台以后,问题不只是地址够不够:寻找邻居的广播会影响更大范围,错误配置更难定位,搬迁设备时也很难判断哪些地址能够继续使用。把所有设备接入巨大的平面二层网络,会把日常管理和故障影响范围一起放大。

IP 地址提供逻辑位置,子网则把地址空间划成可以管理的范围。例如办公终端使用 192.168.10.0/24,实验设备使用 192.168.20.0/24。看到地址后,管理员能先找到所属区域,再检查该区域的交换连接和网关。这里的“位置”由网络配置决定,并不等于设备所在楼层;电脑从办公网络移到实验网络,通常也需要调整地址配置。

在常见的以太网设计里,管理员会让 1 个 IP 子网对应 1 个二层广播域,广播不会经路由器原样扩散到下个广播域。这样既便于分配地址,也便于控制影响范围。但掩码本身不会把交换机切开:如果把不同子网混放在同个二层网络里,底层广播仍可能相互可见。要得到设计中的边界,还需要正确的交换网络划分和路由连接。

子网之间通过网关转发数据,所以“划开”并不意味着永远隔绝。财务终端能否访问服务器,还取决于路由及访问控制规则。子网是组织地址和通信范围的基础,不能单独替代安全策略。以后学习云上的 VPC 子网时,还会遇到地址范围、路由和用途的对应关系;现在先把机房或办公室中这套关系算清楚。

地址范围与实际网络边界的配合
地址范围与实际网络边界的配合

2 IPv4 地址与掩码:谁是网络,谁是主机

IPv4 地址共有 32 位,通常分成 4 组,每组 8 位,用点分十进制表示。192.168.10.20 的 4 组数分别是 192、168、10、20,每组取值为 0–255。点只是方便人阅读的分隔符,网络部分的边界不一定恰好落在点上,更不能只看末尾数字来判断所属子网。

掩码也是 32 位。在本课使用的连续掩码中,左侧连续的 1 标记网络位,右侧连续的 0 标记主机位。地址与掩码结合,才能知道哪些位用于识别网络,哪些位用于区分该网络里的接口。单独写“地址是 192.168.10.20”还不足以确定网络范围。

看 192.168.10.20 配合 255.255.255.0。掩码前 24 位为 1,后 8 位为 0,因此前 3 组构成网络部分,末组是主机部分。把地址的每个位与掩码对应位做 AND:只有两边都为 1,结果才为 1;只要掩码位为 0,该位置的结果就是 0。

项目第 1 组第 2 组第 3 组第 4 组
地址的二进制11000000101010000000101000010100
掩码的二进制11111111111111111111111100000000
AND 结果11000000101010000000101000000000
结果的十进制192168100

所以网络地址是 192.168.10.0,主机部分的数值是 20。不要把这个结论缩写成“最后 1 组永远是主机号”:它只在这里的 /24 边界下成立。掩码改变,网络位与主机位的分工也会改变;原地址的 32 位数值却可以保持不变。

地址与掩码共同确定网络部分
地址与掩码共同确定网络部分

交互中先看末组的 00010100,再把它与 00000000 对齐,观察为什么结果为 0。随后把前 3 组展开,确认它们与全 1 相与后原样保留。掌握这个操作后,遇到跨越点分组边界的掩码,也可以按位计算,而不用猜测地址“长得像”哪个网段。

3 CIDR 写法与前缀长度

CIDR 用斜杠后的数字表示网络前缀长度。192.168.10.20/24 表示该地址的前 24 位是网络位,等价掩码为 255.255.255.0。斜杠后的 24 不是主机数量,也不是末组数值;它是从最左侧数起的网络位数量。主机位数由 32 减去前缀长度得到。

先做 3 次前缀到掩码的转换。/16 需要 16 个连续的 1,刚好填满前 2 组,所以掩码为 255.255.0.0。/24 填满前 3 组,所以是 255.255.255.0。/20 则先填满 16 位,再在第 3 组填 4 位:11110000 的值为 128 + 64 + 32 + 16 = 240,因此得到 255.255.240.0。

前缀掩码主机位第 3 组的边界特征
/16255.255.0.016第 3、4 组都属于主机部分
/20255.255.240.012第 3 组前 4 位属于网络部分
/24255.255.255.08第 3 组全部属于网络部分

反过来,255.255.240.0 中前 2 组各贡献 8 个 1,第 3 组贡献 4 个 1,合计 20,因此写作 /20。255.255.255.252 的末组是 11111100,贡献 6 个 1,加上前面的 24 位得到 /30。这里数的是连续的 1;不能把任意不连续的位图当成本课的 CIDR 掩码。

再算 172.16.21.9/20。第 3 组的 21 写成 00010101,与 240 的 11110000 相与得到 00010000,也就是 16;第 4 组被清零。所以网络地址是 172.16.16.0/20,而不是 172.16.21.0/20。这个网络的第 3 组覆盖 16–31,下个同长度网络从 32 开始。用块大小看,256 − 240 = 16,也能找到这些对齐边界。

前缀从点分组边界继续深入
前缀从点分组边界继续深入

再用 /20 例题核对范围:172.16.16.0 的后 12 位全为 0,把这 12 位全部置为 1,第 3 组变成 00011111,即 31,第 4 组变成 255,得到广播 172.16.31.255。可用范围从 172.16.16.1 到 172.16.31.254,共 4094 个地址。172.16.20.255 并非这个网络的广播,因为第 3 组还没有到 31。这也说明,前缀决定的不只是网络名称,还决定地址块的完整结束位置。

如果把同个地址写成 172.16.21.9/24,网络就变成 172.16.21.0,广播变成 172.16.21.255。地址未改、前缀改变,主机对邻居范围的判断便发生变化。检查配置差异时,应把地址与前缀作为整体比较,不能只确认地址数字没有变化。

前缀越长,同个网络里可变化的主机位越少,地址块越小。历史上的 A、B、C 类地址划分只作为背景,本课计算始终使用明确的前缀。IPv6 也存在,提供更大的地址空间;本课的位数、掩码与数量例题均针对 IPv4。

4 网络地址、广播地址与可用主机数

对普通 IPv4 以太网子网,主机位全为 0 的地址用来表示网络,主机位全为 1 的地址是该子网的广播地址。这 2 个地址不分配给普通主机接口。注意“全为 0”与“全为 1”指的是整个主机部分,不一定只是末组数字;先确定掩码,才能判断特殊地址。

以 172.16.5.0/24 为例。主机位有 32 − 24 = 8 位,共 2^8 = 256 种组合。主机位从 00000000 到 11111111,对应末组 0–255。扣除网络地址和广播地址,剩余 256 − 2 = 254 个普通可用主机地址。

项目172.16.5.0/24 的结果
网络地址172.16.5.0
广播地址172.16.5.255
可用主机范围172.16.5.1–172.16.5.254
普通可用主机地址数254

再看很小的 10.0.0.0/30。它只留下 2 个主机位,组合依次为 00、01、10、11,地址依次是 10.0.0.0、10.0.0.1、10.0.0.2、10.0.0.3。这里网络地址是 10.0.0.0,广播地址是 10.0.0.3,可用范围是 10.0.0.1–10.0.0.2,只有 2 个可用地址。这解释了为什么小地址块适合只有 2 个端点的连接,而不适合放 20 台终端。

可以把容量估算记为:普通可用主机数 ≈ 2^(32 − 前缀长度) − 2。在连续掩码、保留网络和广播地址的普通子网假设下,这个结果是准确的;真正可分配给业务的数量还要扣除网关及其他保留地址。例如 /24 的 254 个地址中,网关用去 1 个后,普通设备最多还可占 253 个,实际规划通常还会留出余量。

把滑块从 /24 移到 /30,先观察主机位从 8 降到 2,再观察总地址从 256 降到 4,可用数从 254 降到 2。每增加 1 位前缀,总地址数减半,但“扣除 2 个”后的结果不会始终恰好减半。不要只记数列而忘记地址用途。

还可以用 /27 检查自己是否真正理解对齐。192.168.10.64/27 留下 5 个主机位,总地址数是 32,块大小也是 32,因此覆盖末组 64–95。网络地址为 .64,广播为 .95,可用范围为 .65–.94,共 30 个。下个 /27 从 .96 开始;如果误把 .96 当成本段广播,就把相邻子网的网络地址混了进来。

容量计算与边界计算应相互印证:94 − 65 + 1 = 30,与 2^5 − 2 相同。若两个算法得出的数不一致,优先检查是否把起点、终点都算进去了,以及是否误把广播放进主机列表。这个复核方法也适用于 DHCP 池和静态地址区。

/31 和 /32 存在特殊用途,不能机械套用上述减 2 公式。/31 可在支持相应规则的点到点链路上使用;/32 表示单个 IPv4 地址,常见于主机路由等场景。滑块在这 2 个位置应显示适用范围说明,而不是给出负数或把特殊用途解释成没有价值。

5 同一网段与跨网段:何时找网关

先采用最常见的配置:主机只有 1 个业务接口、该接口的直连路由,以及 1 条默认路由。源主机是 192.168.1.10/24,网关是 192.168.1.1。它用自己的掩码计算本地网络为 192.168.1.0/24,再根据路由判断目标应从哪里发送。对具体设备而言,最终决定来自路由表;“同网段直接发、跨网段找网关”是这类基础配置的判断结果。

目标为 192.168.1.50 时,将目标与 255.255.255.0 相与得到 192.168.1.0,与本地网络相符。主机会在本地链路上寻找目标的链路层地址,然后把数据直接送给它。IPv4 常用 ARP 完成这次邻居地址查询。这里的“直接”并不表示没有交换机,而是没有请 IP 网关转发这个数据包。

目标换成 192.168.2.50,相与得到 192.168.2.0,与源主机的直连网络不同。如果没有更具体的路由,就使用默认路由,把下一跳设为 192.168.1.1。主机此时寻找的是网关的链路层地址。数据包中的目标 IP 仍是 192.168.2.50,不会因为先交给网关就改写成 192.168.1.1。

路由选择决定直接找目标还是先找网关
路由选择决定直接找目标还是先找网关

为什么网关通常要在本机直连范围里?因为主机必须先把数据实际交给下一跳。192.168.1.10/24 能在本地找到 192.168.1.1,网关才有机会继续转发;随意填写远处的 192.168.9.1,并不会让中间路径自动出现。网关地址是一条可执行的下一跳信息,不能只当作表格中的必填项。

而且通信要看返回方向。即便 192.168.1.10 已把请求交给网关,192.168.2.50 也需要有通往源地址的返回路由。单向路由存在,只证明请求可能到达。排查时对两端分别做路由查询,可以区分“源端不知道怎么发”与“对端不知道怎么回”,减少盲目修改网关的次数。

在 Linux 上可以让系统给出选择结果。以下示例中的 dev 是出口接口,src 是选择的源地址,via 后面是下一跳:

$ ip route get 192.168.1.50
192.168.1.50 dev eth0 src 192.168.1.10
    cache
$ ip route get 192.168.2.50
192.168.2.50 via 192.168.1.1 dev eth0 src 192.168.1.10
    cache

第 1 条没有 via,表示按当前路由直接处理目标;第 2 条明确经过网关。但路由查询只说明系统准备怎样发,不证明网线正常、邻居能响应或远端服务可用。若目标有多个匹配路由,通常按最长前缀匹配选择更具体的路由,例如 /24 比 /16 更具体。排查时应读实际输出,不能只凭地址外观替系统作决定。

6 看本机:地址、掩码、路由如何对应

阅读本机配置时,把接口地址和路由放在一起。ip addr 回答接口配置了什么地址和前缀,ip route 回答哪些目的地通过哪个出口或下一跳可达。下面是一组相互对应的示例,接口名 eth0 只是示意;你的机器可能显示其他名称。

$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
$ ip route
 default via 192.168.1.1 dev eth0
 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10

先抓住 inet 192.168.1.10/24:这是接口地址与前缀,不是网络地址。算出网络 192.168.1.0、广播 192.168.1.255 后,与输出里的 brd 对照。再读路由表的 192.168.1.0/24:这条直连路由说明该范围能从 eth0 直接尝试到达,scope link 表示链路范围,src 给出该路由通常采用的源地址。

最后读 default via 192.168.1.1。默认路由可以理解为 0.0.0.0/0,它在没有更具体匹配时接住目标。网关 192.168.1.1 落在本机直连范围内,因此本机可以先通过 eth0 找到它。默认路由没有声明整个世界都与本机处在同个子网,只是声明其他目标先交给谁。

这 3 处信息应能相互验算。如果接口写 /24,预期的普通直连范围就是 192.168.1.0/24;若文档却写 192.168.0.0/16,应查清是文档过期还是配置错误。如果默认网关写成 192.168.2.1,而又没有额外路由或特殊配置使它可达,就不能假设它会自动工作。不要为了让命令接受配置而随意增加强制直连选项。

从接口前缀核对直连路由和默认路由
从接口前缀核对直连路由和默认路由

实际检查可以先记录接口、地址、前缀,再计算范围,最后用 ip route get 目标地址 核对出口。设备有多个地址或额外路由时,配置比上面的例子复杂,尤其要看 src 是否符合预期。UP 说明接口的管理状态,LOWER_UP 提供底层链路状态线索;即使它们都出现,也不等于对端 IP 可达。输出是证据,需要结合问题逐层解释。

继续往下看邻居表,才能把“选中了出口”与“能交给下一跳”对应起来。仍用本节的配置,访问 192.168.2.50 时,先由默认路由选出网关 192.168.1.1,再在 eth0 上查询这个网关的 MAC 地址。邻居表保存的是本地链路上 IP 与链路层地址的对应关系,不是所有远端主机的地址目录:

$ ip neigh show dev eth0
192.168.1.1 lladdr 02:00:00:00:01:01 REACHABLE
192.168.1.50 lladdr 02:00:00:00:01:32 STALE

第 1 行说明网关的邻居记录近期得到过可达性确认;它不证明网关已经把包转发到目标。第 2 行的 STALE 表示记录的可达性需要后续确认,并非已经判定设备掉线,系统仍可先使用已知地址。表里没有 192.168.2.50 是正常的,因为本机只需把包交给网关,不需要在本地查询远端主机的 MAC。

若访问跨网段目标失败,可先查 ip route get 192.168.2.50。如果输出仍是预期网关,再查网关邻居记录。出现 INCOMPLETE 时,系统正在解析邻居;随后变为 FAILED,说明这次解析未成功。此时应核对网关接口是否启用、本机是否接入正确广播域,以及地址是否配置在预期接口。路由选对却连网关的链路层地址都得不到,就还没有证据把问题归到远端服务器。

还有一种故障不改变子网计算结果:同个广播域内,2 台设备同时使用 192.168.1.50/24。两台的前缀、直连路由都可能看起来正确,但其他主机发出的 ARP 查询可能收到不同 MAC 的应答,缓存更新后,数据就可能送到不同设备,表现为访问时好时坏。单次 ping 成功不能排除这种冲突。

调查时应把观察到的 IP、MAC、接口和时间一起记录,再与地址登记、DHCP 租约及设备接口信息核对。普通单机地址若反复对应不同 MAC,是冲突线索;若现场部署了网关冗余等机制,也要先核对设计。仅凭清空邻居缓存后暂时恢复,不能宣告修复。应消除重复分配或修正动态池排除项,再确认该地址持续对应预期设备。这样,接口前缀负责解释网络边界,路由负责解释下一跳,邻居记录负责解释本地实际交付,3 类证据才形成完整链条。

7 常见坑:掩码算错、把广播当地址、公私网混淆

最容易漏掉的是边界差 1。172.16.5.0/24 的广播是 172.16.5.255,可用地址在 .254 结束,不能因为设备编号到 255 就给最后 1 台配 .255。同理,10.0.0.0/30 的广播在 .3,.4 已经属于下个 /30 地址块。规划表的结束地址应写明是“广播”还是“最后可用地址”,避免交付人员把它当成同个字段。

另个常见误区是把“.0 不能用、.255 不能用”当成普遍规则。特殊地址由全部主机位决定。10.0.1.0/23 所属网络是 10.0.0.0/23,广播是 10.0.1.255;其中 10.0.1.0 的 9 个主机位并非全 0,10.0.0.255 的主机位也并非全 1,因此按地址规则它们都是普通可用地址。是否实际分配,还要遵守现场约定。相反,/30 的 .3 虽然不像熟悉的 .255,也确实是广播。

掩码过长会把原本应该直连的目标判到外面,掩码过短则可能把应当经过网关的目标误判为本地。比如 192.168.1.10 本应使用 /24,却误配 /16,它会把 192.168.2.50 也当成直连目标,尝试在本地查询对方的邻居地址。如果对方实际在路由器另一侧,这次查询就可能无人回答。此时即使默认网关正确,主机也不会优先使用它,因为 /16 的直连路由比默认路由更具体。

公私网混淆则会让规划与访问预期一起出错。RFC1918 定义的私有范围如下,识别时必须看完整前缀:

私有地址块覆盖范围
10.0.0.0/810.0.0.0–10.255.255.255
172.16.0.0/12172.16.0.0–172.31.255.255
192.168.0.0/16192.168.0.0–192.168.255.255

172.20.1.5 位于私有范围,172.32.1.5 则不属于 RFC1918 私有地址,不能把所有 172 开头的地址都当作私网。私有地址可以在不同组织内重复使用,所以连接原本独立的网络时,必须检查地址重叠。不同办公室各用 10.0.0.0/24,单独运行可能正常,互联后目标归属就会发生歧义。

私有地址不会在公共互联网中作为普通可路由目的地使用,内部主机访问外部通常需要组织提供出口机制。公有地址也不等于已经获准使用或必定可达:分配授权、路由、访问规则都要成立。此外,“不在 RFC1918”不能直接等同于“可随便作为公网地址”,因为还存在其他特殊用途范围。

最后,/32 不是“用最严格的掩码就更安全”。若把普通局域网接口随意改成 /32,地址本身不再描述原来的整个直连子网,邻居与网关的可达性可能还需额外路由。看到 /32 应先问这是单个目标的路由,还是有明确设计的接口配置;不要套用 /24 的网关直觉,也不要把前缀长度当作安全等级。

8 案例:把 10.0.0.0/16 切成可交付的 /24

客户给出 10.0.0.0/16,需要办公、研发、测试、运维共 4 个网段,每段最多 200 台主机。先把“200”落实为同个子网同时需要的地址数量,再补上网关和保留地址。/25 只有 2^7 − 2 = 126 个普通可用地址,无法满足;/24 有 254 个,即使扣除 1 个网关,仍有 253 个,可覆盖当前需求并留下维护空间。

从 /16 切到 /24,新增 8 位子网划分位,因此可得到 2^8 = 256 个 /24。每个 /24 占 256 个地址,起点按第 3 组递增排列:10.0.0.0、10.0.1.0、10.0.2.0、10.0.3.0。不能把第 2 个写成 10.0.0.1/24,因为它与第 1 个仍属于同个网络。

用途子网广播地址普通可用范围网关
办公10.0.0.0/2410.0.0.25510.0.0.1–10.0.0.25410.0.0.1
研发10.0.1.0/2410.0.1.25510.0.1.1–10.0.1.25410.0.1.1
测试10.0.2.0/2410.0.2.25510.0.2.1–10.0.2.25410.0.2.1
运维10.0.3.0/2410.0.3.25510.0.3.1–10.0.3.25410.0.3.1
从整体地址块分配用途明确的子网
从整体地址块分配用途明确的子网

这里每段选择末组 .1 做网关是管理约定,不是 IP 协议强制要求。把这个约定写进文档,部署和排查才有共同依据。表中的普通可用范围包含网关,所以不能把整段范围都交给自动分配系统。还应明确哪些设备静态配置,哪些通过 DHCP 自动获得地址,避免同个地址被两种方式同时占用。

以办公网为例,保留 10.0.0.1 给网关,10.0.0.2–10.0.0.29 留给静态设备,10.0.0.30–10.0.0.229 作为 DHCP 池,10.0.0.230–10.0.0.254 留作扩容。DHCP 池容量是 229 − 30 + 1 = 200,静态区有 28 个地址,扩容区有 25 个地址,加网关后恰好是 254。若客户的“200 台”全部需要动态分配,这个池也能覆盖,但租约占用和增长仍要按现场需求评估。

交付时还应说明 4 个用途是否确实映射到不同广播域,以及网关在哪些接口上提供服务。只写完地址表、没有落地交换网络和路由,并不会自动形成 4 个可通信且边界清楚的网络。办公到研发是否允许访问,也需要单独明确,不能从“都属于 10.0.0.0/16”推导出放行结论。

检查这份分配表时,可以再抽取研发网与测试网的边界:研发最后的普通主机地址为 10.0.1.254,接下来是研发广播 10.0.1.255,再接下来才是测试网络地址 10.0.2.0,测试首个可用地址为 10.0.2.1。数值连续不等于用途相同,自动生成配置时尤其要保留这种区别。

若后来研发增加到 280 台,原 /24 就不够。不能只把研发掩码改为 /23,因为 10.0.1.0/23 实际归属 10.0.0.0/23,会把已分配的办公网也包含进来。应重新规划对齐且不重叠的地址块,或者新增子网,并安排迁移与路由变更。提前登记剩余空间,正是为了让增长有可核对的落点。

原始 /16 总共包含 65536 个地址,本次使用 4 × 256 = 1024 个,剩余 64512 个地址,也就是 252 个尚未分配的 /24。余量从 10.0.4.0/24 到 10.0.255.0/24;这是连续范围,但不能随意写成 10.0.4.0/16,因为 /16 的网络边界仍是 10.0.0.0。登记“预留、未启用”,能防止后续项目把它误认成可自行占用的空白。

9 排查案例:两台主机「在一个网」却 ping 不通

现场说 A、B 接在同个交换网络,地址前 3 组也相同,但 A ping B 失败。约定设计应为 192.168.1.0/24,网关是 192.168.1.1。A 配置为 192.168.1.10/24;B 错配为 192.168.1.200/25,而且当前没有默认路由。两台机器的链路均正常,本例还假设没有防火墙拦截 ICMP。先固定这些条件,避免把多个故障混成同个原因。

先读两端接口,不从“地址看起来相近”直接下结论:

A$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
B$ ip addr show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
    inet 192.168.1.200/25 brd 192.168.1.255 scope global eth0
B$ ip route
192.168.1.128/25 dev eth0 proto kernel scope link src 192.168.1.200

A 的 /24 对应 255.255.255.0,它认为直连范围是 192.168.1.0–192.168.1.255,B 在里面。B 的 /25 对应 255.255.255.128,末组 200 的二进制是 11001000,与 10000000 相与得到 10000000,也就是 128。因此 B 的网络为 192.168.1.128/25,广播为 192.168.1.255,可用主机为 192.168.1.129–192.168.1.254。

从 B 看 A,末组 10 与 128 相与得到 0,属于另个 /25;A 不在 B 的直连范围里。两端虽然显示相同的广播地址,却并不认同相同的网络边界。原计划的网关 192.168.1.1 也在 B 当前直连范围之外,不能按普通直连网关的方式使用。接着让系统直接给出路由决定:

A$ ip route get 192.168.1.200
192.168.1.200 dev eth0 src 192.168.1.10
    cache
B$ ip route get 192.168.1.10
RTNETLINK answers: Network is unreachable
错掩码使请求与返回路径判断不一致
错掩码使请求与返回路径判断不一致

在 A 上运行 ping -c 2 192.168.1.200,并在 B 的另个终端用 sudo tcpdump -n -i eth0 'arp or icmp' 观察。以下是邻居缓存初始为空时的一组示例摘录,时间戳省略:

ARP, Request who-has 192.168.1.200 tell 192.168.1.10
ARP, Reply 192.168.1.200 is-at 02:00:00:00:01:c8
IP 192.168.1.10 > 192.168.1.200: ICMP echo request, id 15, seq 1, length 64
IP 192.168.1.10 > 192.168.1.200: ICMP echo request, id 15, seq 2, length 64
A$ ip neigh show 192.168.1.200
192.168.1.200 dev eth0 lladdr 02:00:00:00:01:c8 REACHABLE

这组证据说明 A 已经找到了 B 的链路层地址,请求也到达了 B,但没有看到回应。B 为回包查找到 A 的路由时失败,故障断点在返回方向。不要把它写成“A 因为 B 掩码错而必然 ARP 无人回答”:在本例的普通 Linux 以太网配置下,B 仍可以回答对自身地址的 ARP,请求与响应 IP 包是否能完成往返是另个问题。

如果实际看到 A 的邻居状态从 INCOMPLETE 变为 FAILED,同时抓包只有重复的 ARP 请求,应继续查 B 是否在线、交换网络是否真的连通、是否存在额外的 ARP 限制。那是不同的证据链。错掩码可以与链路隔离同时存在,但不能仅凭 ping 失败就把所有现象归到掩码上。邻居缓存已有记录时也未必出现新的 ARP,抓包时要结合当前邻居表判断。

在 B 的本地控制台按设计把前缀改回 /24。下面只用于本例演示临时运行配置;远程维护时应使用现场的持久化网络配置流程,避免删除当前连接所依赖的地址:

B$ sudo ip addr del 192.168.1.200/25 dev eth0
B$ sudo ip addr add 192.168.1.200/24 brd 192.168.1.255 dev eth0
B$ sudo ip route replace default via 192.168.1.1 dev eth0
B$ ip route get 192.168.1.10
192.168.1.10 dev eth0 src 192.168.1.200
    cache
A$ ping -c 2 192.168.1.200
64 bytes from 192.168.1.200: icmp_seq=1 ttl=64 time=0.42 ms
64 bytes from 192.168.1.200: icmp_seq=2 ttl=64 time=0.39 ms
2 packets transmitted, 2 received, 0% packet loss

修复后,B 的直连网络变成 192.168.1.0/24,A 的 .10 落入其中,回应可以直接返回。补回默认路由是为了恢复设计中的跨网段访问;这次同网段 ping 成功依赖的是正确的直连判断。验收还应从 B 向 A 再测,并检查持久化配置,防止重启后重新出现 /25。记录应包含修复前后的前缀、网络计算与路由结果,使他人能复核因果关系。

放进方案里

地址方案应让部署者知道怎样配,也让接手者知道怎样验。先登记整体地址块、所属地点、用途和负责人,再为每个子网建立记录。前缀必须与地址一起出现,不能只写“办公网 10.0.0”。明确哪些子网已经启用,哪些只是预留,并在变更时同步更新版本与日期,避免多个团队根据不同表格继续分配。

每行至少包含用途、网络地址及前缀、广播地址、普通可用范围、网关、DHCP 池、静态地址区和对应接口或广播域。网关占用的地址应从自动分配池排除,服务器静态地址也不能落进未经排除的动态池。若容量要求为 200 台,应注明是否含网关、打印机和其他基础设备,按实际占用重新核算余量。

用途与落点子网与广播网关DHCP 池静态与预留
办公,办公广播域10.0.0.0/24;10.0.0.25510.0.0.110.0.0.30–10.0.0.229.2–.29 静态;.230–.254 预留

表中的缩写只在已经明确完整子网的同一行使用,交付配置仍写完整地址。静态区应继续登记设备与使用者,预留区应说明申请规则。涉及不同地点互联时,先核对既有私网是否重叠;涉及跨网段访问时,记录预期网关和允许访问的目标,不用“内部互通”代替具体范围。

验收时请第 2 位人员不看计算草稿,仅根据每行前缀独立推导网络地址、广播地址及可用范围,再核对池容量和地址冲突。现场抽取动态与静态设备,读取接口前缀和路由,用路由查询分别验证直连目标与跨网段目标。保留配置与验证输出,并确认重启后的配置一致。这样交付的表格才能成为持续维护的依据,而不是只在安装当天有用的清单。

10 小结:走向 TCP 与 UDP(S17)

地址与前缀共同确定网络边界,主机再根据路由选择直接发送或交给网关。练习时可以给自己 2 个检查点:172.16.21.9/20 为什么属于 172.16.16.0/20?192.168.1.200/25 为什么不能把 .10 当成直连邻居?前者检查按位计算,后者检查双向通信的判断是否一致。

S17 将转向 TCP 与 UDP:IP 把包送向目标主机之后,传输层如何区分通信端点,又为应用提供怎样的通信方式。届时仍要先确认地址、路由和返回路径,再判断更上层的通信现象。

下一课转向 S17 TCP 与 UDP:把本章验收过的结论带进后续主题,写成可检查的方案约束。

同阶段相关课

AI 答疑

默认关闭。启用后,只发送本课标题、最近阅读的屏幕内正文摘录(最多 6000 字)与本次问题。

配置自己的服务