掩码位数原理、掩码位数计算方法、VLSM详解(IP地址划分方法)、CIDR详解

本文详细介绍了掩码位数原理,VLSM(可变长子网掩码)技术以及CIDR(无类域间路由选择)的概念。通过实例展示了如何根据网络和主机数量进行子网划分,以及如何利用VLSM有效地分配IP地址。同时,探讨了CIDR如何实现路由聚合和地址块计算。
部署运行你感兴趣的模型镜像
  • 掩码(mask)

根据掩码来判断网络位

掩码的定义:和IP地址的表示方法异样,但是必须是连续的0和1组成,而且前面必须是1,后面必须是0(如:8位掩码(是8进制),8进制转2进制:255.0.0.0_2进制为:11111111.00000000.0000000.00000000 /8).

掩码的1标记了网络位,0标注了主机位

就是说:转换为2进制后,第一位是1开头的就是网络位,0开头的就是主机位

  • 计算机是通过“相与运算”算出来的网络位这些

如:

192.168.1.1/24 (8进制,下面为转为换二进制的数)

1100000.10101000.00000001.00000001 ——IP地址

11111111.11111111.11111111.00000000——掩码

11000000.10101000.00000001.00000000——网络位

使用VLSM技术增加IP掩码的长度

================================================================================

VLSM——可变长子网掩码

本质:增加子网掩码的长度,网络位的数量增加了,导致网络的数量增加了,代价是主机位少了,代表每个网络的可用IP地址数量减少了

在这里插入图片描述

下面内容来源于百度百科:

  • 定义

VLSM(Variable Length Subnet Mask,可变长子网掩码)规定了如何在一个进行了子网划分的网络中的不同部分使用不同的子网掩码。这对于网络内部不同网段需要不同大小子网的情形来说很有效。

  • 简介

VLSM其实就是相对于类的IP地址来说的。A类的第一段是网络号(前八位),B类地址的前两段是网络号(前十六位),C类的前三段是网络号(前二十四位)。而VLSM的作用就是在类的IP地址的基础上,从它们的主机号部分借出相应的位数来做网络号,也就是增加网络号的位数。各类网络可以用来再划分子网的位数为:A类有二十四位可以借,B类有十六位可以借,C类有八位可以借(可以再划分的位数就是主机号的位数。实际上不可以都借出来,因为IP地址中必须要有主机号的部分,而且主机号部分剩下一位是没有意义的,所以在实际中可以借的位数是在上面那些数字中再减去2,借的位作为子网部分)。

这是一种产生不同大小子网的网络分配机制,指一个网络可以配置不同的掩码。开发可变长度子网掩码的想法就是在每个子网上保留足够的主机数的同时,把一个子网进一步分成多个小子网时有更大的灵活性。如果没有VLSM,一个子网掩码只能提供给一个网络。这样就限制了要求的子网数上的主机数。另外,VLSM是基于比特位的,而类网络是基于8位组的。

在实际工程实践中,能够进一步将网络划分成三级或更多级子网。同时,能够考虑使用全0和全1子网以节省网络地址空间。某局域网上使用了27位的掩码,则每个子网可以支持30台主机(25-2=30);而对于WAN连接而言,每个连接只需要2个地址,理想的方案是使用30位掩码(22-2=2),然而同主类别网络相同掩码的约束,WAN之间也必须使用27位掩码,这样就浪费28个地址。

  • 原理

