前言
连接到 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 地址的历史演变
分类寻址
暂时搁置