关于 IP地址 的那些事

前言

  连接到 Internet 的每个设备至少有一个 IP 地址,但 IP 地址通常被 DNS 挡在我们的视线之外,DNS 让我们习惯使用名称而不是数字地址,有时候我们会自己建立网站(比如这个 blog 的搭建)或者 DNS 莫名失效的时候,我们需要直接处理 IP 地址,那么对于 IP 地址的学习就显得尤为重要了。

IP 地址

IPv4 地址

  有些 IP 地址是大家比较熟悉的,比如 192.168.0.1 (本地局域网 IP 地址),这个地址的表现就是我们现在最流行的地址类型: IPv4 地址。这些地址通常采用点分四组或点分十进制表示法。每个数字都是一个非负整数,范围是[0,255]

点分四组 二进制
0.0.0.0 00000000 00000000 00000000 00000000
1.2.3.4 00000001 00000010 00000011 00000100
10.0.0.255 00001010 00000000 00000000 11111111
255.255.255.255 11111111 11111111 11111111 11111111

  从上表中可以看出 IPv4 的地址长度是 32 位的。

IPv6 地址

  IPv6 的地址长度是 128 位的,是 IPv4 的 4 倍。IPv6 地址的传统表示方式称为字段的四个十六进制数,这些被数由冒号分隔,比如:5f05:2000:80ad:5800:0058:0800:2023:1d71

  而且还有一些取得共识的 IPv6 地址简化表示法「RFC4291」:

  • 一个块中最前面的 0 可以省略
  • 全 0 的块可以省略,用 :: 代替。为了避免出现歧义,一个 IPv6 中::只能出现一次。
  • 在 IPv6 中嵌入 IPv4 可使用混合符号,紧接着 IPv4 的地址快的值为ffff,地址的其余部分用点分四组格式。比如:::ffff:10.0.0.1 可表示 IPv4 的10.0.0.1,而它被称为 IPv4 映射的 IPv6 地址。
  • IPv6 地址的低 32 位通常采用点分四组格式。所以 ::0102:f001相当于::1.2.240.1 它被称为 IPv4 兼容的 IPv6 地址(现在不再需要)
十六进制表示 二进制表示
5f05:2000:80ad:5800:0058:0800:2023:1d71 0101111100000101 0010000000000000
1000000010101101 0101100000000000
0000000001011000 0000100000000000
0010000000100011 0001110101110001
::1 0000000000000000 0000000000000000
0000000000000000 0000000000000000
0000000000000000 0000000000000000
0000000000000000 0000000000000001

  因为有冒号的存在,有时候我们需要 IP 地址和端口号一起出现的时候,就会有歧义,这个时候,我们用[]隔开,例如:http://[5f05:2000:80ad:5800:0058:0800:2023:1d71]:443/,指的就是 IPv6 主机 5f05:2000:80ad:5800:0058:0800:2023:1d71 中的端口号443 使用 HTTP、TCP 和 IPv6 协议。

  刚刚提到的「RFC4291」会造成不必要的混淆——能用多种方式表现相同的 IPv6 协议——为了弥补这些情况,「RFC5952」制定了一些规则,以缩小范围:

  • 块前面的 0 必须压缩
  • ::只能用于最多 0 的情况,并且这不是只针对 16 位的块,如果多个块有等长度的 0 ,顺序靠前的块会被替换成::
  • a 到 f 的十六进制数用小写表示

基本的 IP 地址结构

  IPv6 和 IPv4 的地址个数是相当多的,它们可以方便的将地址空间分成块。IP 地址可根据类型和大小分组。

  大多数 IPv4 地址块最终被细分为一个地址,用于识别连接 Internet 或某些专用的内联网的计算机网络接口。这些地址被称为单播地址

  IPv4 大部分是单播地址,而 IPv6 地址还有大部分没有使用。除了单播地址,还会有广播组播任播地址,它们可能涉及多个接口。

  接下来让我们了解一下 IP 地址的历史演变

分类寻址

  暂时搁置

参考

TCP/IP详解 卷1:协议