一、IP地址的表示
IP作用于OSI参考模型中的网络层,在终端通信中作为唯一标识,便于确定数据的传递目标。
IP地址分为:IPv4 、IPv6
大多数用户熟悉并且流行的IP地址是IPv4,其是用点分四组十进制的表示方法展示的,例如 165.195.130.107
、197.101.0.0
等,每一组的数字都是非负的整数,范围在 [0, 255]
之间。
IPv4还有种写法是用二进制表示的,例如:
十进制表示 | 二进制表示 |
0.0.0.0 | 00000000 00000000 00000000 00000000 |
1.2.3.4 | 00000001 00000010 00000011 00000100 |
10.0.0.255 | 00001010 00000000 00000000 11111111 |
165.195.130.107 | 10100101 11000011 10000010 01101011 |
255.255.255.255 | 11111111 11111111 11111111 11111111 |
因此称IPv4是32位的。而IPv6的位数就比较大了,是128位的,长度是IPv4的4倍,并且其表示方式是分块的八组四个十六进制数,例如:
5f05:2000:80ad:5800:0058:0800:2023:1d71
,每个块儿之间都是用 :
隔开的。
IPv6看着特别得长,所以它的简化表示法已经有一套标准,规则如下:
- 每个块儿中前导的零可省略。例如
5f05:2000:80ad:5800:0058:0800:2023:1d71
按照此规则简化后为5f05:2000:80ad:5800:58:800:2023:1d71
- 整个块儿都为零的可以省略不写,并用
::
代替其位置,但整个IPv6地址中只能出现一次::
符号。例如0:0:0:0:0:0:0:1
按照此规则简化后为::1
当然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 |
如果把IPv6和端口号一起使用的话,可能会出现这样的情况:http://2001:0db8:85a3:08d3:1319:8a2e:0370:7344:443/
,该URL中,最后一个 :443
其实表示的是端口号,但与IPv6一起使用时看起来好像也成为了一个块儿部分,因此我们需要用 []
符号将IPv6部分包裹起来,结果如下:http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]:443/
二、IP地址结构
上面提到,IP是作为终端的唯一表示,因此只有当保证每个IP都不同时,才能保证IP的唯一性。其中,IPv4地址的长度为32位,因此就有 种可能的地址,那么同理,IPv6地址的长度为128位,因此就有 种可能的地址。
这些地址就是作为数据包发送的目的地址,当然每个地址都会有它们各自的含义,例如单播 、组播 、广播等,当然还有一些地址是会被保留用于实验的
- 单播可以理解为一台主机发送单一的数据包给另一台主机;
- 组播可以理解为一台主机发送单一的数据包给多台主机;
- 广播可以理解为一个节点向其它所有的节点发送数据包;
IPv4中大多数的的地址都为单播
(1)分类寻址
那么IP地址既然是作为识别特定主机的唯一标识,那么到底是如何被识别的呢?其实在长度为32位的IPv4地址中,有一段连续位称为网络号,还有一段连续位称为主机号。
因为有时在同一个网络中,可能会有多台主机,就例如一个电子计算机教室看成一个网络,教室中有60台电脑,那么这60台电脑都属于这一个教室所处的网络,而每台电脑又需要在该网络下单独分配一个唯一的标识
因此,在识别IP地址时,就是先通过识别IP地址中的网络号来确认目的地址处于哪个网络区域,然后再识别主机号,来确认这个网络中特定的主机。
我们将IPv4地址用二进制表示,一段地址的网络号和主机号分类可以分为5类:A类 、B类 、C类 、D类 、E类,区别如下图:
IPv4地址分类
- A类: 网络号共8位,首位固定为
0
,接下来连续的7位可以自由设定;主机号为24位
- B类: 网络号共16位,前两位固定为
1 0
,接下来连续的14位可以自由设定;主机号为16位
- C类: 网络号共24位,前三位固定为
1 1 0
,接下来连续的21位可以自由设定;主机号为8位
- D类: 为组播地址,共32位,前四位固定为
1 1 1 0
- E类: 为保留地址,共32位,前四位固定为
1 1 1 1
其中A 、B 、C类地址大多都是单播地址,因此它们可用于接口分配。举个例子,A类地址网络号共8位,其中首位固定为 0
,那么还有7位可以自由设定,那么就共有 个网络数;主机号共24位,那么就共有 个主机数。(同样的,我们可以推出其它类别的地址的网络数和主机数)因此我们可以理解为,用A类地址一共可以为 个电子计算机教室分配使用,每个教室可以容纳 台主机
IPv4地址的范围在 0.0.0.0 ~ 255.255.255.255
之间,那么我们来看看这五类地址各自的地址范围是如何的吧~
A类地址首位固定为 0
,因此A类地址用二进制表示为 0XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
,因此A类地址用十进制表示时,第一组最小为0,其余三组最小也为0,即 0.0.0.0
;
B类地址前两位固定为 1 0
,因此B类地址用二进制表示为 10XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
,因此B类地址为十进制表示时,第一组最小为128,其余三组最小为0,即 128.0.0.0
,那么A类地址的范围就可以确定为 0.0.0.0 ~ 127.255.255.255
C类地址前两位固定为 1 1 0
,因此B类地址用二进制表示为 110XXXXXX XXXXXXXX XXXXXXXX XXXXXXXX
,因此C类地址为十进制表示时,第一组最小为192,其余三组最小为0,即 192.0.0.0
,那么B类地址的范围就可以确定为 128.0.0.0 ~ 191.255.255.255
以此类推,即可推出D 、E类的地址范围
我们将IPv4地址的空间划分情况总结在了下表中:
类 | 地址范围 | 网络数 | 主机数 |
A | 0.0.0.0 ~ 127.255.255.255 | 27 | 224 |
B | 128.0.0.0 ~ 191.255.255.255 | 214 | 216 |
C | 192.0.0.0 ~ 223.255.255.255 | 221 | 28 |
D | 224.0.0.0 ~ 239.255.255.255 | / | / |
E | 240.0.0.0 ~ 255.255.255 | / | / |
上面有提到,A、B、C类地址中大多都是单播,那么也有几个地址不作为单播地址使用,一般都是地址块儿中的第一个地址和最后一个地址不使用,所以假设分配得到的地址块儿为 127.0.0.0
,那么实际能分配的单播地址数就为
(2)子网寻址
查看上述的A类地址,它可使用的主机数有 个,那么当分配了A类IP地址后,却发现并没有那么多的主机,这样就造成了剩余可用主机数的浪费;或者说被分配了C类地址后,却发现有上万台主机,而C类地址可用的主机数只有 个,因此只能给其多分配几个C类地址,那么C类地址就很容易被消耗完
为了解决上述办法,又采用了一种叫做子网寻址的方法,即假设当一个站点被分配了B类地址,那么该站点的管理员可以将B类地址的主机号部分继续分成两部分,分别为 子网号 和 主机号,这两者所占的位数可以根据实际需求自由分配,例如分配给子网号8位,分配给主机号8位,即平分,结果如下图:
此时的站点可以支持 个子网,每个子网中最多可支持 台主机(每个子网的第一个地址和最后一个地址不会被使用)
这样在站点内,路由器就可以根据子网号和主机号监测到不同子网的流量了,如下图所示:
上图中,该站点被分配了一个B类地址 128.32.x.x
,而管理员此时选择将其继续划分为多个子网,如图中的子网1和子网2,它们分别是开始于 128.32.1
和 128.32.2
,并且左右两台主机都分别属于各自的子网。
那么路由器是如何在地址中寻找子网号的呢?这就要设置一个名为子网掩码的参数了
(3)子网掩码
子网掩码是由一台主机或路由器使用的分配位,用以确定如何从一台主机对应的IP地址中获得网络和子网信息,更通俗点说,通过它可以确定一个IP地址的网络/子网部分的结束和主机部分的开始。
子网掩码跟IP地址的长度相等(IPv4为32位,IPv6为128位),对于IPv4来说,子网掩码也是用点分四组十进制来表示的。当子网掩码用二进制表示时,结构非常简单且容易记忆,从左边开始由一段连续的1组成,紧接着又一段连续的0组成直到最后。其中连续的1的长度称为前缀长度,用 /长度
来表示
举例各种类型的子网掩码:
十进制表示 | 前缀长度 | 二进制表示 |
128.0.0.0 | /1 | 10000000 00000000 00000000 00000000 |
255.0.0.0 | /8 | 11111111 00000000 00000000 00000000 |
255.192.0.0 | /10 | 11111111 11000000 00000000 00000000 |
255.255.0.0 | /16 | 11111111 11111111 00000000 00000000 |
255.255.254.0 | /23 | 11111111 11111111 11111110 00000000 |
255.255.255.224 | /27 | 11111111 11111111 11111111 11100000 |
255.255.255.255 | /32 | 11111111 11111111 11111111 11111111 |
接下来说说子网掩码是如何使用的,其二进制位1对应IP地址的网络/子网部分;相反,0对应IP地址的主机号部分。换个说法就是子网掩码第一个0所对应IP地址的位为主机号的第一位;也可以借用前缀长度来判断,即前缀长度后一位对应的也是IP地址主机号的第一位。
例如刚才举的例子,站点管理员将B类地址 128.32.x.x
的主机位划分为8位的子网号和8位的主机号,那么他就会提前设置好一个长度为 的子网掩码,即 255.255.255.0
,表示前24位是网络/子网部分,那么路由器在处理图中的IPv4地址 128.32.1.14
时,会先查看一下子网掩码,此时将IP地址和子网掩码对应的位进行与运算即可获得该IP所处的是哪个子网,运算过程如下图:
结果中的 128.32.1.0
就是IP地址 128.32.1.14
所属的子网
但此时有没有发现一个问题?虽然给地址划分了子网号和主机号,但是每个子网号所对应子网的主机数就固定死了,而且每个子网所支持的主机数都是一样的,这一定是不合理的,因为实际应用中,可能这个区域只需要支持10台主机,而另一个区域需要支持100台主机,那么我们此时在划分子网号和主机号的时候,至少要让每个子网支持的主机数大于100台,那只需要支持10台主机的区域分配到了一个子网,岂不是至少浪费了其中的90个空间么?面对这样的问题,我们又该如何解决呢?
(4)可变长度的子网掩码
上个部分刚说过,路由器在寻找子网号时,是通过我们设置的子网掩码来查找的,那么我们不妨根据不同的需求设置多个子网掩码,来达到子网号和主机号分配比例不唯一的需求,这就是VLSM(Variable Length Subnet Mask,可变长度的子网掩码)的实现
比如,我们上面举得例子,当前站点被分配到了一个B类地址,该站点的某个区域需要支持100台主机,那么我们可以给这个区域分配一个子网号,同时设置其子网掩码为 255.255.255.128
,其前缀长度为 25
,因此留给主机位的位数还有 位,则该子网支持主机数为 台,可以满足该区域的需求;再来看另一个区域,它们需要支持的主机台数为10,那么我们可以给该区域分配另一个子网号,同时设置子网掩码为 255.255.255.240
,其前缀长度为 28
,因此留给主机的位数还有 位,则该子网支持的主机数为 台,同样可以满足该区域的需求。
(5)广播地址
在每个IPv4的子网中,都会有一个特殊的地址被保留作为子网的广播地址,那如何获取它呢?我们只需要将子网掩码的所有位都取反,即0变1,1变0,然后将取反后的子网掩码与子网内的IP地址进行或运算即可得到广播地址
仍然延用上面的例子,子网内的IP地址为 128.32.1.14
,子网掩码为 255.255.255.0
,则比较过程如下图:
图中获得的结果 128.32.1.255
即为子网 128.32.1.0
中的广播地址,前面说过,每个子网中的头尾两个地址一般是不被使用的,所以该子网中可用的单播地址范围就是 128.32.1.1 ~ 128.32.1.254
(6)总结
简单总结一下子网掩码的作用:
- 面对不同需求设置不同的子网掩码可以做到不同子网支持不同数量的主机
- 通过子网掩码可以获取子网IP
- 通过子网掩码可以获取广播地址
- 通过子网掩码可以获取该子网内的可用单播地址
- 通过子网掩码可以获取子网内支持的主机数