子网掩码使用详解

2023-05-16

一、子网掩码

IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相同的主机称之为远程网络主机,本地网络中的主机可以直接相互通信;远程网络中的主机要相互通信必须通过本地网关(Gateway)来传递转发数据。

1、子网掩码的概念及作用

①、子网掩码(Subnet Mask)又叫网络掩码、地址掩码,必须结合IP地址一起对应使用。
②、只有通过子网掩码,才能表明一台主机所在的子网与其他子网的关系,使网络正常工作。
③、子网掩码和IP地址做“与”运算,分离出IP地址中的网络地址和主机地址,用于判断该IP地址是在本地网络上,还是在远程网络网上。
④、子网掩码还用于将网络进一步划分为若干子网,以避免主机过多而拥堵或过少而IP浪费。

IP地址和子网划分学习笔记之《子网掩码详解》

2、子网掩码的组成

①、同IP地址一样,子网掩码是由长度为32位二进制数组成的一个地址。
②、子网掩码32位与IP地址32位相对应,IP地址如果某位是网络地址,则子网掩码为1,否则为0。
③、举个栗子:如:11111111.11111111.11111111.00000000

注:左边连续的1的个数代表网络号的长度,(使用时必须是连续的,理论上也可以不连续),右边连续的0的个数代表主机号的长度。

3、子网掩码的表示方法

①、点分十进制表示法
二进制转换十进制,每8位用点号隔开
例如:子网掩码二进制11111111.11111111.11111111.00000000,表示为255.255.255.0

②、CIDR斜线记法
IP地址/n
例1:192.168.1.100/24,其子网掩码表示为255.255.255.0,二进制表示为11111111.11111111.11111111.00000000
例2:172.16.198.12/20,其子网掩码表示为255.255.240.0,二进制表示为11111111.11111111.11110000.00000000
不难发现,例1中共有24个1,例2中共有20个1,所以n是这么来的。运营商ISP常用这样的方法给客户分配IP地址。

注:n为1到32的数字,表示子网掩码中网络号的长度,通过n的个数确定子网的主机数=2^(32-n)-2(-2的原因:主机位全为0时表示本网络的网络地址,主机位全为1时表示本网络的广播地址,这是两个特殊地址)。

3、为什么要使用子网掩码?

前面说道,子网掩码可以分离出IP地址中的网络地址和主机地址,那为什么要分离呢?因为两台主机要通信,首先要判断是否处于同一网段,即网络地址是否相同。如果相同,那么可以把数据包直接发送到目标主机,否则就需要路由网关将数据包转发送到目的地。

可以这么简单的理解:A主机要与B主机通信,A和B各自的IP地址与A主机的子网掩码进行And与运算,看得出的结果:

1、结果如果相同,则说明这两台主机是处于同一个网段,这样A可以通过ARP广播发现B的MAC地址,B也可以发现A的MAC地址来实现正常通信。

2、如果结果不同,ARP广播会在本地网关终结,这时候A会把发给B的数据包先发给本地网关,网关再根据B主机的IP地址来查询路由表,再将数据包继续传递转发,最终送达到目的地B。


计算机的网关(Gateway)就是到其他网段的出口,也就是路由器接口IP地址。路由器接口使用的IP地址可以是本网段中任何一个地址,不过通常使用该网段的第一个可用的地址或最后一个可用的地址,这是为了尽可能避免和本网段中的主机地址冲突。

在如下拓扑图示例中,A与B,C与D,都可以直接相互通信(都是属于各自同一网段,不用经过路由器),但是A与C,A与D,B与C,B与D它们之间不属于同一网段,所以它们通信是要经过本地网关,然后路由器根据对方IP地址,在路由表中查找恰好有匹配到对方IP地址的直连路由,于是从另一边网关接口转发出去实现互连。

IP地址和子网划分学习笔记之《子网掩码详解》

4、子网掩码的分类

①、缺省子网掩码

也叫默认子网掩码,即未划分子网,对应的网络号的位都置 1 ,主机号都置 0 。