可变长子网掩码实际上是相对于标准的有类子网掩码而言的,对于有类的IP地址的网络号部分的位数就相当于默认掩码的长度。A类的第一段是网络号(前八位),B类地址的前两段是网络号(前十六位),C类的前三段是网络号(前二十四位)。而VLSM的作用就是在有类的P地址的基础上,从他们的主机号部分借出相应的位数来做网络号,也就是增加网络号的位数,增加了掩码的长度。各类网络可以用来再划分的位数为:A类有二十四位可以借,B类有十六位可以借,C类有八位可以借(可以再划分的位数就是主机号的位数。实际上不可以都借出来,因为P地址中必须要有主机号的部分,而且主机号部分剩下一位是没有意义的,剩下1位的时候不是代表主机号就是代表广播号,所以实际最多可以借位数为主机位数减去2)。这是一种产生不同大小子网的网络分配机制,指一个网络可以配置不同的掩码。开发可变长度子网掩码的想法就是在每个子网上保留足够的主机数的同时,把一个网分成多个子网时有更大的灵活性。如果没有ⅥISM,一个子网掩码只能提供给一个网络。这样就限制了要求的子网数上的主机数。

  • 基本算法

在这里插入图片描述

VLSM技术划分IP思路讲解

=============================================================================

实例一


某公司,有四个部门,分别是A,B,C,D,每个部门需要20个IP地址,该公司申请了一个C类地址块,192.168.134.0/24,请给出合理的子网划分方案。

自行转换成8进制为:

192.168.134.0/24

11000000.10101000.10010011.00000000——地址段

11111111.11111111.11111111.00000000——掩码

根据网络数量来划分

由于该公司有4个网络,所以需要增加两位子网掩码

在这里插入图片描述

增加后就变为了:

在这里插入图片描述

弊端:这个就满足了ABCD4个类的使用需求, 但是,如果由于公司发展,城里了一个新的E部门,该部门也需要20个IP地址,那么这个就无法扩展了!!!!

所以根据主机数量来分析更为稳妥

根据主机数量来划分

由于每个网络需要20个IP地址,那么需要的主机位就是: 2^n-2>20 ,n最小是5,所以需要5个主机位就够用了

在这里插入图片描述

挪用了3位主机位为网络位,所以掩码变成了27位(挪用多少主机位就用24加挪用的主机位数量,这就是:24+3)

在这里插入图片描述

按照上面根据主机数量来划分,最终划分出了8个网络,每个网络的主机位数量是5个,可用IP地址就是2^5-2=32-2=30个,可以满足abcd四个网络的需求,而且也便于后期扩展,其中:

网络地址:192.168.134.0/27

可用地址:192.168.134.1/27~192.168.134.30/27

网关地址:192.168.134.30/27 (网络的出口,必不可少)

广播地址:192.168.134.31/27

实例二


某公司,abcd四个部门,a部门需要100个IP地址,B部门需要50个IP地址,C和D部门需要25个IP地址,现在公司申请了一个c类地址块,请给出合理的子网划分方案

自行转换成8进制为:

192.168.147.0/24

11000000.10101000.10010011.00000000——地址段

11111111.11111111.11111111.00000000——掩码

根据主机数量来划分

A需要100个IP地址,2^n-2>100_n=7,所以需要7个主机位

在这里插入图片描述

上面第一次子网划分后,把192.168.147.0/25分配给A以后,现在还剩下一个192.168.147.128/25

现在进行第二次子网划分:根据需求,B需要50个ip地址,2^n-2>50_n=6,需要6个主机位, 现在还剩7个主机位,则:

在这里插入图片描述

上面第二次划分子网后,把192.168.147.128/26分配给B网络,每个网络里面有6个主机位,所以又2^6-2=62个可用ip地址,满足B网络的需求,还剩一个192.168.147.192/28

现在进行第三次子网划分:根据需求,c和d两个网络各需要20个ip地址,那么20个IP地址需要2^n-2>20_n=5,需要5个主机位,现在还有6个主机位,可以拿出5个主机位用来当做新的网络位,则:

在这里插入图片描述

27位掩码可用IP为:2^5-2=30个可用IP地址,所以把这两个地址分配分配给C和D,就满足使用条件了。

总结

上面的所有划分中,分为三次划分

  • 第一次划分

192.168.147.0/25——用来分配给A

192.168.146.128/25——继续用来划分

  • 第二次划分

192.168.147.128/26——用来分配给B

192.168.147.192/26——继续用来划分

  • 第三次划分

192.168.147.192/27——用来分配给C

