📚 第五章 IP协议相关技术
📄 一句话概括

ARP 的核心是「广播问、单播答、双方都缓存」,缓存时间约 20 分钟。 它没有认证,所以可以被伪造——这就是 ARP 欺骗的根源。

📝 本节和前面几节的关系

5.3.1 讲了梗概,这一节讲机制细节和它的漏洞。 3.2.4 的「交换机学 MAC」是同一类「听出来的表」,可以对照。

一、完整流程与两个细节

流程在 5.3.1 讲过,这里补两个常被忽略的细节:

细节 做什么 为什么
请求里带自己的 IP-MAC 应答方顺便缓存 省一次反向查询
应答前先查表 已有记录就不重复广播 减少广播量
免费 ARP 开机时广播一次自己的地址 检测地址冲突

第一行是「顺手」的设计:请求报文里就写了「我是 192.168.3.152,MAC 是 xx」, 所以对方不用再问一遍。 这种「把信息塞进请求」的做法在协议设计里很常见。 第三行「免费 ARP」名字有点误导: 它不是「免费」,而是「不请自来」——开机时广播一句「我要用这个地址了,有人占着吗」。 没人回应就说明地址能用,有人回应就是地址冲突。

二、广播量怎么算

ARP 是广播,所以它的开销随主机数平方增长:n 台主机两两通信,最坏要 n 乘(n 减 1)次请求。

主机数 两两对数 加上应答的报文数
10 90 180
100 9900 19800
254 64262 128524

第三行那个 12 万看着吓人,实际不会发生——因为有缓存,「同一对主机」在 20 分钟内只问一次。 但「一个 /24 里塞 254 台机器 + 大量新设备上线」时,广播确实会明显拖慢网络。 所以「划 VLAN 切小广播域」不是洁癖,是必要手段: 把 254 台拆成 4 个 /26,广播量直接降到四分之一。

三、它没有认证,这是个大问题

ARP 报文里没有任何「证明我是我」的东西:谁发的、内容对不对,全靠自觉。 所以「伪造一个 ARP 应答」是极其容易的事。

攻击 怎么做 后果
ARP 欺骗 冒充网关的 MAC 流量被中间人接管
ARP 扫描 逐个探测网段 暴露在线设备
ARP 洪水 塞满交换机的表 交换机退化成集线器

第一行是局域网里最常见的攻击: 你只要广播一句「192.168.3.1 的 MAC 是我」,整个网段的人就会把网关流量发到你机器上。 而受害者「看不出来」——网页照常打开,只是慢了。 防御手段有三种:静态 ARP 绑定(手工,麻烦)、DAI(动态 ARP 检测,交换机上做)、 以及「加密通信」(就算被截也看不懂)。 最后一条最根本——所以 HTTPS 比「防 ARP 欺骗」更重要。

四、动手 Demo:ARP 广播有多少,算一下就明白

把「主机数」和「两两对数」摆在一起,看广播量为什么是平方增长。 最后一列是把请求和应答都算上的报文数。

for n in (10, 100, 254):
    q = n * (n - 1)
    print(n, q, q * 2)

实跑输出:

--------------------------------------------------------------------
ARP 广播有多少,算一下就明白
--------------------------------------------------------------------
**ARP 是广播,广播域里所有人都要处理。**
**所以「ARP 多了会拖慢网络」不是玄学,是可以算的。**

  主机数     两两通信的对数     ARP 请求数     加上应答的报文数
  --------------------------------------------------------------
  10         90                 90             180
  100        9900               9900           19800
  254        64262              64262          128524

**第二列是 n 乘(n 减 1)**:**每两台之间都可能要互相问一次。**
**所以 254 台的一个 /24 网段,最坏情况要 128524 个 ARP 报文。**
**这就是「广播域不能太大」的量化理由**:**对数是平方增长,主机数翻十倍,广播量翻一百倍。**

**实际不会这么糟,因为有缓存**:
**ARP 表项一般缓存 20 分钟左右,所以「同一对主机」在一段时间内只问一次。**
**算一下刷新频率**:
**20 分钟等于 1200 秒,一天 72 个周期**——**也就是每条表项每天要重新学 72 次。**

**这也解释了一个老经验**:
**「一个大二层网络里塞几千台机器,网络会莫名变慢」**——
**不是带宽不够,是广播和 ARP 把交换机的 CPU 和链路占满了。**
**解决办法是「划 VLAN 切小广播域」,不是「换更快的交换机」。**

n * (n - 1) 这个式子要理解成「有序对」:A 问 B 和 B 问 A 是两次, 所以要乘 2 才是「报文总数」。 如果只算「无序对」,那就是 n 乘(n 减 1)再除以 2。 「平方增长」这四个字是「广播域不能太大」的数学依据:主机数翻 10 倍,广播量翻 100 倍。 所以「一个大二层网络塞几千台机器会莫名变慢」不是玄学,是这条曲线在起作用。 实际网络不会这么糟,因为缓存:20 分钟的有效期意味着「同一对主机」一天最多问 72 次 (86400 除以 1200)。 所以真实的广播量是「主机数 × 活跃对数 × 每天次数」,比最坏情况小几个数量级。

30 秒实验

  1. 算一下:一个 /26(62 台)的广播量是 /24 的几分之一?
  2. 想一下:为什么「免费 ARP」能检测地址冲突?
  3. 想一下:ARP 欺骗为什么「受害者看不出来」?

常见误区

  1. 以为「ARP 有认证机制」。 没有,所以欺骗极其容易。
  2. 以为「ARP 表是交换机维护的」。 是每台主机自己维护的,交换机维护的是 MAC 表。
  3. 以为「广播多了只是浪费带宽」。 还浪费 CPU,每台设备都要处理每个广播。
自测三问(点开对答案) 1. ARP 请求里为什么要带上自己的 IP 和 MAC? —— **让对方顺便缓存**,省掉一次反向查询。 2. 什么是免费 ARP? —— **开机时广播一次「我要用这个地址」**,用来检测地址冲突。 3. ARP 欺骗为什么容易得手? —— **ARP 没有认证**,谁都可以声称「这个 IP 的 MAC 是我」。

下一节回答一个老问题:为什么两个地址都得留。

相关笔记