计算机网络:网络层 - IPv4地址
在酒店中,每个房间都有门牌号码,服务员送餐时,就可以根据门牌号码来判断一份餐要送到那个房间。
在网络中也是如此,一份数据发送到网络中,也要通过一个标识符来判断这个数据要发送到哪一台主机,而这个标识符就叫做IP地址
。
本博客讲解的IP地址
为IPv4
版本的IPv4地址
,其由32
个比特构成。
比如地址:00001010 11110000 00001111 10101010
,这样的地址太难记忆了,我们往往会把每八位分为一组,并写为十进制形式:
最后再用.
把每个数字分开,地址就变成了10.240.15.170
,这种记法称为点分十进制
。
IPv4地址
的编址方法经历了如下三个历史阶段:分类编址
,划分子网
,无分类编址
。
分类编址
在互联网发展早期采用的是分类的、两级结构的 IP 地址,由两个字段组成:
- 第一个字段是
网络号
,标志主机(或路由器)所连接到的网络 - 第二个字段是
主机号
,标志该主机(或路由器)本身
拥有相同网络号的主机,视为处于同一个网络中。那么现在的问题就是,得到一个IP地址
后,怎么判断哪一部分是主机号,那一部分是网络号呢?这是通过分类来实现的。
分类编址的IP地址
分为A、B、C、D、 E 五类:
地址的分类规则如下:
- 首先根据第一位比特位:第一位为
0
的地址,就是A
类地址;第一位为1
的地址包含B
,C
,D
,E
类地址。 - 再看第二位:当前两位为
10
,就是B
类地址;前两位为11
的地址包含C
,D
,E
类地址。 - 再看第三位:当前三位为
110
,就是C
类地址;前三位为111
的地址包含D
,E
类地址。 - 最后看第四位:如果前四位为
1110
,则为D
类地址;如果前四位为1111
,则为E
类地址。
每一种类型地址的网络号与主机号的位数,都是固定的
表格如下:
分类 | 网络号 | 主机号 | 最高位 |
---|---|---|---|
A类 | 8位 | 24位 | 0 |
B类 | 16位 | 16位 | 10 |
C类 | 24位 | 8位 | 110 |
而D
类和E
类地址比较特殊:
D
类地址是多播地址,最高4位固定为1110
。E
类地址是保留地址,最高4位固定为1111
。
只有A
,B
,C
类地址可以分配给网络中的主机和路由器。
接下来我们来详谈A
,B
,C
三类地址:
A类地址:
在A
类地址中,包含8
位网络号与24
位主机号,如下:
对于网络号部分,A
类地址包含从00000000
到01111111
的网络号,即[0, 127]
。
这些网络号被分为三部分:
0
:网络号为00000000
的地址,被保留下来,不会给主机使用[1, 126]
:这一段网络号是可以指派个给主机正常使用的127
:即网络号01111111
,该网络号内部的所有地址,称为本地环回地址
,不给主机使用
我简单说明一下本地环回地址
,这是一个用于测试的地址,用于在同一台计算机上进行网络通信。比如说你写了一个程序,要通过网络在不同主机之间通信。如果你想要测试你的程序是否可以利用网络通信,此时就可以用本地环回地址
。
例如:当你开发一个网络应用程序,需要测试它是否能与服务器通信时,你可以使用本地环回地址来模拟这个过程。你可以在本地计算机上安装一个服务器,并使用本地环回地址 (127.0.0.1) 来连接到该服务器。这样,你就可以在不连接到实际网络的情况下测试你的应用程序。
现在聊完了网络号,再看看主机号:
对于可以指派的[1, 126]
区间的网络号,以网络号为123
为例,其主机号也分为三部分:
123.0.0.0
:即主机号为全0
,这个主机号不会分配给主机使用,而是用于标识这整个网络123.255.255.255
:即主机号为全1
,这个主机号也不会分配给主机使用,而是用于在网络内部进行广播,称为广播地址
其它
:只要主机号不为全0
或全1
,就可以给主机正常使用
对于A
类地址而言,每个网络中可以分配的IP
地址数为:
2 24 − 2 = 16777214 {\color{Red} 2^{24} - 2 = 16777214} 224−2=16777214
也就是一千六百七十多万个,其中-2
是要减去全0
和全1
的两个地址。
B,C类地址:
相比于A
类地址,B
和C
类地址的结构非常简单,因为B
和C
类地址中不用考虑本地环回地址,也没有被保留的地址。
以B
类地址为例:
对于网络号:B
类和C
类地址的所有网络号都可以分配,没有特殊的网络号。
比如对于B
类地址,其最小可分配的网络号为10000000 00000000
,即128.0
;而其最大可分配的网络号为10111111 11111111
,即191.255
。
对于主机号:全0
的主机号表示本网络,全1
的主机号表示该网络的广播地址。
对于B
类地址而言,每个网络中可以分配的IP
地址数为:
2 16 − 2 = 65534 {\color{Red} 2^{16} - 2 = 65534} 216−2=65534
对于C
类地址而言,每个网络中可以分配的IP
地址数为:
2 8 − 2 = 254 {\color{Red} 2^{8} - 2 = 254} 28−2=254
接下来我汇总一下所有特殊的IP
地址:
网络号 | 主机号 | 是否可做源地址 | 是否可做目的地址 | 含义 |
---|---|---|---|---|
0 | 0 | 可以 | 不可以 | 代表本网络的本主机 |
0 | X | 可以 | 不可以 | 代表本网络的主机号为 X 的主机 |
全1 | 全1 | 不可以 | 可以 | 在本网络上广播 |
Y | 全1 | 不可以 | 可以 | 在网络号为 Y 的网络上广播 |
Y | 全0 | 不可以 | 不可以 | 表示网络号为 Y 的整个网络 |
127 | 非全0,非全1的任何数 | 可以 | 可以 | 本地环回地址 |
划分子网
接下来我们讲解IPv4地址
的第二个发展阶段,划分子网
。
在分类网络中,我们会存在地址浪费的问题,假设某个单位有300
个人,按照分类编址,请问要给这个单位划分哪一类的地址呢?
B
类网络中,每个网络含有的IP地址
数目为65534
,而C
类网络中,每个网络含有的IP地址
数目为254
。那么问题就来了:如果给这个单位C
类网络,IP地址
数目不够,如果给这个单位B
类网络,就会浪费掉六万多个IP地址
。
为了解决这种资源浪费的问题,IP地址
进行了划分子网
。
划分子网的思想就是:将一个大的网络,划分为更多个小的子网络。
此时IP地址
被划分为了网络号
,子网号
,主机号
三部分:
从上图的网络号可以看出,这是一个B
类地址,注意:子网划分
是建立在分类编址
之上的,所以网络号部分依然可以标识A
,B
,C
类地址,也遵循之前的分类编址规则。
那么这个子网号
是如何凭空出现的呢?这个子网号
,其实是从主机号中分出来的。
那么这个子网号有啥作用呢?对于网络号和子网号都相同的主机,视为处于同一个网络中!
那么我们再来看看一开始的问题:一个单位有300
人,现在要如何给这个单位分配网络?
刚才我们分析过,要分配一个B
类地址给这个网络,但是B
类地址中有65534
个地址,对这个单位来说又太多了,所以我们可以将这个B
类地址划分为更多个子网!
假设我们要对166.16.0.0
这B
类网络进行划分,我们可以分配 2 9 = 512 2^{9} = 512 29=512 个地址给这个单位,也就是说对于原先的16
位主机号,只保留9
位,剩下7
位拿去做子网号:
此时整个166.16.0.0
网络就被分为了 2 7 = 128 2^{7} = 128 27=128 个子网络,也就是子网号从0000000
到1111111
:
现在把其中一个子网分配给该单位,剩下的127
个子网给别的地方用,这样就可以大幅减少IP地址
的浪费了!
假设这个单位分配到的子网号为1010101
,并不是所有的IP地址
都可以分配。
与之前相同的,主机号全0
表示该网络,不可以分配,而主机号全1
是广播地址,也不能分配,所以这个子网中可以分配的IP地址
总数为: 2 9 − 2 = 510 2^{9} - 2= 510 29−2=510 个。
子网掩码
划分子网后,原来属于一个网络的IP地址
有可能会被划分在不同的子网,那么如何判断一个IP地址
的子网号是哪一部分呢?
这就需要用到子网掩码 (subnet mask)
,子网掩码也是32
位,由一串连续的1
和一串连续的0
组成,比如11111111 11111111 11110000 00000000
。
那么子网掩码有什么用呢?子网掩码的1
部分,对应IP地址
中的网络号
和子网号
,而子网掩码的0
部分,对应IP地址
的主机号
,如下:
比如以上示例中,主机号
为145.13
,子网号
为3
,它们对应的子网掩码都是1
,而主机号为10
,对应的子网掩码为0
。
将一个IP地址
与它的子网掩码
进行按位与运算,就可以得到该IP地址
所处的网络。
例如:已知 IP 地址是 128.14.35.7
,子网掩码是 255.255.240.0
,求网络地址
将地址128.14.35.7
转为二进制:
cpp
1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1
再把子网掩码255.255.240.0
转为二进制:
cpp
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
将两者按位与:
cpp
1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 1 1 0 0 0 0 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0
----------------------------------------------------------------
1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0
再把10000000000011100010
转为点分十进制128.14.32.0
,此时就得到了网络地址。
由于A
类,B
类,C
类地址都有固定的主机号,所以它们的子网掩码
都是有默认值的,比如A
类地址的主机号有8
位,那么子网掩码前面至少有8
位1
,那么子网掩码的默认值就是11111111 00000000 00000000 00000000
,点分十进制位255.0.0.0
,这种子网掩码称为默认子网掩码
。
各分类地址的默认子网掩码如下:
无分类编址 CIDR
IPv4地址
编址方法的第三个历史阶段,是无分类编址
的 IPv4地址
。
尽管之前介绍的划分子网的 IPv4地址
在一定程度上缓解了因特网在发展中遇到的困难,但是因特网的 IP 地址仍在加速消耗整个 IPV4 地址空间,面临全部耗尽的威胁。为此,因特网工程任务组又提出了采用无分类编址的方法来解决 IPv4地址
紧张的问题。
1993 年英特网工程任务组发布了无分类域间路由选择
的相关 RFC 文档。无分类域间路由选择的英文缩写词为CIDR
,消除了传统 A 类、 B 类和 C 类地址以及划分子网
的概念,因此可以更加有效的分配 IPV4 的地址空间。
这里有一个很重要的信息,那就是无分类编址 CIDR
已经推翻了之前的分类编址
和划分子网
,是一套全新的IP地址
体系,接下来的学习不要带入之前的概念,要看做是一个新的体系去学习。当然,CIDR
也有很多和之前相似的地方,它继承了先前的IP地址
设计的优点,并优化了部分缺点。
CIDR
编址中,IP地址
的格式如下:
其与分类编址
中的网络号 + 主机号
的模式很像,但是CIDR
中,网络前缀
的长度是任意的,不受限制,而分类编址
中网络号
的长度是固定的。
那么对于一个IP地址
,要如何知道其有多少位网络前缀
呢?
CIDR
使用斜线记法
或称为CIDR记法
,即在IP地址
的末尾加上一个斜线'/'
,写上网络前缀所占的位数。例如128.14.35.7/20
这个地址,就是指前20
位为网络前缀
,剩下的12
位是主机号
。
如果想要求出CIDR
编址下,IP地址
所处的网络,其实就是把主机号
的所有比特位变为0
,保留网络前缀
即可,当然你也可以用通过与子网掩码
进行按位与的方法求网络地址,通过反斜线记法可以很轻松求出子网掩码
。
CIDR 地址块
CIDR
把网络前缀都相同的连续IP地址
组成一个CIDR地址块
比如128.14.32.0/20
,这就是一个CIDR地址块
,其表示前20
位网络前缀
为128.14.32
的所有地址聚合成的一个地址块,也可以表示一个网络。
如下图:
要注意,CIDR地址块
中包含的地址数,一定是 2 n 2^{n} 2n 个。
接下来我带大家辨析一些网络地址:
128.14.35.7
该地址是一个IP地址
,但是没有通过反斜线记法表示其网络前缀
的位数,所以不知道其网络。
128.14.35.7/20
该地址是一个IP地址
,并通过/20
表示该地址的网络前缀
为20
位。
128.14.32.0/20
其有两种可能,如果其表示IP地址
,那么这就是一个主机号
为全0
的IP地址
。
因为其主机号
全0
,所以其也有可能表示CIDR地址块
。
接下来我们看一些特殊的CIDR地址块
:
网络前缀长度 | 子网掩码 | 含义 |
---|---|---|
/32 |
255.255.255.255 |
一个IP地址 ,这个地址一般在路由器中来指定一台主机 |
/31 |
255.255.255.254 |
这种地址块中,只有两个地址,也就是最后一位主机号 分别为1 和0 ,这种地址用于进行点对点链路通信,此时主机号全1 不再表示广播,因为点对点链路没有广播的概念 |
/0 |
0.0.0.0 |
这是全球所有IP地址 构成的一个地址块,如果主机号也为全0 ,即0.0.0.0/0 ,则表示路由器中的默认路由 |
构造超网
当多个网络有相同的前缀时,可以把这些网络构造为一个更大的网络,该过程叫做
构造超网
比如以下案例:
以上的16
个网络中,它们都是/24
的网络,也就是它们的网络前缀
都是20
位,但这些网络的前20
位都相同,只有第[21, 24]
位不同,所以我们可以把它变为一个统一的网络,前缀为:128.14.0000
,也就是128.14.0.0/20
这个网络。这就是构造超网
。
有人可以会认为,这个过程不就是把地址统一为CIDR地址块
吗?不,两者有很大区别,CIDR地址块
是把众多IP地址
统一到一个地址块
中;而构造超网
是把众多网络
统一到一个更大的网络中。
即:CIDR地址块
统一的是IP地址
,而构造超网
统一的是网络
。
构造超网有以下要求:
- 所有网络的
IP地址
必须连续 - 网络的总数必须是 2 n 2^{n} 2n 个
- 所有网络中的最小地址和最大地址,必须构成超网的边界
所谓构成边界,就是说比如说上例中,我们把很多/24
的网络构造成了一个/20
的网络。那么第[21, 24]
位中,最小值必须是0000
,最大值必须是1111
,这就是两个边界值。并且这两个值中间的所有值都必须连续存在,即第一条规则。