一、 网络拓扑中的“绑定关系”

(明确数据包从内网到外网的流转路径与设备职责)

  • 发送方 (主机 H): 位于私有局域网内,持有的 IP(192.168.0.3)是私有地址。私有地址在 Internet 上无法被路由,绝对不能直接暴露到公网。

  • 边界守门员 (NAT 路由器 R2): 连接内网和外网的桥梁。它的左侧接口(面向 Internet)必须拥有一个合法的公网 IP,用于代表内网设备与外部通信。

  • 外网第一跳 (路由器 R1): 它的接口 IP(195.123.0.34/30)是破题的唯一线索。因为 R1 和 R2 之间连着同一根网线(点对点链路),所以 R1 的该接口与 R2 的左侧接口必定处于同一个子网中

二、 核心考点 1:NAT(网络地址转换)的本质

  • 工作原理: 当数据包离开内网前往 Internet 时,NAT 路由器会进行“偷梁换柱”,拦截该数据包,将其 IP 报头中的源 IP 地址(即主机的私有地址)强制替换为 NAT 路由器自身面向公网的接口 IP 地址

  • 解题映射: 题目问“经过 R2 转发后的源 IP 是什么”,其本质就是在问:R2 连接 R1 的那个公网接口,IP 地址是多少?

三、 核心考点 2:“魔数法”秒杀 /30 子网

(利用已知 R1 的 IP 195.123.0.34/30,反推同网段的 R2 接口 IP)

1. 提取魔数(算步长)

  • 子网掩码 /30 意味着前 30 位全为 1,对应的点分十进制为 255.255.255.252

  • 步长(魔数) = 。(步长需要用256减)

  • 物理含义:该网络的最后一个字节,是以 4 为单位划分独立区块的。

2. 划分区间(找网段)

  • 以 4 为步长列出所有网络段:0, 4, 8, 1228, 32, 36

  • R1 的 IP 尾数是 34,它恰好落在 [32, 35] 这个区间内。

3. 对号入座(分发 IP)

在一个步长为 4 的子网区间 [32, 35] 中,4 个地址的属性极其严格,掐头去尾后,中间的两个即可用 IP:

  • .32网络地址(区间下界,代表网络本身,不可分配给设备)

  • .33可用主机 IP 1

  • .34可用主机 IP 2(已被题目中的 R1 占用)

  • .35广播地址(区间上界,用于向该子网群发,不可分配给设备)

结论: 既然 R1 已经占用了 .34,与其在同一个子网的 R2,只能别无选择地配置为剩下的唯一可用地址 .33。拼上前面的网段,R2 的公网 IP 即为 195.123.0.33

四、 考场防坑总结

  • /30 子网的肌肉记忆: 在 408 考题或实际工程中,/30 专门用于路由器之间的点对点链路。其可用 IP 数量永远是 个。只要知道一端的 IP,另一端必然是与之紧邻的那个奇数或偶数。

  • 警惕私有 IP 陷阱: 只要看到 192.168.x.x10.x.x.x172.16.x.x ~ 172.31.x.x,这些都是私网地址,它们在选项中绝不能作为经过 NAT 转换后的外网源地址。

这个问题问到了计算机科学里最本质的一个概念,也就是大家常说的“零索引(Zero-based indexing)”带来的认知偏差。

要彻底搞懂这个区别,你只需要在脑子里把这两个词区分开:“编号(坐标)”“数量(容量)”

为什么算掩码和 IP 地址时总是看到 255?

答案:因为 255 是一段 8 位二进制数的“最大编号”。

  • IP 地址和子网掩码,在计算机底层都是由 32 个二进制位(bit)组成的。为了方便人看,我们把它切成 4 块,每块 8 位(也就是一个字节)。

  • 8 个二进制位全为 1 时(11111111),它的十进制值是:

  • 所以,当我们写下一个子网掩码(比如 255.255.255.0)时,前面的 255 只是在客观描述一个二进制状态:“这一段的 8 个开关全开到了 1”。

为什么算步长(块大小)时要用 256 去减?

答案:因为 256 代表的是一个字节的“总容量(数量)”。

  • 虽然最大的编号是 255,但别忘了,计算机是从 0 开始数数的!

  • 从 0 数到 255(0, 1, 2, …, 255),总共有多少个数字?恰好是 256 个。

  • 在数学上,8 个比特位能组合出的状态总数是 种。

  • 当我们计算“步长(Block Size)”时,我们真正想求的是:“这个子网里到底能装下多少个 IP 地址?” 这是一个求“数量”的过程,而不是求“编号”。

  • 所以,核心公式 256 - 掩码值 = 步长 的真实物理含义是:“该字节的总容量”减去“被网络位占用的容量”,剩下的就是“这个子网的跨度(数量)”。

一个通俗的类比:数组与大楼

如果你学过编程里的数组(比如 C/C++ 或 Java):

  • 你申请一个长度为 256 的数组:int arr[256];这就是算步长用的 256,代表总容量

  • 但这个数组里最后一个元素的下标是:arr[255]这就是算掩码时的 255,代表最大编号

再比如一栋有 256 层楼的大厦:

  • 如果一楼编号为 0,那么最高层的电梯按钮就是 255

  • 但如果你问开发商这栋楼一共能容纳多少层的住户,答案一定是 256

总结口诀:

  • 写具体的掩码和 IP 时,脑子里想的是“开关状态”,最高是 255。

  • 算步长和子网跨度时,脑子里想的是“总共能装多少”,基数必须是 256。