192.168.147.224/27——用来分配给D

  • 最终

a部门需要100个地址:192.168.147.0/25——2^7-2=126个地址_满足

b部门需要50个IP地址:192.168.147.128/26——2^6-2=62个地址_满足

C部门需要25个地址:192.168.147.192/27——2^5-2=30个地址_满足

D部门需要25个地址:192.168.147.192/27——2^5-2=30个地址_满足

VLSM实例及解法

========================================================================

题目要求


在这里插入图片描述

题目解析:注意,上图中是有2个路由,不是单纯的一个路由50个hosts,而是二级路由一个需要50个主机位,第一个路由到后面二级路由之间也需要网络,还需要2个地址用来做路由器的接口ip,所以上面一共需要6个网络地址。 怕你没懂,我把答案附下图,让你明白是什么意思,后面再做分析。

在这里插入图片描述

解析过程


分析:

根据主机数量进行分析,所以查看50个IP地址需要多少个主机位2^n-2>50_n=6 所以呢,需要6个主机位

那现在有的网络是172.16.32.0/20,转换为二进制如下:

172.16.32.0/20

10101100.00010000.0010 | 0000.00000000——IP地址范围

11111111.11111111.1111|0000.00000000——掩码

由于需要6个主机位,所以在现有网络中的12个主机位里面使用6个主机位。

在这里插入图片描述

上面红色标记的部分就是使用的6个主机位,那么还剩下6个主机位,那就使用这个6个主机位用作网络位

在这里插入图片描述

上述就是掩码增长后的网络,上述棕色的部分是新的网络位,那这些新的网络位实际上是原来的“主机位”,主机位是不是可以即为0又为1

在这里插入图片描述

现在,分了2^6=64个网络,那这64个网络里面,每个网络里有多少个IP地址?

2^6-2=62个,是否能满足一个网络50个IP地址? 能满足。

我现在有4个网络需要50个IP地址,那就从这64个网络中,拿出4个,给上

面有需要的网络用,那么还剩下60个网络那现在图里面还剩下4个网络,这4个网络,每个网络需要2个IP地址,分别作为路由器的接口IP。

在这里插入图片描述

2个IP地址需要多少个主机位?

2^n-2>=2_n=2,需要两个主机位就足够了

由于上面第一次子网划分还剩下60个网络,从里面拿出来一个

在这里插入图片描述

该网络有6个主机位,那我现在需要2个主机位

在这里插入图片描述

上面红色标记的部分是我需要的主机位,还剩下4个主机位,使用这4个主机位用来作为新的网络位,总共16个网络

在这里插入图片描述

我现在需要4个网络,所以从上面第二次子网划分的16个网络中,

拿出4个分配给需要的网络,剩下的,作为保留。

综上已经满足所有需求了,至此,还剩

59个—— 62个可用IP地址的网络(172.16../26)

12个—— 2个可用IP地址的网络(172.16.33.*/30)

思考:第二个网络分配的时候,上面用的是30位掩码,也可以用31位掩码,只有2个IP(因为这个只用来路由连接,可以不需要广播地址和网络地址,只需要2个网关即可),可以自行尝试用31位掩码来给这路由通讯做分配。

CIDR介绍,超网介绍

==========================================================================

CIDR的介绍和地址块计算


先来看几个非常规IP:

192.168.0.0/16

192.0.0.0/8

0.0.0.0/0 缺省网络(可以表示任何网络)

CIDR(Classless Inter-Domain Routing,无类域间路由选择)它消除了传统的A类、B类和C类地址以及划分子网的概念,因而可以更加有效地分配IPv4的地址空间。它可以将好几个IP网络结合在一起,使用一种无类别的域际路由选择算法,使它们合并成一条路由从而较少路由表中的路由条目减轻Internet路由器的负担。

CIDR 还使用“斜线记法”,它又称为CIDR记法,即在IP地址后面加上一个斜线“/”,然后写上网络前缀所占的比特数(这个数值对应于三级编址中子网掩码中比特1的个数)。 IP地址::={<网络前缀>,<主机号>} / 网络前缀所占位数

CIDR仅将IP地址划分为网络前缀和主机号两个部分,可以说又回到了二级IP地址的表示,不过大家要注意,最后面用“/”斜线分隔,在其后写上了网络前缀所占的位数,这样就不需要告知路由器地址掩码,仅需要通过网络前缀所占的位数就可以得到地址掩码,为了统一,CIDR中的地址掩码依然称为子网掩码。

CIDR表示法给出任何一个IP地址,就相当于给出了一个CIDR地址块,这是由连续的IP地址组成的,所以CIDR表示法构成了超网,实现了路由聚合,即从一个IP地址就可以得知一个CIDR地址块。例如:已知一个IP地址是:128.14.35.7/20,那么这个已知条件告诉大家的并不仅仅是一个IP地址这么简单,我们来分析一下。

128.14.35.7/20 = 10000000 00001110 00100011 00000111

即前20位是网络前缀,后12位是主机号,那么我们通过令主机号分别为全0和全1就可以得到一个CIDR地址块的最小地址和最大地址,即

最小地址是:128.14.32.0 = 10000000 00001110 00100000 00000000

最大地址是:128.14.47.255 = 10000000 00001110 00101111 11111111

子网掩码是:255.255.240.0 = 11111111 11111111 11110000 00000000

因此就可以看出来,这个CIDR地址块可以指派(47-32+1)*256=4096个地址,这里没有把全0和全1除外。

CIDR与VLSM的区别


CIDR是把几个标准网络合成一个大的网络

VLSM是把一个标准网络分成几个小型网络(子网)

CIDR是子网掩码往左边移了,VLSM是子网掩码往右边移了

CIDR子网划分


在CIDR表示法中也可以进行进一步的子网划分,和前面的子网划分类似,我们只需要从主机号中借走一定的位数即可,这里与前面的基本子网划分不同,借走2位时可以划分成4个子网,不用减2,其他位数类似。下面通过一个例子来讲解CIDR中的子网划分。

例:

某个机构拥有一个大的CIDR地址块,即206.0.64.0/18,现在某个高校需要申请一个较大的CIDR地址块以供学校使用,学校内部又分为4个系,由于每个系的人数不一样,所以要给人数较多的系分配较多的IP地址,人数较少的系分配较少的IP地址,现在采用以下的分配方案:

机构分配给该高校一个CIDR地址块:206.0.68.0/22,然后该高校内部的分配方案如下:

一系:206.0.68.0/23,一系内部又分为206.0.68.0/25、206.0.68.128/25、206.0.69.0/25和206.0.69.128/25四个子网。

二系:206.0.70.0/24,二系内部又分为206.0.70.0/26、206.0.70.64/26、206.0.70.128/26和206.0.70.192/26四个子网。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

面试资料整理汇总

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

成功从小公司跳槽进蚂蚁定级P7,只因刷了七遍这些面试真题

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
s/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

面试资料整理汇总

[外链图片转存中…(img-8nLmDli1-1713705568597)]

[外链图片转存中…(img-1tlSZkfL-1713705568597)]

这些面试题是我朋友进阿里前狂刷七遍以上的面试资料,由于面试文档很多,内容更多,没有办法一一为大家展示出来,所以只好为大家节选出来了一部分供大家参考。

面试的本质不是考试,而是告诉面试官你会做什么,所以,这些面试资料中提到的技术也是要学会的,不然稍微改动一下你就凉凉了

在这里祝大家能够拿到心仪的offer!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

您可能感兴趣的与本文相关的镜像

Stable-Diffusion-3.5

Stable-Diffusion-3.5

图片生成
Stable-Diffusion

Stable Diffusion 3.5 (SD 3.5) 是由 Stability AI 推出的新一代文本到图像生成模型,相比 3.0 版本,它提升了图像质量、运行速度和硬件效率