未做子网划分的IP地址:网络号+主机号

A类网络缺省子网掩码: 255.0.0.0,用CIDR表示为/8

B类网络缺省子网掩码: 255.255.0.0,用CIDR表示为/16

C类网络缺省子网掩码: 255.255.255.0,用CIDR表示为/24

②、自定义子网掩码

将一个网络划分子网后,把原本的主机号位置的一部分给了子网号,余下的才是给了子网的主机号。其形式如下:

做子网划分后的IP地址:网络号+子网号+子网主机号

举个栗子:

如:192.168.1.100/25,其子网掩码表示:255.255.255.128

意思就是将192.168.1.0这个网段的主机位的最高1位划分为了子网。关于子网划分将在下篇文章讲到,这里不在阐述。

5、子网掩码和IP地址的关系

子网掩码是用来判断任意两台主机的IP地址是否属于同一网络的依据,就是拿双方主机的IP地址和自己主机的子网掩码做与运算,如结果为同一网络,就可以直接通信。

And按位与运算:
与运算是计算机中一种基本的逻辑运算方式,符号表示为&,也可以表示为 and。
参加运算的两个数据,按二进制位进行“与”运算。
运算规则:0&0=0;0&1=0;1&0=0;1&1=1;
即:两位同时为“1”,结果才为“1”,否则为0

如何根据IP地址和子网掩码,计算网络地址:

①、将IP地址与子网掩码转换成二进制数。
②、将二进制形式的 IP 地址与子网掩码做“与”运算。
③、将得出的结果转化为十进制,便得到网络地址。
如下图:

IP地址和子网划分学习笔记之《子网掩码详解》

网络地址计算小技巧:IP地址和子网掩码做与运算,把IP地址的主机位直接归0,就快速得到网络地址。所以只要一看到IP地址和子网掩码,就能马上确认网络地址。

二、CIDR与VLSM

理解和掌握了子网掩码这部分知识后,这里要补充下CIDR和VLSM,这对于我们下篇讲述的子网划分,简直了就是放大招啊!

1、有类和无类网络,超网和子网

,我们先了解这几个概念,对于CIDR和VLSM以及子网划分都是很有用的。

◆ 有类网络:也叫主类网络或标准网络,就是指把IP地址能归结到的A类、B类、C类IP,使用的是标准的默认子网掩码。

◆ 无类网络:相对于有类网络,无类网络IP地址的掩码是变长的。在有类网络的基础上,拿出一部分主机ID作为子网ID。

◆ 超网:把多个小网络组合成一个大网络,称为超网(SuperNetting),也可以说子网掩码长度小于相对应的有类网络的叫超网。

◆ 子网:有类网络划分成更小后的网络,称为子网(Subnet),也可以说子网掩码长度大于相对应的有类网络的叫子网。

2、CIDR无类别域间路由

CIDR(Classless Inter-Domain Routing,无类别域间路由)本质是消除了传统的A类、B类和C类地址以及划分子网的概念,将多个地址块聚合在一起生成一个更大的网络,从而包含更多的主机。

CIDR采用8-30位可变网络ID(最大可用的只能为30位,即保留2位给主机位),而不是A、B、C类网络ID所用的固定的8、16和24位。
CIDR表示方法:IP地址/n,n表示IP地址中的前n位代表网络部分(n个二进制数1),其余(32-n)位代表主机部分。这种方法称为“斜线记法”,它又称为CIDR记法。

举个栗子:子网掩码255.255.255.192,用CIDR表示是多少呢?

①、首先确认的是这是个C类网络地址(C类的默认子网掩码为255.255.255.0)

②、前面三个字节都是255,转换成二进制都为1,即11111111.11111111.11111111,即24位1。

③、后面一个字节是192,转换成二进制为11000000,即1占用了2位。

④、子网掩码共占用了26位1,所以用CIDR表示为/26。

⑤、如果网络地址为192.168.10.0,再加上CIDR,最后表示为192.168.10.0/26。

