判断一个地址属于第几层,看它「能管多远」就够了。 MAC 管一段链路、IP 管整个互联网、端口号只管一台主机内部。
4.1.1 讲了「两层分工」,这一节把「地址」这件事单独拎出来看。 它也是理解「为什么 IPv6 要 128 位」的入口。
一、长度和范围成正比
三种地址排在一起:
| 地址 | 长度 | 管辖范围 |
|---|---|---|
| MAC | 48 位 | 一段链路 |
| IP | 32 位 | 整个互联网 |
| 端口号 | 16 位 | 一台主机内部 |
第一行和第三行是两个极端:MAC 只管一段链路,端口号只管一台机器里的一个程序, 而 IP 管到地球另一端。 位数刚好也是「中间大两头小」——这不是巧合,是「管得越宽,要编的号越多」。 但要注意「端口号 16 位」为什么够用:它只在「一台主机内部」区分程序,65535 个就绰绰有余。 如果要求「全球唯一」,16 位早就不够了——所以「位数够不够」永远要相对「作用域」来说。
二、为什么 IP 要管这么宽
因为它要解决的是「跨网络」的问题: 两台设备如果不在同一个网络里,MAC 根本看不到对方—— 它们之间隔着路由器,而路由器不转发「只带 MAC 的帧」。 所以必须有一个「跨网络也能用」的地址,这就是 IP。 它的设计目标是「唯一标识一台主机在互联网里的位置」,而不是「唯一标识这块网卡」。 这个区别带来一个后果:设备换位置,IP 就要换;但 MAC 不用换。 所以「IP 是位置、MAC 是身份」这个类比是很准的。 还有一层意思:IP 地址不是「设备的属性」,是「接口的属性」。 一台路由器有多个接口,就有多个 IP——所以「一台机器一个 IP」这个印象是错的, 本机既有 127.0.0.1,也有 192.168.3.152。
三、128 位为什么不算浪费
把两个地址空间算一遍:
| 版本 | 位数 | 地址数 |
|---|---|---|
| IPv4 | 32 | 约 43 亿 |
| IPv6 | 128 | 约 3.4 乘 10 的 38 次方 |
第二行那个数大到没有直觉:它能切出 1.8 乘 10 的 19 次方个 /64 网段, 摊到地球 5.1 亿平方公里的表面上,每平方米能分到 3.6 万个。 所以「128 位是不是太多了」这个问题,答案是「按需算完全不多」。 一个 /64 里要装 1.8 乘 10 的 19 次方台设备,这个「每网段大到用不完」的设计是故意的。 因为「地址自动配置」需要「接口标识占满 64 位」,而 64 位正好能放进 MAC 地址(EUI-64)。 所以位数不是「估算出来的」,是「结构决定的」。 顺带说一句「为什么不是 64 位」:如果只有 64 位,前半 32 位做网络、后半 32 位做主机, 每个网段只能装 43 亿台,对「给每盏路灯编号」这种场景是够的,但「浪费一点换简单」更划算。 工程上,「够用到永远不用再改」比「刚好够用」值钱得多。
四、动手 Demo:IP 是第 3 层地址,MAC 是第 2 层地址
把三种地址的长度与作用域摆在一起,再算一遍 IPv4 与 IPv6 的差距。 注意最后一个数:每平方米能分到 3.6 万个 /64 网段。
v4, v6 = 2 ** 32, 2 ** 128
print('IPv4 %d 个,IPv6 %.2e 个' % (v4, v6))
print('比值 %.2e' % (v6 / v4))
print('IPv6 能切 %.2e 个 /64 网段' % (v6 / 2 ** 64))
print('每平方米 %.0f 个' % (v6 / 2 ** 64 / 5.1e14))
实跑输出:
--------------------------------------------------------------------
IP 是第 3 层地址,MAC 是第 2 层地址
--------------------------------------------------------------------
**同一个地址「属于第几层」,看它「能管多远」就够了。**
**MAC 只管一段链路,IP 管到地球另一端。**
地址 长度 管辖范围
------------------------------------------------
**MAC 地址** **48 位** **一段链路**
**IP 地址** **32 位** **整个互联网**
端口号 16 位 **一台主机内部**
**地址长度和管辖范围是正相关的**:**管得越远,要编的号越多,位数就越长。**
**所以「IPv6 用 128 位」不是浪费,是「要给地球上每一粒沙子编号」的代价。**
**算一下两个地址空间差多少**:
**IPv4 有 4294967296 个(约 43 亿),IPv6 有 3.40e+38 个。**
**两者相比得 7.92e+28**——**也就是说,每一个 IPv4 地址,对应着 8 后面 28 个零个 IPv6 地址。**
**换个更实在的算法:IPv6 能切出 1.84e+19 个 /64 网段,而地球表面积约 5.1 亿平方公里。**
**摊下来每平方米能分到 36170 个 /64 网段**——**一个 /64 里又能装 1.8e19 台设备。**
**所以结论只需要记一句:**
**IPv6 的地址不是「够用」,是「根本用不完」。**
「每平方米 3.6 万个 /64」这个数值得记住: 它说明 IPv6 的设计目标不是「够用」,是「永远不用再数地址」。 这背后有个教训:IPv4 当年也觉得「43 亿够用一辈子」, 结果 30 年就分完了——因为「每人一台电脑」变成了「每人十个设备」。 「一个接口一个 IP」这件事在 IPv6 里更明显: 一台机器同时有链路本地地址、全局地址、临时地址, 所以「我的 IP 是多少」这个问题在 IPv6 下要反问「你要问哪一个」。 这不是设计混乱,是「不同用途用不同地址」的分工。 最后补一个常见误解:「IP 地址唯一」只在「同一时刻、同一个作用域内」成立。 私有地址 192.168.3.152 在全球有几百万个, 但它们不在同一个「公网作用域」里——所以「唯一」这件事永远要加限定词。
30 秒实验
- 算一下:2 的 64 次方大约是多少?
- 想一下:为什么 IPv6 把接口标识定成 64 位,而不是 48 位?
- 在你电脑上看一眼有几个 IP 地址(ipconfig)。
常见误区
- 以为「一台机器只有一个 IP」。 一个接口一个 IP,一台机器常常有好几个。
- 以为「MAC 短所以只能管本地」。 MAC 是 48 位,比 IP 的 32 位长, 限制在本地是因为不可聚合。
- 以为「IPv6 的 128 位是浪费」。 它是结构决定的:接口标识占满 64 位才能自动配置。
自测三问(点开对答案)
1. 怎么判断一个地址属于第几层? —— **看它「能管多远」**:MAC 管一段链路、IP 管全网、端口号只管本机。 2. 为什么 IP 地址不是「设备的属性」? —— **它是「接口的属性」**,一台路由器有几个接口就有几个 IP。 3. IPv6 为什么定 128 位? —— **为了让「前缀 64 位 + 接口标识 64 位」成立**,接口标识 64 位正好放得下 EUI-64。下一节看路由控制:包怎么知道该往哪走。
- ☐ (本节完,下一节 4.2.2 路由控制)