IP 网络基础进阶:子网划分、网关、ARP 与 VLAN 的取舍
很多人对 IP 网络的认知停留在「配个 IP、掩码、网关就能通」,遇到稍复杂的问题——为什么两个网段 ping 不通、为什么划了 VLAN 之后要加路由、为什么 10.0.0.0/8 里有的地址是合法的有的却不能用——就开始靠玄学。这篇把这些散点串成一条线:子网划分解决「谁和谁在同一个广播域」,网关与路由解决「不在一个域怎么办」,ARP 是两者之间的粘合剂,VLAN 则是把物理广播域切开的刀。
一、子网与 CIDR:网络位和主机位的那一刀
IP 地址没有「天然网段」,网段完全由掩码定义。CIDR 记法 a.b.c.d/n 里,前 n 位是网络位,后 (32-n) 位是主机位:
10.20.30.44/24
地址: 00001010 00010100 00011110 00101100
掩码: 11111111 11111111 11111111 00000000 ← 前 24 位是网络
网络: 10.20.30.0/24(主机位清零)
可用主机数 = 2^8 - 2 = 254
(主机位全 0 → 网络地址本身;主机位全 1 → 广播地址 10.20.30.255)
为什么减 2 是新手最容易忘的一步:主机位全零代表「这个网络本身」,全一是「本网段所有人」,都不能分给主机。这也是 /31(点对点链路,RFC 3021 特批可用 2 个地址)和 /30(4 个地址只有 2 个可用)的来由。
二、子网划分实战:把 /16 切给四个部门
案例:拿到 10.10.0.0/16,要划出至少 4 个能容纳 ~500 台主机的子网。
第一步算需求:500 主机 → 主机位需要 9 位(2⁹−2 = 510 ≥ 500)→ 网络位 32−9 = 23 → 前缀从 /16 借 7 位变成 /23。第二步切:
| 子网 | 范围 | 可用主机 | 广播地址 |
|---|---|---|---|
| 10.10.0.0/23 | 10.10.0.1 ~ 10.10.1.254 | 510 | 10.10.1.255 |
| 10.10.2.0/23 | 10.10.2.1 ~ 10.10.3.254 | 510 | 10.10.3.255 |
| 10.10.4.0/23 | 10.10.4.1 ~ 10.10.5.254 | 510 | 10.10.5.255 |
| 10.10.6.0/23 | 10.10.6.1 ~ 10.10.7.254 | 510 | 10.10.7.255 |
注意子网步长:/23 的块大小是 2 × 256 = 512,所以子网边界落在 0、2、4、6(第三个八位组的偶数)。「块大小 = 256 − 掩码对应八位组」是快速心算的钥匙:掩码 255.255.254.0 → 256−254 = 2,子网边界每隔 2 跳一次。
顺带纠一个高频误区:10.10.1.0 在 /23 里是合法的主机地址(它只在 /24 语义下才是网络地址)。判断一个地址能不能用,永远结合掩码,而不是看数字长得像不像。
三、网关与路由:跨网段的包是怎么走路的
主机上的路由表其实极简,Linux 下 ip route 通常只有两三行:
$ ip route
10.10.2.0/23 dev eth0 proto kernel scope link src 10.10.2.15
default via 10.10.2.1 dev eth0
第一行:目标在本网段 → 直接交付(链路层可达)。第二行:default = 0.0.0.0/0 兜底 → 交给网关 10.10.2.1。路由匹配规则是最长前缀优先(longest prefix match):一条 /23 一定比 default 更具体,永远先被选中。运维上常见的「配了两个默认网关导致时通时不通」,本质就是两条等长路由在抢流量。
网关本身没有任何神秘之处——它只是一台愿意替你转发跨网段流量的设备,所以生产规范要求每个网段的网关地址固定(习惯上用 .1 或 .254),避免 DHCP 下发的网关漂移引发「部分人能上网」的灵异事件。
四、ARP:网络层与链路层之间的翻译官
以太网里帧靠 MAC 地址交付,而人脑记的是 IP——把「下一跳 IP」翻译成「下一跳 MAC」的就是 ARP。主机在网段内广播 Who has 10.10.2.1? Tell 10.10.2.15,网关单播回应自己的 MAC,结果缓存进 ARP 表(ip neigh / arp -n)。
两个工程必知:
其一,回包也需要 ARP。能 ping 出去不代表回程链路没问题——「请求发出去了、回不来」和「根本没发出去」在用户看来都是「不通」,但排障方向完全不同(前者查回程路由/防火墙,后者查本机网关)。
其二,免费 ARP(gratuitous ARP):主机主动广播「我是 x.x.x.x,MAC 是我」,用于宣告地址归属。VRRP/Keepalived 主备切换、服务器迁移(连带 DHCP 冲突检测)都靠它刷新邻居缓存。而攻击者伪造免费 ARP 冒充网关,就是 ARP 欺骗——二层安全(DHCP Snooping + 动态 ARP 检测)防的正是这个。
五、广播域:交换机快,但广播是全员被迫营业
交换机隔离冲突域但不隔离广播——一个广播帧(ARP 请求、DHCP Discover 都算)会让整个二层网络所有主机中断响应一次。几十台设备无所谓;几百上千台时,ARP 风暴、广播噪声、故障域(一张大表、一个环路、全网瘫痪)都会逼你把网络切开。切法有二:
- 路由器物理分隔:不同交换机接不同路由器口——可靠但端口浪费、管理碎片化
- VLAN 逻辑分隔:同一台交换机上,把端口划进不同的虚拟局域网——现代标准做法
六、VLAN 与 Trunk:一台交换机,N 个独立网络
802.1Q VLAN 在以太帧中插入 4 字节 tag,其中的 VLAN ID 标记这帧属于哪个广播域。交换机端口两种角色:
| 端口类型 | 收发规则 | 接什么 |
|---|---|---|
| Access 口 | 收发不带 tag 的普通帧,归属单一 VLAN(PVID) | 终端设备:电脑、打印机、AP |
| Trunk 口 | 允许多个 VLAN 的带 tag 帧通过,协商放行列表 | 交换机互联、接路由器/防火墙 |
# 华为风格配置速记
vlan batch 10 20 30
interface GigabitEthernet0/0/1
port link-type access
port default vlan 10 # 终端口:属于 VLAN 10
interface GigabitEthernet0/0/24
port link-type trunk
port trunk allow-pass vlan 10 20 30 # 上联口:三个 VLAN 都能过
核心心智模型:VLAN 10 的广播帧绝不会从属于 VLAN 20 的 access 口发出去——隔离发生在转发决策那一刻,而不是靠防火墙规则。这一刀同时切掉了广播噪声和大部分二层故障域。
七、VLAN 间路由:单臂路由 vs 三层交换机
VLAN 切完,不同 VLAN 互访必须经过三层设备,两种经典形态:
单臂路由(router-on-a-stick):路由器一个口接交换机 trunk,为每个 VLAN 建子接口做网关。所有 VLAN 间流量挤一条物理链路且要过路由器软件转发——适合小网络和实验室。
# Linux 服务器一秒变「单臂路由器」
ip link add link eth0 name eth0.10 type vlan id 10
ip addr add 10.10.10.1/23 dev eth0.10
ip link set eth0.10 up
echo 1 > /proc/sys/net/ipv4/ip_forward
三层交换机:在交换芯片里直接做路由(一次路由、处处交换),VLAN 接口(SVI)就是各网段网关,VLAN 互访线速完成。中大型网络的标准答案:接入层交换机划 VLAN,核心/汇聚层三层交换机做网关,向上再接防火墙出公网。