IP地址详解

穷则独善其身,达则兼善天下。

—— 战国·孟子·《孟子》

每个使用 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

小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注:

【小菜学网络】系列文章首发于公众号【小菜学编程】,敬请关注: