📚 第四章 IP协议
📄 一句话概括

广播地址就是「主机位全 1」——它不是一台主机,是「这个网络里所有主机」。 广播不会跨过子网边界,所以它天然就是「缩小广播域」的边界。

📝 本节和前面几节的关系

4.3.2 提过「减 2」,这一节把被减掉的那两个之一讲清楚。 3.2.5 的广播风暴、3.2.6 的 VLAN,都在处理「广播太多」这件事。

一、主机位全 1

算法很机械:把主机位全部写成 1:

网段 广播地址 可用主机
192.168.3.0/24 192.168.3.255 254
192.168.3.128/25 192.168.3.255 126
10.0.0.0/8 10.255.255.255 16777214
172.16.5.0/28 172.16.5.15 14

第一行和第二行都是 .255,但它们的「网络」不是一个:第一条是整个 /24,第二条是它的上半段。 所以「同一个 IP 上,两个子网各有自己的广播地址」——广播的边界就是子网的边界。 第四行 .15 是个好例子:/28 的主机位只有 4 位,全 1 就是 15, 所以这段的范围是 .0 到 .15,可用 .1 到 .14。 「块大小 16」这个数在算子网时天天用——记住「/28 是 16 一格」,比按位算快。

二、广播帧长什么样

二层广播和三层广播是两件事:

类型 地址 谁处理
二层广播 FF-FF-FF-FF-FF-FF 交换机转发到所有口
三层广播 主机位全 1 路由器不转发

第一行是「链路层广播」:交换机收到目的 MAC 为全 F 的帧,就往除来源口以外的所有口转发。 所以「广播一次」在物理上就是「复制 N 份」——这就是 3.2.5 那个「10 跳 1024 份」的机制来源。 第二行是「网络层广播」:路由器默认不转发 255.255.255.255 和「定向广播」, 所以广播天然被限制在一个广播域里。 「定向广播」指的是「发给某个远端网段的广播地址」, 它默认被关掉,因为它可以被用来做「放大攻击」——发一个包,换回一整个网段的回应。

三、为什么要缩小广播域

广播的代价是「按人数放大」:

网段大小 一次广播的份数 1000 次广播
/24(254 台) 254 25.4 万帧
/16(6.5 万台) 65534 6553 万帧

第二行那个「6553 万帧」是灾难性的:因为广播会占用所有主机的 CPU 和所有链路的带宽, 而且「广播引发的回应」也可能是广播。这就是「广播风暴」的量级。 所以「缩小广播域」有两个标准手段:一是划子网(让每个广播域只装几百台), 二是划 VLAN(在同一个物理网络上切出多个广播域)。 两者做的都是「让广播走不出去」。 区别在「子网是三层概念、VLAN 是二层概念」——一个靠路由器隔离,一个靠交换机打标签。 还有一个「替代方案」值得知道:多播。 IPv4 的广播「谁都收」,多播「订阅了才收」。 所以「能改成多播的广播,就该改成多播」——这也是 IPv6 干脆取消广播、全用多播的原因。

四、动手 Demo:广播地址是「主机位全 1」

算四个网段的网络地址、广播地址和可用主机数。 注意第二行:/25 的广播地址也是 .255,但它的网络只是上半段。

import ipaddress
for cidr in ('192.168.3.0/24', '192.168.3.128/25', '172.16.5.0/28'):
    n = ipaddress.ip_network(cidr)
    print('%-18s 网络 %-15s 广播 %-15s 可用 %d'
          % (cidr, n.network_address, n.broadcast_address,
             n.num_addresses - 2))

实跑输出:

--------------------------------------------------------------------
广播地址是「主机位全 1」
--------------------------------------------------------------------
**广播地址就是「这个网络里所有主机的共同代号」。**
**算法很机械:把主机位全部写成 1。**

  网段                 网络地址          广播地址           可用主机
  -------------------------------------------------------------------
  192.168.3.0/24       192.168.3.0       192.168.3.255      254
  192.168.3.128/25     192.168.3.128     192.168.3.255      126
  10.0.0.0/8           10.0.0.0          10.255.255.255     16777214
  172.16.5.0/28        172.16.5.0        172.16.5.15        14

**第二行 192.168.3.128/25 的广播地址是 .255**:
**因为 /25 把这段从中间切开,上半段的主机位只有 7 位**,全 1 就是 127 加 128 得 255。
**所以「同一个 /24 里,两个 /25 各有自己的广播地址」**——**广播不会跨过子网边界。**
**这正是「缩小广播域」的手段**(和 3.2.6 的 VLAN 是同一个目的)。

**本机是 192.168.3.152/24**,算出三个关键值:
**网络地址 192.168.3.0、广播地址 192.168.3.255、可用范围 192.168.3.1 到 192.168.3.254**

**广播帧的 MAC 是 FF-FF-FF-FF-FF-FF**:
**交换机收到它就往所有口转发**——
**所以「广播太多」会直接吃掉交换机的转发能力(3.2.5 的广播风暴)。**

本机的广播地址可以直接算:192.168.3.152/24 的广播是 192.168.3.255, 所以「同网段的所有设备」都在这个地址的覆盖范围内。 这也解释了为什么「换个网段就搜不到打印机」——因为发现打印机的广播走不出子网。 「广播地址不能分配给主机」这条规矩有个奇怪的后果: 一台机器如果把 IP 配成了广播地址,它就连不上网,而且报错信息往往很含糊。 这类「配置合法但语义错误」的问题最难查——系统不会报错,只是不通。 最后说清「255.255.255.255 和定向广播的区别」:前者是「本网段广播」,永远不跨路由器; 后者是「发给远端网段的广播地址」,默认被路由器丢弃。 所以「我在家里发个广播能不能找到公司打印机」的答案是「不能」——广播天生出不了门。

30 秒实验

  1. 算一下:172.16.5.0/28 的可用范围是哪几个地址?
  2. 想一下:为什么「定向广播」默认被路由器关掉?
  3. 想一下:同一台交换机上两个 VLAN,广播会互相打扰吗?

常见误区

  1. 以为「广播地址能给某台主机用」。 不能,它是「所有主机的共同代号」。
  2. 以为「广播能跨路由器」。 默认不转发,所以广播域就是子网的边界。
  3. 以为「二层广播和三层广播是一回事」。 前者靠 MAC 全 F,后者靠主机位全 1,层次不同。
自测三问(点开对答案) 1. 广播地址怎么算? —— **把主机位全部写成 1**。比如 /24 的 .255、/28 的 .15。 2. 为什么广播不会跨子网? —— **路由器默认不转发广播**,所以广播域等于子网边界。 3. 二层广播用什么地址? —— **FF-FF-FF-FF-FF-FF**,交换机收到就往所有口转发。

下一节看多播:比广播省得多的「一对多」。

相关笔记