### 什么是二进制掩码 二进制掩码是一种用于处理二进制数据的技术,通常通过按逻辑运算符来实现。它允许程序员从一个整数中提取特定部分的信息或将某些设置为指定状态。这种技术广泛应用于网络通信、图像处理以及嵌入式开发等领域。 --- ### 如何创建和使用二进制掩码 #### 创建掩码 可以通过移操作生成所需的掩码。例如,如果需要获取某个数字中的第 `m` 到第 `n` ,则可以按照以下方式构建掩码: ```python def create_mask(start_bit, end_bit): """创建一个从 start_bit 到 end_bit 的掩码""" return ((1 << (end_bit + 1)) - 1) ^ ((1 << start_bit) - 1) # 示例:创建一个从第3到第7掩码 mask = create_mask(3, 7) print(f"{mask:b}") # 输出结果为 '11111000' ``` 上述代码片段展示了如何动态生成一段连续范围内的掩码[^1]。 #### 提取目标 一旦有了合适的掩码,就可以将其与其他数值配合使用按(`&`) 运算符来提取所需的部分。下面是一个简单的例子: ```python number = 0b11010110 # 原始数字 start_bit = 3 # 起始置 end_bit = 7 # 结束置 # 使用之前定义好的函数生成掩码 mask = create_mask(start_bit, end_bit) # 应用掩码并右移到最低有效处显示结果 extracted_bits = (number & mask) >> start_bit print(extracted_bits) # 输出结果应为十进制形式下的对应值 ``` 此段程序说明了怎样利用自定义的掩码去截取出原始变量里的某一部分比特序列。 #### 设置或清除特定 除了读取之外,还可以修改原数值中的某些的状态——要么置零(清零),要么设一(设定)。这分别涉及到按(`&`) 和 或(`|`) 操作: - **清零** 特定的一组需要用到反向版本的先前所建之正向掩码; - **设定** 那些被选中的则只需直接加上未经反转的标准型态即可完成任务。 以下是具体实践案例: ```python def set_or_clear_bits(number, start_bit, end_bit, value_to_set=1): """ 对 number 中的 bits[start:end] 设定新值。 :param number: 输入整数 :param start_bit: 开始索引 :param end_bit: 终止索引 :param value_to_set: 新值,默认全1 :return: 修改后的整数 """ all_ones = ~0 left = all_ones << (end_bit + 1) right = (1 << start_bit) - 1 mask = ~(left | right) return (number & (~mask)) | ((value_to_set << start_bit) & mask) original_num = 0b11010110 new_value = 0b1111 # 我们希望将第3至第6置换成这个值 modified_num = set_or_clear_bits(original_num, 3, 6, new_value) print(f"Modified Number: {bin(modified_num)}") # 打印最终改变过的数字 ``` 这里演示了一个通用方法用来更新任意长度区间上的内容。 --- ### 不同进制间的转换及其应用实例 当讨论涉及不同基数系统之间的相互转变时,Python 提供了一些内置工具简化这一过程。比如前面提到过的基础类型声明语法可以直接表达各种常见格式的数据;而当我们面对更加复杂的场景像IP地址解析成CIDR表示法之类的挑战时候就需要额外编写辅助功能了[^2][^3]: ```python def decimal_to_binary(ip_address): """把标准IPv4字符串转化为点分二进制形式""" parts = ip_address.split('.') bin_parts = [f'{int(part):08b}' for part in parts] return '.'.join(bin_parts) ip_addr = "192.168.1.1" binary_ip = decimal_to_binary(ip_addr) print(binary_ip) # 输出应该是类似于'11000000.10101000.00000001.00000001' # 反过来也可以做同样的事情但是反过来... def binary_to_decimal(binary_str): dec_parts = [str(int(b_part, base=2)) for b_part in binary_str.split('.')] return '.'.join(dec_parts) back_to_dec = binary_to_decimal(binary_ip) assert back_to_dec == ip_addr # 断言应该成立因为它们互逆变换关系 ``` 以上两个方向的功能展示可以帮助理解实际应用场景下可能遇到的需求[^3]. ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值