CIDR支持路由聚合,能够将路由表中的许多路由条目合并为成更少的数目,因此可以限制路由器中路由表的增大,减少路由通告,减轻路由器的负担。

3、VLSM可变长子网掩码

VLSM(Variable Length Subnet Mask,可变长子网掩码)规定了在一个有类(A、B、C类)网络内包含多个子网掩码的能力,以及对一个子网的再进行子网划分的能力。

每一个IP地址都包含了2部分:网络号和主机号。在有类网络中,32bit的IP地址被分为4段,每段8bit来表示。这使得作为网络号的前缀必须是8位,16位或者24位。当网络号是24位的时候,主机号只有8位,也就是说,可分配的最小的地址块是256个(2^8=256,而实际可分配的主机地址还要减去两个,一个是网络地址,一个是广播地址,最后为254个),这个数量对于大多数企业来说是不够的。

而比这个大一点的IP地址块是网络号为16位的时候,这个时候可分配的地址块是65536(2^16=65536),这个数量对于大多数公司又太多了。这导致无论公司选择哪种类型的网络,都可能对IP地址造成大量的浪费。

IP地址如果只使用有类(A、B、C类)来划分,会造成大量的浪费或者不够用。VLSM的诞生有效的解决了这个问题,可以在有类网络的基础上,通过对IP地址的主机号进行再划分,把一部分划入网络号,就能划分各种类型大小的网络了。网络号也不再仅局限在8、16和24位这几个数,而是灵活变化的大小了。

4、CIDR与VLSM的区别

  • 在使用CIDR聚合地址时,将原来有类IP地址中的网络位划出一部分作为主机位使用。
  • 在使用VLSM划分子网时,将原来有类IP地址中的主机位按照需要划出一部分作为网络位使用。
  • CIDR:子网掩码往左边移,掩码netmask缩短了。
  • VLSM:子网掩码往右边移,掩码netmask增长了。
  • CIDR是把几个有类网络合成一个大的网络(超网),用于路由地址聚合。
  • VLSM是把一个有类网络分成几个小型网络(子网),用于更高效划分子网。

CIDR与VLSM总结:
在某种程度上来说,CIDR和VLSM它们之间可以看做是逆过程。
CIDR是把几个小网络聚合成一个大网络来做表示,而VLSM则是把一个大网络继续细分为几个小网络进行IP地址分配。
CIDR能让路由器的路由条目得到有效的减少,从而减少路由通告,降低路由器负担,而VLSM则是充分利用IP进行地址分配来解决IP地址不被浪费的问题,节约IP地址空间,更为有效的使用。

统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。 

小故事

作者:车小胖
链接:https://www.zhihu.com/question/56895036/answer/150953183
来源:知乎

从前有一个地主,有256间房子,地主家的门牌号码是“192.168.1”,那么他家第一间房子的门牌号码是192.168.1.0,第二间是192.168.1.1,…第256间的编号是192.168.1.255。

地主老了,需要把256间房子分给4个儿子,平均分配,每个儿子可以分64间。
请来一位先生主持公道,先生这么来操作:

192.168.1.0-192.168.1.63 分给大儿子
192.168.1.64-192.168.1.127 分给二儿子
192.168.1.128 -192.168.1.191 分给三儿子
192.168.1.192-192.168.1.255 分给四儿子

那如何来描述四个儿子的子网网段呢?

192.168.1.0/26
192.168.1.64/26
192.168.1.128/26
192.168.1.192/26

/26是什么鬼?255.255.255.192的二进制是多少?
“11111111-11111111-11111111-11”大家数数一共多少个1?不用数了,是26个1,为了简化子网掩码的表示,用/26代替255.255.255.192。按位与运算我们来看大儿子的网段192.168.1.0/26是如何得到的?

以大儿子的房间为例:192.168.1.0-192.168.1.63二进制表示:
192.168.1.011000000.10101000.00000001.00000000192.168.1.6311000000.10101000.00000001.00111111首尾地址完全相同的是多少?11000000.10101000.00000001.00数数一共多少位?26位!

