面向程序员的网络基本知识 - 子网分割

Github

本系列文章旨在向程序员分享一些网络基本知识,让程序员具备基本的网络常识,以便与网络工程师沟通。本系列文章不会涉及如何组建网络、如何配置交换机/路由器等硬件相关的内容,所以不适合想考CCNA/HCNA证书的人士。

子网分割

IP地址一文中我们提到了A、B、C三类IP地址,也提到了IP地址中包含了network id和host信息,那么你知道这3类地址分别能够容纳多少台host吗?

以一个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数量太过巨大,那么现实生活中组建如此巨大的网络是不现实的,因此我们需要划分子网。

无类型IP编址

给一个有类型IP地址划分子网的方式很简单,在子网掩码中借用后面的0把它们变成1,比如将一个C类地址的子网掩码1的位数变成25:192.168.1.0/25,它比C类地址的/24多了一个bit,这种形式称为无类别域间路由(CIDR),它的子网掩码就是255.255.255.128,这样一来就将原本192.168.1.0/24分割称了两个子网。

一张计算表

下面这张表列出了借用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

为何没有列出借用7、8个bit的情况,因为如果借用7个bit则host数量=0。如果借用8个bit则block size=1,host数量=-1,显然不够用。

如果借用的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不太好算,下表总结了一个计算方式:将绿色连接的两个数字相加就能够得到红色箭头所指格子里的数字:

C类地址的子网分割

现在我们来计算一下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
  • 每个子网block size=256 / subnets=256 / 2=128
  • host数量=block size - 2=128 - 2=126

那么每个子网的network id和 broadcast addr是什么呢?其实可以根据block size来计算:

  • 第一个子网的network id肯定是0,因此是192.168.1.0,因为block size=128,所以下一个子网network id就是0+128=128=192.168.1.128
  • 因为每个子网的broadcast addr是其block中的最后一个,因此第一个子网的 broadcast addr是后下一个子网的network id-1=192.168.1.127,因下一个子网是最后一个子网,所以它的 broadcast addr肯定是255=192.168.1.255。下面是详细表格:
  • 去掉每个子网的network id和 broadcast addr,剩下的就是host的范围了

subnet

0

128

first host

1

129

last host

126

254

broadcast addr

127

255

A/B类地址的子网分割

前面讲的是如何分割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需要很多技巧,本文就不在做详述了。

参考资料

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吉浦迅科技

DAY31:阅读global memory

992
来自专栏互联网杂技

Angular2 脏检查过程

在本文中我将会深入讨论Angular 2 中的变更检测系统。 高层次概览 一个Angular 2 应用就是一颗组件树。 ? Angular 2 应用是一个反馈系...

4248
来自专栏Petrichor的专栏

.jpg & .jpeg 区别

1073
来自专栏老九学堂

浅谈计算机中的存储模型(一)物理内存

今天,我们来了解一下计算机中的存储模型,大雄将这部分知识分成了三块,也就是我们会对这部分的知识推送三次。

1704
来自专栏逸鹏说道

Toxy新手教程

Toxy新手教程 官方网站:http://toxy.codeplex.com Toxy是干嘛用的?它是.NET平台上的文件抽取框架,主要解决各种格式的内容抽取问...

2906
来自专栏Golang语言社区

数据说话:Go语言的Switch和Map性能实测

在开发pgx(一个针对Go语言的PostgreSQL driver)的时候,有好几次我都需要在20多个代码分支间跳转。通常我会选用switch语句。还有个更加可...

4085
来自专栏架构师之路

业界难题-“跨库分页”的四种方案

一、需求缘起 分页需求 互联网很多业务都有分页拉取数据的需求,例如: (1)微信消息过多时,拉取第N页消息 (2)京东下单过多时,拉取第N页订单 (3)浏览58...

6614
来自专栏PHP在线

MongoDB数据结构设计中6条重要的经验法则

很多初学者认为在MongoDB中针对一对多建模唯一的方案就是在父文档中内嵌一个数组子文档,但是这是不准确的。因为你可以在MongoDB内嵌一个文档不代表你就必须...

3227
来自专栏linux驱动个人学习

Linux CFS调度器之虚拟时钟vruntime与调度延迟--Linux进程的管理与调度(二十六)

CFS为了实现公平,必须惩罚当前正在运行的进程,以使那些正在等待的进程下次被调度。

2094
来自专栏用户画像

3.2.3页面置换算法

进程运行时,若其访问的页面不在内存而徐将其调入,但内存已无空闲时间时,就需要从内存中调出一页程序或数据,送入磁盘的对换区。 而选择调入页面的算法就称为页面置...

3793

扫码关注云+社区

领取腾讯云代金券