IP 地址的表示
IPv4 的地址有 32 位长,一般以 8 位一组换成十进制,中间以点分割。
点分四组 | 二进制 |
---|---|
0.0.0.0 | 00000000 00000000 00000000 00000000 |
1.2.3.4 | 00000001 00000010 00000011 00000100 |
IPv6 增大了地址长度,有 128 位长,一般将 16 位为一组,以冒号分割。但仍然很长,所以有一些简化的表示法:
- 全零的块用 :: 代替,但只能用一次,用在影响最大的地方。
- 一个块中前导的 0 需要省略,例如 ::008d 要变成 ::8d。
- a 到 f 用小写表示。
IP 地址结构
分类
IPv4 中最初将地址分为五类,将不同大小的 IP 地址空间分配给不同的站点。这五类根据高序位来标识。
类 | 地址范围 | 高序位 | 用途 |
---|---|---|---|
A | 0.0.0.0 - 127.255.255.255 | 0 | 单播/特殊 |
B | 128.0.0.0 - 191.255.255.255 | 10 | 单播/特殊 |
C | 192.0.0.0 - 223.255.255.255 | 110 | 单播/特殊 |
D | 224.0.0.0 - 239.255.255.255 | 1110 | 组播 |
E | 240.0.0.0 - 255.255.255.255 | 1111 | 保留 |
其中 ABC 类网络号依次为 8、16、24 位,剩余的作为主机号。
一般每个网段中第一个和最后一个不作为单播地址。第一个一般用于表示一个网段,最后一个作为广播地址。
子网
当有一个网络号后,在网络内部会划分为多个子网,所以 IP 地址可以分为如下格式:
然而子网的划分并没有规定,是由网络管理员自行设定的,为了使设备知道哪些是子网号,引入了 子网掩码。前导位均为 1,之后均为 0,一般将 1 的个数记为 /x,例如 255.255.255.0 可以记为 /24。这样就可以与 IP 地址进行与操作就可以得到网络前缀,与子网掩码的反码进行与操作就可以得到主机号。这样对于 IP 地址为 123.234.22.11,掩码为 255.255.255.0 的主机,子网为 123.234.22.0/24,主机号为 11。
子网掩码中 1 的数量不一定为 8 的整数倍,也就是说并不一定分隔子网可以直接通过观察 IP 地址中某一段是否一样来判断。例如 192.168.1.1 与 192.168.2.1 在掩码为 /24 下为两个子网,在 /22 下为一个子网。
利用子网掩码,可以将其取反再与地址进行或操作,就可以得到 广播地址,会发送给子网中所有的主机。
CIDR
之前可以看到网络地址被分为五类,然而这并不适合网络的分配。比如 A 类能有 \(2^{24}\) 个主机过大,C 类只有 \(2^8\) 个主机过小,对于中等规模的有极大的浪费。所以引入了 CIDR(Classless Interdomain Routing, 无类别域间路由选择),可以看成子网的推广,同样具有 a.b.c.d/x 的格式,x 表示前缀的长度。之前 A 类可以用前缀 /8,B 类用 /16 表示。
聚合
之前通过子网可以了解到,外界其实并不关心主机号,只有到了子网边缘的那台路由器才会负责向子网内分发数据。利用 CIDR 可以将这一思想推广到整个互联网中,以方便传输数据,这种方式称为 聚合。
例如 124.88.66.0/24 的数据可以先传输到 124.88.0.0/16 的路由器,再由它在 124.88.0.0/16 的网段中传输到 124.88.66.0/24 的路由器,再向子网中传输。对于 124.88.0.0/16 的路由器还可以接收 124.88.196.0/24、124.88.12.0/18 等等的数据,这对于上层路由器来说,整个 124.88.0.0/16 的网段只用一条记录,所以路由表可以变得很小。实际生活中往往地址按块分配个 ISP,所以这个过程可以看作将数据发送给 ISP,再由 ISP 发个客户。