那么用这个“192.168.1.0/26”就可以表示大儿子所有房间。对照房间的门牌号码“192.168.1.199”,很显然属于四儿子的。一个主机192.168.1.199/26 能否和直连主机192.168.1.200/24 通信?可以的,因为都是四儿子的房间。一个主机192.168.1.199/26 能否和直连主机192.168.1.1/24 通信? 不可以,因为一个是大儿子的房间,一个是四儿子的房间,无法直连通信!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

子网掩码使用详解 的相关文章

  • virtualbox已有虚拟硬盘扩容(不修改原有数据)

    virtualbox为ubuntu添加虚拟硬盘 大概的步骤如下 xff1a 在virtualbox上注册一个虚拟硬盘使用fdisk对硬盘进行分区mkfs ext4格式化硬盘修改uuid VBoxManage internalcommands
  • react资源

    MUI The React UI library for faster and easier web development React Table Lightweight and extensible data tables for Re
  • gitbook之node版本问题

    执行gitbook build出现错误 xff0c 执行gitbook serve也是会出错 错误如下 xff1a gitbook build usr local lib node modules gitbook cli node modu
  • 结构体定义寄存器方法(很流行哦)

    ARM寄存器数量之多 xff0c 叹为观止 xff01 幸运的是 xff0c 它都是以模块分布 xff0c 再依托C语言的模块化编程 xff0c 用户就没有必要记忆那么多的寄存器名称了 xff01 拿LPC1114来说 xff0c 单片机内
  • Arduino Uno安装设备时,出现了一个错误,这个INF中的服务安装段落无效

    问题 xff1a 在windows系统下 xff0c Uno安装设备时 xff0c 出现了一个错误 xff0c 这个INF中的服务安装段落无效 原因 xff1a 缺少系统文件 解决方案 xff1a 1 先下载 xff1a usbser zi
  • Vmware Unity模式

    ubuntu 12 04 之Vmware Unity模式 安装VMware Toolsudo add apt repository ppa gnome3 team gnome3sudo apt get install gnome shell
  • 状态机实现的三种方法-C语言

    1 参考 xff1a https www cnblogs com aaronLinux p 5705457 html 2 转载 xff1a http kb cnblogs com page 528972 3 参考 xff1a FSM TCP
  • 代码函数调用关系图

    代码函数调用关系 Graphviz 43 CodeViz http www linuxidc com Linux 2015 01 111501 htmCallgraph xff1a 静态分析 C 程序函数调用关系图cflow 43 grap
  • 错误:try using -rpath or -rpath-link

    在使用到动态库的时候 xff0c 出现错误如下 xff1a arm linux bin span class hljs keyword ld span warning libssl span class hljs preprocessor
  • Nestjs框架安装与启动

    Nest是构建高效可扩展的 Node js Web 应用程序的框架 默认使用JavaScript的超集TypeScript进行开发 环境准备 查看node和npm版本 node version v10 11 0 npm version 6
  • Vcpkg安装指定版本包或自定义安装包

    文章目录 前言寻找版本安装后话 前言 windows一直用着vcpkg作为C 43 43 跨平台开发的包管理 xff0c 有些依赖要指定版本库 xff0c vcpkg目前最新的openssl版本是3 1 0 xff0c 我想安装其他版本为例
  • git push不用输入密码(方法一)-git-credentials

    install git credentials sh 命令步骤 xff1a touch git credentialsecho 34 http username password 64 localhost 34 gt gt git cred
  • PCIe 配置空间:Status 寄存器

    1 Status 寄存器位置 2 Status 寄存器细节 2 1 特殊位 对于 PCIe 设备 xff0c status 寄存器中有几个 bit 的值是固定的 Bit 4 xff1a Capability List xff0c 该位必须为
  • C语言:魔方阵-全(图解+代码+结果输出)

    目录 前言 一 奇数阶阵 xff08 n 61 2k 43 1 结果输出 xff1a 二 偶数阶阵 xff08 n 61 2k 一 四倍偶数阶阵 xff08 n 61 4k 结果输出 xff1a 二 非四倍偶数阶阵 xff08 n 61 4
  • c语言 backtrace

    c语言 backtrace 版权声明 xff1a 本文为CSDN博主 zhouyuming hbxt 的原创文章 xff0c 遵循CC 4 0 BY SA版权协议 xff0c 转载请附上原文出处链接及本声明 原文链接 xff1a https
  • 图片添加水印 - 免费在线图片添加水印工具

    图片上怎么添加水印文字 xff1f 一刀工具箱提供在线给图片加水印 xff0c 照片上添加文字 xff0c 给图片加水印 xff0c 保证自己的图片不被别人侵犯 代码片段 startDown let that 61 this uni sho
  • MYSQL SSL配置与使用

    mysql5 6只支持TLS1 0 mysql5 7支持TLS1 1 1 登录后使用此命令查看是否开启ssl SHOW VARIABLES LIKE ssl 2 若未开启 制作证书 修改 etc my cnf文件 在mysqld标签下添加
  • JShaman新版来了,漂亮大气,国内最专业的JS代码加密平台!

    JS xff08 javascript xff09 代码混淆加密 xff0c JS加固 xff0c JS源码保护 xff01
  • 专业的JS混淆加密:JShaman轻量版,功能体验

    来自国内专业的JS混淆加密平台 xff1a JShaman xff0c 体验其全新的轻量版功能 从官网首页 xff0c 点击 本地部署 34 xff1a 再进入页面下方的 本地部署 轻量版 xff1a 轻量版的界面风格 xff0c 与官网保
  • 调用JShaman的Web API接口,实现JS代码加密。

    在NodeJS中 xff0c 调用JShaman的Web API接口 xff0c 实现JS代码加密 同样的方法 xff0c 也可把该功能集成到自己的产品或项目中 xff0c 让自己也具备JS加密功能 调用JShaman接口的源码非常简单 x

