IPv6 学习笔记
说来惭愧,我直到最近,2023 年了,才终于正式用上了原生 IPv6 网络(之前只用过 Hurricane Electric 和 Cloudflare 的隧道)。十几年根深蒂固的 IPv4 思维让我在了解和学习 IPv6 的过程中充满了惊奇和欣喜。响应「整理是最好的复习」号召,我决定将我学到的知识整理成这篇博客文章。
本文试图用小黄鸭也能听懂的方式,从较为简单的 IPv4 基础知识开始由浅入深地讲到 IPv6。
一、IP 地址的写法
IPv4
IP 地址对于计算机来说是一串 0 和 1 组成的二进制数字。IPv4 地址是 32 bit 的,即由 32 个 0 和 1 组成。对于人类来说,常用的写法是把这 32 个 bit 分成 4 组,每组 8 bit,转成十进制,中间用点隔开——即所谓的「点分十进制」。因为每组是 8 bit,所以每个十进制数字的范围在 0 到 255 之间。
比如 Google 的 IPv4 地址(之一):
142.251.215.238
点分十进制用对人类比较友好的方式,简明地表达了从最小的 0.0.0.0 到最大的 255.255.255.255 一共 42 亿个地址。
一群计算机组成一个网络,这个网络中最小的地址用来表示这个网络本身。比如以下 256 个地址组成了一个网络:
142.251.215.0
142.251.215.1
142.251.215.2
...
142.251.215.253
142.251.215.254
142.251.215.255
……则用 142.251.215.0 表示这个网络本身。
CIDR 用来简明地表示一个 IP 地址与其在的网络的关系。上述网络中的某个地址 142.251.215.42 可以表示为:
142.251.215.42/24
其中 /24 代表前缀长度。在这个例子的 256 个地址中,点分十进制的前三段都是相同的,变化的只是最后一段。前三段每段是 8 bit,总共是 24 bit 用于表示网络,因此前缀长度是 /24。前缀长度越大,固定的 bit 越多,变化的 bit 越少,这个网络就越小。此处前缀长度是 /24,则可变的部分是 8 bit,总共 256 个地址,符合预期。
在 IPv4 中,用 CIDR 可以表示从 /0 到 /32 各种大小的网络,其中 /0 代表整个 IPv4 地址空间,/32 代表大小为 1 的网络。
IPv6
IPv6 地址的写法与 IPv4 不同,似乎没有一个专门的名称。硬要和 IPv4 对应的话,我会把它叫作「冒号分隔的十六进制」。IPv6 地址是 128 bit 的,长度是 IPv4 地址的 4 倍,人类将其分成 8 组,每组 16 bit,转成十六进制数字,再用冒号隔开。
比如 Facebook 的 IPv6 地址(之一):
2a03:2880:f101:0083:face:b00c:0000:25de # 注意其中有 face:b00c 这样的彩蛋
每段开头的零可以省略,并且连续的全部是零的段可以用双冒号省略,比如:
2001:0db8:0000:0000:0000:0000:0000:0042
……可以简写成
2001:db8::42
CIDR 的写法与 IPv4 是一样的,即在地址后面加上斜线和数字代表前缀长度。由于 IPv6 有 128 bit,所以前缀长度从 /0 到 /128 不等。
二、IPv4 与 NAT
IPv4 地址由 32 个 bit 组成,所以总地址空间是 2³²,约等于 42 亿,去掉一些保留地址,实际可用的数量要少一些。理想环境下,每台能上网的设备都应该分到一个 IP 地址,但现在全球网民数量都不止 42 亿,更别提很多人还有多个上网设备,还有很多非人类的上网设备(IoT),所以这 42 亿地址是肯定不够用的。为了解决这个问题,人类发明了 NAT 这种邪恶的存在。
在理想世界里,每个家庭根据上网设备的数量分到一个对应大小的网络,家庭网络管理员把将这个网络里的地址分发给各个上网设备使用。在互联网的田园时代,当年的网民们就是这么分的。比如 1990 年时候 Apple 公司分得了...
剩余内容已隐藏