IP 地址与子网 — 到哪儿为止算自己这一片
一句话总结
IP 地址分为网络部分与主机部分,子网掩码定义两者边界;这条边界决定了哪些目标可以直接发送,哪些必须交给网关。
为什么需要它
不可能把全世界所有主机都放进一张表,路由器也无法逐一查找 40 亿条记录。因此,地址被设计为分层结构:前缀相同的地址归为一组,路由表只需用一行写明“这一组往那个方向走”。
它如何工作
在 192.168.10.37/24 中,/24 表示前 24 位是网络部分。因此网络地址为 192.168.10.0,最后 8 位属于主机部分。
- 可用地址数是 2 的 8 次方,再减去网络地址与广播地址,共 254 个。
- 拆成
/25后会得到两个各占一半的子网,每个有 126 个可用地址。 /30的 4 个地址中只有 2 个可用,因此常用于路由器之间的链路。
主机发送数据包时,判断过程很简单:分别用掩码处理目标地址与自身地址;如果网络部分相同,说明在同一网络,通过 ARP 获取对方 MAC 后直接发送;如果不同,则发送到默认网关的 MAC。关键在于,此时 IP 头中的目标仍是最终目标,只有链路层目标是网关。
路由器采用最长前缀匹配(longest prefix match)。如果路由表同时存在 10.0.0.0/8 与 10.1.2.0/24,目标为 10.1.2.5,就选择更具体的 /24。默认路由 0.0.0.0/0 的前缀长度为 0,因此永远是最后候选。
私有地址范围(10.0.0.0/8、172.16.0.0/12、192.168.0.0/16)不会在互联网中路由。因此,对外访问时,NAT 会把源地址改成公网地址,并通过端口号记住连接属于哪台内部主机。NAT 带有状态,由此会产生多个结果:外部无法主动向内部建立连接,长时间静默的连接也会从 NAT 表中删除并断开。空闲连接在几分钟后悄悄失效,常常就是这个原因。
在实际项目中
创建 Kubernetes 集群时,如果 Pod CIDR、Service CIDR 与节点网络重叠,路由会悄悄失效。重叠区间的流量被送往错误位置,症状往往零散地表现为“只有部分 Pod 之间无法通信”。最好在创建集群前就把网段规划写在纸上;事后再改,常常只能重建集群。
接下来的测验要确认什么
确认你能否用掩码计算网络地址,并按照最长前缀匹配选择下一跳。