每个使用 IP 协议进行通信的实体,都需要分配一个地址,这就是我们所熟知的 IP 地址。
IP 地址由 4 个字节组成,共 32 位,理论上可以表示 $2^{32} = 4294967296$ ,即超过 42 亿台主机。这个数字虽然很大,如果为地球上每个人都分配一个,也还不够。
点分十进制表示法
我们熟悉的 IP 地址 172.16.254.1
由多个字符构成,而不是 4 个字节,这是为什么呢?为回答这个问题,我们需要深入考察 IP 地址结构,理解 点分十进制表示法 ( dotted decimal notation )。
IP 地址由 4 个字节构成,但不是每个字节都能用 ASCII 来显示。下面这个 IP 地址如果用 ASCII 来解读,有 2 个字节是非法字符,另外 2 个是 ASCII 中的控制字符,没一个能直接显示:
我们知道,一个字节有 8 位,可以表示从 0 到 255 的整数。因此,一个 IP 地址可以用 4 个十进制数来表示,每个数字各代表一个字节:
我们可以用若干个 ASCII 数字字符来表示一个十进制数,每个数之间额外插入一个英文句点,进一步增强可读性,这就是我们常用的 点分十进制表示法 :
注意到,原 IP 地址中的一个字节,可能需要多个 ASCII 数字字符来表示。此外,还要插入 3 个英文句点来分隔,总长度膨胀不少。因此,点分十进制存储效率和处理效率都不高,底层网络通信还是采用原本的二进制格式。
那么,如何将点分十进制法表示的 IP 地址,换算成二进制形式呢?我们只需将每个数字都换算成 8 个二进制位,再将所有的二进制位连接起来即可:
网络号和主机号
同一个网络中的主机,IP 地址都有相同的前缀。以上节讨论的网络拓扑为例:
左边网络的主机,IP 地址前缀都是 192.168.1
;右边网络的主机,IP 地址前缀都是 192.168.2
。根据这个特性,一个 IP 地址可以分为两部分:
- 网络号 ,即公共前缀部分,用于表示一个网络;
- 主机号 ,即剩余部分,用于表示该网络内的一台主机;
这个例子中,IP 地址前 3 个字节( 24 位 )为网络号,最后一个字节( 8 位 )为主机号。主机号长度为 8 比特的网络,理论上可以接入 $2^8=256$ 台主机。实际上,每个网络都有两个特殊的地址,不能分配:
- 主机号比特全为 0 ,是网络的起始地址,用于表示网络本身,一般称为 网络地址 ;
- 主机号比特全为 1 ,是网络的结束地址,用于向网络内的所有主机进行广播,一般称为 广播地址 ;
因此,一个主机号长度为 n 比特的网络,最多可以接入 $2^n-2$ 台主机。
IP地址分类
那么,是不是所有的 IP 地址,网络号都是 3 字节,主机号都是 1 字节呢?
答案肯定是否定的。不同的网络,规模有大有小。因此,网络号和主机号的长度,需要根据网络规模来确定。试想,如果主机号总是 1 字节,当一个网络内的主机超过 254 台时,该怎么办呢?
在网络技术兴起的早期,科学家们将 IP 地址划分为若干类:
A类地址
A 类地址第一位总是为 0 ,网络号总是 1 字节,主机号总是 3 字节,一般分配给 大型网络 。
- 前缀:
0
- 网络号可变位数:7
- 网络个数:$2^7 = 128$
- 每个网络支持的主机数:$2^{24}-2 = 16777214$ ,超过一千六百万;
- 地址范围:
0.0.0.0
~127.255.255.255
B类地址
B 类地址前两位总是 10
,网络号总是 2 字节,主机号总是 2 字节,一般分配给 中型网络 。
- 前缀:
10
- 网络号可变位数:14
- 网络个数:$2^{14} = 16384$
- 每个网络支持的主机数:$2^{16} - 2 = 65534$ ,超过六万五千;
- 地址范围:
128.0.0.0
~191.255.255.255
C类地址
C 类地址前三位总是 110
,网络号总是 3 字节,主机号总是 1 字节,一般分配给 小型网络 。
- 前缀:
110
- 网络号可变位数:21
- 网络个数:$2^{21} = 2097152$
- 每个网络支持的主机数:$2^8 - 2 = 254$ ;
- 地址范围:
192.0.0.0
~223.255.255.255
D类地址
D 类地址前四位总是 1110
,用于 多播通信 (后续章节介绍)。
- 前缀:
1110
- 地址范围:
224.0.0.0
~239.255.255.255
E类地址
E 类地址前四位总是 1111
,保留未用 。
- 前缀:
1111
- 地址范围:
240.0.0.0
~255.255.255.255
分类 | 前缀码 | 网络号位数 | 主机号位数 | 网络个数 | 每个网络的主机数 | 开始地址 | 结束地址 |
---|---|---|---|---|---|---|---|
A类地址 | 0 | 8 | 24 | 128 | 16777214 | 0.0.0.0 | 127.255.255.255 |
B类地址 | 10 | 16 | 16 | 16384 | 65534 | 128.0.0.0 | 191.255.255.255 |
C类地址 | 110 | 24 | 8 | 2097152 | 254 | 192.0.0.0 | 223.255.255.255 |
D类地址 | 1110 | - | - | - | - | 224.0.0.0 | 239.255.255.255 |
E类地址 | 1111 | - | - | - | - | 240.0.0.0 | 255.255.255.255 |
【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: