Githubgit
本系列文章旨在向程序员分享一些网络基本知识,让程序员具有基本的网络常识,以便与网络工程师沟通。本系列文章不会涉及如何组建网络、如何配置交换机/路由器等硬件相关的内容,因此不适合想考CCNA/HCNA证书的人士。程序员
在IP地址一文中咱们提到了A、B、C三类IP地址,也提到了IP地址中包含了network id和host信息,那么你知道这3类地址分别可以容纳多少台host吗?github
以一个C类地址192.168.1.xxx/24
为例,由于子网掩码的1占用了24位,剩余的0都是用来给host用的——有8位,因此block size=2 ^ 8=256,又因按约定一个block中的第一个值被留做network id(192.168.1.0
),最后一个值被留做 broadcast addr(192.168.1.255
),因此实际host的数量=256 - 2=254。网络
同理一个B类地址128.10.xxx.xxx/16
的host数量=2 ^ 16-2=65,534个,一个A类地址10.xxx.xxx.xxx/8
的host数量=2 ^ 24-2=16,777,214个。工具
看到问题没有,当你在使用一个A或B类地址的时候会发现host数量太过巨大,那么现实生活中组建如此巨大的网络是不现实的,所以咱们须要划分子网。spa
给一个有类型IP地址划分子网的方式很简单,在子网掩码中借用后面的0把它们变成1,好比将一个C类地址的子网掩码1的位数变成25:192.168.1.0/25
,它比C类地址的/24
多了一个bit,这种形式称为无类别域间路由(CIDR),它的子网掩码就是255.255.255.128
,这样一来就将本来192.168.1.0/24
分割称了两个子网。code
下面这张表列出了借用bit数与分割子网数的关系:图片
Borrowed Bits | 1 | 2 | 3 | 4 | 5 | 6 |
---|---|---|---|---|---|---|
Mask Value | 128 | 192 | 224 | 240 | 248 | 252 |
Subnets | 2 | 4 | 8 | 16 | 32 | 64 |
Block size | 128 | 64 | 32 | 16 | 8 | 4 |
Hosts | 126 | 62 | 30 | 14 | 6 | 2 |
为什么没有列出借用七、8个bit的状况,由于若是借用7个bit则host数量=0。若是借用8个bit则block size=1,host数量=-1,显然不够用。ip
若是借用的bit数超过8会怎样,好比一个A类地址10.10.1.1/8
变成10.10.1.1/18
会怎样呢?咱们这个IP地址和子网掩码变成二进制观察一下:路由
IP Addr(dec) : 10 . 10 . 1 . 1 IP Addr(bin) : 00001010 . 00001010 . 00000001 . 00000001 subnet mask(bin) : 11111111 . 11111111 . 11000000 . 00000000 subnet mask(dec) : 255 . 255 . 192 . 0
能够看到子网掩码的1扩展到了第三个字节且占用了第三个字节的2个bit,所以分割子网数=2 ^ 2=4,block size=256 / 4 = 64。
到这里你会发现子网数、block size、host数都比较好算,Mask Value不太好算,下表总结了一个计算方式:将绿色链接的两个数字相加就可以获得红色箭头所指格子里的数字:
如今咱们来计算一下192.168.1.0/25
的每一个子网的network id、 broadcast addr、block size、host数量、mask value:
192.168.1.0/25
被划分为了2个子网,为何是两个?其实很简单,子网数=2 ^ borrowed bits=2 ^ 1=2那么每一个子网的network id和 broadcast addr是什么呢?其实能够根据block size来计算:
192.168.1.0
,由于block size=128,因此下一个子网network id就是0+128=128=192.168.1.128
。192.168.1.127
,因下一个子网是最后一个子网,因此它的 broadcast addr确定是255=192.168.1.255
。下面是详细表格:subnet | 0 | 128 |
---|---|---|
first host | 1 | 129 |
last host | 126 | 254 |
broadcast addr | 127 | 255 |
前面讲的是如何分割C类地址的子网,由于一个C类地址的前3个字节老是固定的,因此计算network id老是发生在第4个字节上。因此对于A类地址来说,分割子网的CIDR是/8+
,B类地址是/16+
,C类地址是24+
。
问题来了,若是对一个A类地址好比10.10.0.0/18
分割字网,那么该如何计算呢?
在这里咱们得先讲一下IP地址“进位”的方式。当你对第n个字节作加法,加到256的时候,则第n个字节清0,第n-1个字节加1,好比咱们对10.10.0.0
的第3个字节不断的加128:
10 . 10 . 0 . 0 10 . 10 . 128 . 0 10 . 11 . 0 . 0 10 . 11 . 128 . 0
这很重要,由于当看到一个CIDR时,咱们要知道它的子网掩码延伸到第几个字节,而后在这个字节上不断的加block size,从而获得每一个子网的network id,而后计算broadcast addr、host范围等。
举个例子,10.10.0.0/18
的掩码延伸到了第3个字节,占用了2个bit,block size=64,因此:
subnet1: network id=10.10.0.0 broadcast addr=10.10.63.255 subnet2: network id=10.10.64.0 broadcast addr=10.10.127.255 subnet3: network id=10.10.128.0 broadcast addr=10.10.191.255 subnet4: network id=10.10.192.0 broadcast addr=10.10.255.255 subnet5: network id=10.11.0.0 broadcast addr=10.11.63.255 subnet6: network id=10.11.64.0 broadcast addr=10.11.127.255 ...
注意看broadcast addr,subnet 1的broadcast addr=subnet 2 network id - 1=10.10.64.0 - 1,由于IP地址是一个“进位”系统,因此获得10.10.63.255。
上面咱们已经了解如何进行子网分割,虽然咱们避免了IP地址的浪费,可是依然还会有问题。好比一个公司有三个部门,PC数量分别是100台、53台、50台,如今有一个C类地址192.168.1.0
,咱们怎么分割子网呢——要求是每一个部门有本身的子网?
若是咱们这样192.168.1.0/25
,则只能分割2个子网,若是192.168.1.0/26
,可以分割4个子网,可是每一个子网的host数量=62,而有一个部门的PC有100台,容纳不了。那该怎么办呢?
这里咱们要引入一个工具:变长子网掩码VLSM(Variable Length Subnet Mask),它容许网管可使用长度不一样的子网掩码分割一个网络。
回到上面的例子,咱们会这样分割:
192.168.1.0 /26 192.168.1.64 /26 192.168.1.128 /25
使用VLSM须要不少技巧,本文就不在作详述了。