wzyboy’s blog

wzyboy's blog

马上订阅 wzyboy’s blog RSS 更新: https://wzyboy.im/feed.xml

IPv6 学习笔记

2023年8月23日 06:17

说来惭愧,我直到最近,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 公司分得了...

剩余内容已隐藏

查看完整文章以阅读更多