随机推荐

  • npm警告:npm WARN nest-app@0.0.1 No repository field.

    npm警告 npm WARN No repository field 使用npm安装第三方扩展包出现警告提示 npm WARN nest app 64 0 0 1 No repository field 查看本机版本 node versio
  • JShaman JS代码混淆加密效果

    JShaman JS代码混淆加密效果 关键字 xff1a js加密 js混淆 js代码混淆加密 JShaman是专业的JS代码混淆加密平台 xff0c 拥有数十种自研JS代码保护技术 以下展示部分功能效果 注1 xff1a 代码中红色 绿色
  • Node.JS中调用JShaman,加密JS代码

    在Node JS环境中 xff0c 调用JShaman的WebAPI接口 xff0c 对JS代码进行混淆加密 效果如下 xff1a 代码 xff1a js代码 var js code 61 96 function NewObject pre
  • 在Node.JS中调用JShaman接口,实现JS代码加密

    在Node JS中调用JShaman接口 xff0c 实现JS代码加密 使用axios库实现https的post请求 xff0c 代码如下 xff1a const axios 61 require 34 axios 34 const jsh
  • js加密混淆,jshaman和jscrambler哪个好用?

    在前端开发中 xff0c JavaScript混淆加密是一种十分重要的技术 xff0c 其可以防止代码被反编译以及保护代码的安全性 在市场上有很多的JavaScript混淆工具 xff0c 其中jshaman和jscrambler是两个非常
  • CMake Error at CMakeLists.txt:11

    背景 xff1a 编译opencv源码 问题 xff1a 用clion或者CMake命令时报错 xff0c 报错类型为 xff1a CMake Error at CMakeLists txt 11 message FATAL In sour
  • PHP出现Warning: A non-numeric value encountered问题的原因及解决方法

    PHP出现Warning A non numeric value encountered问题的原因及解决方法 参考文章 xff1a xff08 1 xff09 PHP出现Warning A non numeric value encount
  • openstack总结2_环境搭建+keystone模块安装

    上篇说到我的openstack的部署环境是ubuntu16 04 xff0c 安装的版本是ocata 其实我最开始安装的版本是mitaka 因为mitaka有中文的安装部署文档 官方的Demo配置是ubuntu14 04 43 mitaka
  • WSL(ubuntu2204)xfce4语言支持报错及配置WSL服务自启

    语言支持报错 在图形桌面或命令行打开语言支持报错 xff1a dbus exceptions DBusException org freedesktop DBus Error FileNotFound Failed to connect t
  • 设置未识别的网络默认为专用网络

    在WIN7 WIN2008R2中 xff0c 没有配置网关的网络连接默认是公用网络 比如双网卡做软路由的时候 xff0c 连接内网的网卡是不配置网关的 xff0c 如果开启防火墙而又被识别为公用网络有时候很不方便 修改默认为专用网络的操作如
  • 多模块,Maven无法下载依赖,仓库查看有这个版本但是无法下载,点reload也没用

    Maven无法下载依赖 xff0c 点reload也没用 配置文件正确 也不是maven版本问题 最后发现是pom文件里面的依赖是写在 这个标签内的 这个的作用是子模块当引入同个依赖的时候 xff0c 不需要去写版本号 但是父模块的pom文
  • 在TypeORM中使用实体@Entity与字段@Column注解

    在TypeORM中使用实体 64 Entity与字段 64 Column注解 客观存在并相互区别的事物称为实体 Entity 实体是一个抽象名词 xff0c 是指一个独立的事物个体 xff0c 自然界的一切具体存在的事物都可以看做一个实体
  • ubuntu 16.04升级到ubuntu 18.04

    昨天升级了一下ubuntu xff0c 发现升级过程不是很顺利 xff0c 我这里分享一下我的经验 xff0c 在升级前 xff0c 需要把所有的ppa软件源和相应的软件删除 然后执行下面的操作 xff1a sudo apt get upd
  • Ubuntu系统下载及安装教程

    ubuntu下载及系统安装步骤 说明 xff1a 本教程介绍的是安装DeskTop版的系统 1 官网下载镜像 官方网址 https ubuntu com download 进入官网后会有最新版本的镜像下载地址 xff0c 如果需要下载最新版
  • Xrdp编译报错configure failed for librfxcodec解决方案

    vnc对异地网络远程控制不是很友好 这段时间中午休息的时候总是会远程连回寝室电脑 于是将目标锁定了Xrdp 但是使用apt install xrdp安装的xrdp不支持声音 xff0c RDP版本也很低 那就干脆自己编译一个 遇到问题先百度
  • python解析.pyd文件

    有的时候 xff0c 为了对python文件进行加密 xff0c 会把python模块编译成 pyd文件 xff0c 供其他人调用 拿到一个 pyd文件 xff0c 在没有文档说明的情况下 xff0c 可以试试查看模块内的一些函数和类的用法
  • 字节与KB的关系

    1个二进制位 61 1位 8位 xff08 bit xff09 61 1字节bai xff08 Byte xff09 xff0c 1024字节 61 1KB 字节 xff1a 英文单词 xff1a xff08 byte xff09 xff0
  • AF_INET域与AF_UNIX域socket通信原理对比

    1 AF INET域socket通信过程 典型的TCP IP四层模型的通信过程 发送方 接收方依赖IP Port来标识 xff0c 即将本地的socket绑定到对应的IP端口上 xff0c 发送数据时 xff0c 指定对方的IP端口 xff
  • Ubuntu20.04 idea/pycharm 搜狗中文输入法不跟随光标问题

    概述 在 linux 平台下使用搜狗输入法在 IDEA PYCHARM xff08 pycharm2020 3 xff09 中输入中文时 xff0c 输入法候选框总是静止在 IDEA 的左下角 xff0c 而不能跟随光标进行移动 虽然不影响
  • 子网掩码使用详解

    一 子网掩码 IP地址是以网络号和主机号来标示网络上的主机的 xff0c 我们把网络号相同的主机称之为本地网络 xff0c 网络号不相同的主机称之为远程网络主机 xff0c 本地网络中的主机可以直接相互通信 xff1b 远程网络中的主机要相