我非常了解 IPv4,但我从来没有使用过 IPv6,也从来没有真正上过有关它的课程或阅读有意义的文档。
任何人都可以为 IPv4 管理员指出 IPv6 的一个很好的介绍(在线或在书中)。我主要是 Windows 而不是 UNIX,但我可以遵循大多数 UNIXy 解释。
jj3*_*j33 39
去年,当我们的一些工程师被要求将 IPv6 地址放入 DNS 时感到困惑时,我将其作为内部参考文件写了下来。我没有专门解决 DNS,但大多数问题似乎都围绕着地址的格式,而不是“了解”它们是如何工作的。也许它对其他人也有用:
所以,首先要承认的是 IPv6 地址看起来很难看。他们是这样。
但我认为那只是因为我们不习惯与它们打交道,而且我们在非常低的层次上不理解它们的含义,就像我们处理 IPv4 地址一样。我认为适应他们需要一段时间,但我们必须从某个地方开始。
要记住的另一件重要事情是 IPv4 地址是 32 位数字,而 IPv6 地址是 128 位数字。当路由器路由或防火墙过滤时,它们会根据该数字进行过滤。一个人如何选择显示这个数字是完全任意的,而且大多只是传统。所以这整封电子邮件解释了人类如何选择表示这些数字——机器不在乎,这对他们来说都是一点点。
IPv4 地址是 32 位或四个字节。我们认为的“真实”IP 地址只是表示该位串的标准方法,将这些位分成 4 个 8 位组,将每个 8 位表示为一个十进制数,并将这些十进制数分开一段时间。因此,取随机 IP 地址 172.30.154.249。当路由器“考虑”这个IP地址时,它真的是这样想的:
10101100000111101001101011111001
Run Code Online (Sandbox Code Playgroud)
我们可以将其翻译成我们自己的形式:
10101100 = 172
00011110 = 30
10011010 = 154
11111001 = 249
Run Code Online (Sandbox Code Playgroud)
有时您可能还会看到这些写成纯十进制数:
10101100000111101001101011111001 = 2,887,686,905
Run Code Online (Sandbox Code Playgroud)
几乎没有人故意使用这种形式(*),但它是编写 IPv4 地址的历史上有效的方式。事实上,这种形式在 1982 年定义 SMTP 的 RFC821 中使用。如果您想手动将邮件路由到特定机器而不是使用 DNS,您可以使用两种不同类型的文字。第一个是括号中熟悉的“虚线四边形”形式(“user@[172.30.154.249]”)。第二个是使用以井号为前缀的 IP 的十进制形式(“user@#2887686905”)。
以上所有内容只是提供一个框架,用于将您对 IPv4 地址如何工作的知识转换为 IPv6 地址。正如 IPv4 是 32 位数字一样,IPv6 地址是 128 位数字。ARIN 为 MY AWESOME COMPANY(**) 分配了 IP 范围 2311:FD67/32。为了有一个可以使用的示例,我将使用 IP 2311:FD67::AC1E:9AF9。
所以,这里是代表那个 ip6 的位串:
00100011000100011111110101100111000000000000000000000000000000000000000000000000000000000000000010101100000111101001101011111001
Run Code Online (Sandbox Code Playgroud)
如果我们以我们处理 IPv4 位串的方式表示这些位串(将每个 1 字节的块转换为十进制,用句点分隔每个块),我们将得到以下结果:
35.17.253.103.0.0.0.0.0.0.0.0.172.30.154.249
Run Code Online (Sandbox Code Playgroud)
这有几个问题。第一个是它看起来像一个时髦的 IPv4 数字,这并不好,您需要一种可靠的方法来区分它们。另一个是它有很多信息,很多数字,还有很多空白。因此,通过使用不同的分隔符(冒号(:) 而不是句点(.))和以十六进制而不是十进制表示字节来解决这两个问题。IPv4 分隔 8 位块,以十进制表示,带句点,IPv6 分隔 16 位块,用冒号分隔。下面是我们的 IPv6 示例 IP 的细分:
0010001100010001 = 2311
1111110101100111 = FD67
0000000000000000 = 0
0000000000000000 = 0
0000000000000000 = 0
0000000000000000 = 0
1010110000011110 = AC1E
1001101011111001 = 9AF9
2311:FD67:0:0:0:0:AC1E:9AF9
Run Code Online (Sandbox Code Playgroud)
这其中仍然有很多空白,因此允许最大的零字符串可以省略并用双冒号表示。所以,上面的IP可以写成:
2311:FD67::AC1E:9AF9
Run Code Online (Sandbox Code Playgroud)
我没见过很多,但据我所知,还有一个简洁的约定,允许将最后 32 位写为带前缀的点分四组,以便在从 IPv4 迁移到 IPv6 时轻松识别旧地址. 因此,您可能已经注意到我的 IPv6 示例地址以完全包含我的 IPv4 示例的相同 32 位结尾。当您以这种风格写作时,这尤其有用。在这种情况下,我的 IPv6 地址将如下所示:
2311:FD67::172.30.145.249
Run Code Online (Sandbox Code Playgroud)
为了回到我开始使用 IPv6 的地方,我提到我们被分配了 2311:FD67/32。/32 是位掩码,就像在 IPv4 地址中一样。这实质上意味着我们已经静态分配了我们可以创建的 IPv4 地址中 128 位中的前 32 位。由于 2311:FD67 是 32 位,这意味着我们从该范围创建的每个 IP 地址都将从该范围开始。
换句话说,就像 172.17/16 可以被认为是“172.17.0.0 和 172.17.255.255 之间的每个 IP”一样,2311:FD67/32 可以被认为是“2311:FD67:0:0 之间的每个 IP: 0:0:0:0 和 2311:FD67:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF”。
我认为我们还需要很长时间才能开始迁移到 IPv6,但我希望这个解释能帮助您更舒适地使用和参考它们。
同样,理解我在这里谈论的唯一一件事就是如何写下 IPv6 地址真的很重要。似乎有很多智能内置于路由等的编号方案中,我还没有真正掌握,所以我现在只能解决它的外观=)。
(*) 我以前在一些软件调试中看到过十进制 IPv4 表示,但我几乎肯定这是一个错误或懒惰,我认为在 C 代码中快速打印 32 位整数比它更容易格式化一个虚线四边形以进行打印。
(**) 我修改了我的公司名称和前缀