彻底理解 IP 地址,子网掩码,子网划分
原文地址:https://oldme.net/article/55彻底理解 IP 地址,子网掩码,子网划分
什么是 IP 协议
在回答什么是 IP 协议前,我们先需要回答另外一个问题:什么是网络?从普通人的角度看,网络无非是手机上的一个 WIFI 标志,是电脑上一根网线而已。但是从学术角度上看,网络是一组硬件软件的集合体,是无数先贤的汗水与智慧的结晶,是横跨四大洋七大洲,连接无数人喜怒哀乐的桥梁。
IP 协议是众多网络协议中的一个基础协议,它位于 OSI 模型中的网络层。IP 协议有几个版本,比较重要的是 IPV4 和 IPV6,当前在互联网广泛使用的是 IPV4,未来会被 IPV6 取代,本文着重叙述 IPV4 协议。
IP 协议既然是协议,那么它的作用就是就是制定一个标准。那么 IP 协议到底制定了哪些标准,这些标准又带来了什么呢?如果将这个问题展开来说,未免篇幅太长,所以我们将从 IP 地址,子网划分两个大方面来切入 IP 协议。如果你有兴趣查看整个 IPV4 协议的标准,可以查看 IETF 于 1981 年 9 月发布的 RFC 791
IP 协议在设定之初,就假定网络硬件基础设施是不可靠的,比如因天气原因导致的光纤中断或者停电导致的设备断电,并且其使用的是动态连接和节点,也就是说不存在中心监控跟踪和维护网络状态。由于这种设计的结果,IP 协议只能做到尽最大努力的投送报文。这样就会带来几个显而易见的问题:
- 数据损坏或者丢失,例如从南京向上海发送十个报文,在苏州可能某条光纤中断,导致最终上海只收到了九个报文;
- 数据乱序或者重复,还是上面的例子,上海可能收到超过十个报文,而且收到报文的顺序也极有可能是杂乱无章的。
IP 协议只保证尽最大努力发送报文,至于数据是否准确,则是 OSI 模型更上一层的工作,也就是传输层。例如著名的 TCP 协议就是一种传输控制协议,不过这是后话了。
IP 地址
IP 地址被规定是一个 32 位的二进制数字。例如 11000000 10101000 00000001 00000011
就是一个 IP 地址,为了方便人类认知和记忆,可以用点分十进制来表示它:198.168.1.89
。IP 地址一共可以标识 2^32
次方个设备,也就是 4,294,967,296
个。依据 RFC 791 的描述, IP 地址有两个非常重要的作用:表示设备位置并且找到它,说白话,就是找到一台设备在哪。试想这些地址均匀的分布到地球的每个角落,你该怎么快速找到其中的一个呢?很直觉的,理所应当的想到了分类,所以 IP 地址被分成了 A,B,C,D,E 五类,D 类用作多播地址,E 类保留使用,所以我们这里只讨论 A,B,C 三类 IP 地址。
IP 地址该如何合理的分类呢?首先需要将 IP 地址拆成三部分,网络标识位,网络号,主机号,这个概念十分重要,是理解 IP 地址的核心基础,如图所示:
首先我们来理解这张图,以 B 类地址举例,依据 IP 协议的规定,B 类地址的高位是 10,也就是网络标识位,紧随其后的的十四位属于网络号,最后的 16 位是主机号。也就是说,凡是一个 IP 地址的高位是 10,那么这个归属于 B 类 IP 地址。假使出现一个这样的 IP 地址,10111101 00001010 01011010 00010100(189.10.90.20)
,那么其网络号和主机号如下图所示:
网络号用于标识该网在哪,主机号用于标识该主机在哪,同网络号的主机可以相互通信,不用网络号的主句则必须经过网关(路由器)。IP 地址之所以这么设计,就是为了管理 IP 地址和寻址。根据上文所述,我们可以归纳出详细的 IP 地址的分类表格:
描述 | A 类 | B类 | C 类 |
网络标识位 | 0 | 10 | 110 |
IP地址范围 | 0.0.0.0 - 127.255.255.255 | 128.0.0.0 - 191.255.255.255 | 192.0.0.0 - 223.255.255.255 |
可用IP地址范围 | 1.0.0.1 - 127.255.255.254 | 128.0.0.1 - 191.255.255.254 | 192.0.0.1 - 223.255.255.254 |
网络数量 | 126(2^7 - 2) | 16384 (2^14) | 2097152 (2 ^ 21) |
每个网络可用主机 | 16777214 (2^24 - 2) | 65534 (2 ^ 16 - 2) | 254 (2^8 - 2) |
上述的 IP 地址范围可以通过二进制 IP 地址计算出来,例如 A 类地址,其开头必然是 00000000 00000000 00000000 00000000
,结尾必然是 01111111 11111111 11111111 11111111
,点分十进制表达就是 0.0.0.0 - 127.255.255.255
。因为 A 类地址网络号是 7 位,主机号是 24 位,所以网络数量和主机数量也很容易计算出来。那么为什么每个网络中的主机需要减 2, A 类地址的网络数量也需要减 2 呢?
首先回答第一个问题。每个网络的主机号全 0 代表网络其本身,全 1 用作广播地址,所以对于 192.168.1
这个网络号,192.168.1.0
代表本网络,192.168.1.255
用作广播。广播的用作是在本网络中的所有主机之间发送数据包,即一个发送方,多个接收方,接收方自行决定接收到报文后使用还是丢弃。
再回答第二个问题。A 类地址的 128 个网络中被保留了两个网络号,分别是 7 位全 0 (0.0.0.0)
和全 1 (127.0.0.0)
。0.0.0.0
用作广播到本机所有的地址,所以在程序开发中,它可以用作监听本机的所有地址。127.0.0.0 用作环回测试,也就是说除了 127.0.0.1
和 127.0.0.255
这两个特殊主机地址之外,其他的地址都指向自己,我们常用 127.0.0.1
代表自己,其实 127.0.0.1 - 127.0.0.254
都代表自己,都可以 ping 通,不信你可以试试。
子网划分
在一个 B 类网络地址中,仍然可以容纳 65534 台主机。然而在实际的应用中,很少有组织可以使用到这么庞大的网络,另外由于主机数量大,导致同一网络传播路径就会变的更远,从而影响同网传播效率。所以为了更高效的传播信息,我们需要将一个网络拆开成许多个子网,就像现实中一个城市也需要拆分成几个区。经由子网划分后,同一个 B 类网络对内划分出了若干个子网,对外则还是一张网。
怎么完成子网划分呢?我们需要引出另外一个新的概念:子网掩码。子网掩码和 IP 地址一样,由一个 32 位的二进制数字组成,一般来说,子网掩码由高位部分连续的 1 和地位部分连续的 0 组成。来看一张图:
对于 189.10.90.20
这个 IP 地址来说,原本是由网络标识位+网络号+主机号三部分构成,经由子网划分后,变成了网络标识位+网络号+子网号+主机号四部分构成,表达为 189.10.90.20/20
。IP 地址后的 20 即代表子网掩码的高位由 20 个连续的 1 构成,点分十进制表示为 255.255.240.0
,因为主机号被子网掩码占用 4 位,所以主机位变成了 12 位,可容纳的主机也变成了 4092(2^12 - 2)
个,这个 IP 地址的子网号为 0101(5)。
同一网段的判断
如果没有子网划分,189.10.90.20
和 189.10.200.20
这两个 IP 是在同一 B 类网络下,可以不经由网关直接通讯,但假使我们使用了 20 这个子网掩码进行子网划分,两者还能直接通讯吗?答案是不能,因为二者不在同一子网下。我们可以使用子网掩码和 IP 地址进行 and 运算,如果结果是相同的,则处于同一网络下,可以直接通讯。还是以 189.10
这个网络号,20
为掩码为例:
IP地址 | 计算过程 | 结果 |
189.10.90.20 | 189.10.90.20 & 255.255.240.0 | 10111101000010100101000000000000 |
189.10.200.20 | 189.10.200.20 & 255.255.240.0 | 10111101000010101100000000000000 |
189.10.202.20 | 189.10.202.20 & 255.255.240.0 | 10111101000010101100000000000000 |
关于位运算,如果你不太清楚,可以点此了解。
可见,90.20
和 200.20,202.20
不在同一网络下,而 200.20,202.20
在同一网络下,可以直接通讯。最后提问一个问题:192.168.1.1/26
和 192.168.1.89/26
是否可以直接通讯?
默认子网掩码
对于 A,B,C 类的地址,它们也有着默认的子网掩码:
类型 | 子网掩码 |
A 类地址 | 255.0.0.0,十进制表示:8 |
B 类地址 | 255.255.0.0,十进制表示:16 |
C 类地址 | 255.255.255.0,十进制表示:24。我们常在局域网中配的掩码正是来源于此,代表 C 类地址没有划分子网。 |
私有地址
在 RFC 1918 中保留了一些地址做为私有地址,私有地址不能直接接入公网,而公网也不会分配私有地址到公网上。私有地址仅作为家庭或组织内部使用,私有地址如下:
类型 | 范围 | 子网掩码 | IP 数量 |
A 类地址 | 10.0.0.0 - 10.255.255.255 | 10.0.0.0/8 | 16,777,216 |
B 类地址 | 172.16.0.0 - 172.31.255.255 | 172.16.0.0/12 | 1,048,576 |
C 类地址 | 192.168.0.0 - 192.168.255.255 | 192.168.0.0/16 | 65,536 |
彻底理解 IP 地址,子网掩码,子网划分的更多相关文章
- IP2——IP地址和子网划分学习笔记之《子网掩码详解》
2018-05-04 16:21:21 在学习掌握了前面的<进制计数><IP地址详解>这两部分知识后,要学习子网划分,首先就要必须知道子网掩码,只有掌握了子网掩码这部分内容 ...
- IP地址和子网划分学习笔记之《IP地址详解》
2018-05-03 18:47:37 在学习IP地址和子网划分前,必须对进制计数有一定了解,尤其是二进制和十进制之间的相互转换,对于我们掌握IP地址和子网的划分非常有帮助,可参看如下目录详文. ...
- IP地址和子网划分学习笔记之《预备知识:进制计数》
一.序:IP地址和子网划分学习笔记开篇 只要记住你的名字,不管你在世界的哪个地方,我一定会去见你.——新海诚 电影<你的名字> 在我们的日常生活中,每个人的名字对应一个唯一的身(敏)份(感 ...
- IP地址与子网划分
IP地址与子网划分 目录 IP地址与子网划分 一.IP地址(Internet Protocol Address) 1.IP地址的表示 2.IP地址的组成 3.IP地址的分类 (1)A类IP地址 (2) ...
- IP地址和子网划分
前期知识准备 二进制 和十进制 二进制数据是用0和1表示的数,进位规则为缝二进1, 二进制和十进制的关系 二进 十进 0 1 10 2 100 4 1000 8 10000 16 10000 ...
- 【转载】IP地址和子网划分学习笔记之《子网掩码详解》
原文地址: https://blog.51cto.com/6930123/2112748 一.子网掩码 IP地址是以网络号和主机号来标示网络上的主机的,我们把网络号相同的主机称之为本地网络,网络号不相 ...
- 第5章 IP地址和子网划分(1)_IP格式和子网掩码
1. 二进制和十进制 (1)二进制与十进制的对应关系 ①128为数轴的中点,最高位为1.其后的数,二进制最高位均为1.其前面的数二进制最高位均为0. ②192为128-255中间的数,最高两位为1.2 ...
- IP地址及其子网划分
说实话,弄到子网划分的时候还是及其头晕的,又是这又是那的,现在我们来讲解一下这些东西, 首先我们来介绍一下IP地址,要弄清子网划分,子网掩码首先还是要弄清IP地址的划分 IP地址是给Internet上 ...
- 网络基础之IP地址与子网划分
IP地址 Ipv4地址格式:点分十进制 IP地址的分类 A类 B类 C类: D类:组播 E类: 公共IP地址 私有IP地址 特殊地址 保留地址 子网掩码 什么是子网掩码 CIDR表示法 子网划分 为啥 ...
- 第5章 IP地址和子网划分(4)_超网合并网段
7. 超网合并网段 7.1 合并网段 (1)子网划分是将一个网络的主机位当网络位,来划分出多个子网.而多个网段合并成一个大网段,合并后的网段称为超网. (2)需求分析 某企业有一个网段,该网段有200 ...
随机推荐
- Ubuntu本地安装Docker
Ubuntu本地安装Docker 目录 Ubuntu本地安装Docker 查看Ubuntu系统版本代号 安装 修改镜像源 官方文档:Install Docker Engine on Ubuntu | ...
- 【Hearts Of Iron IV】钢铁雄心4 安装笔记
一.解决Steam购买游戏和下载问题 我可能是正版受害者 Steam平台这个游戏本体是购买锁国区的 然后在淘宝上面买激活码激活的 都激活过了的Key,所以放出来也无所谓了 钢铁雄心4学员版本体:7B0 ...
- 【Java】Reflection 反射机制 03调用
调用属性,方法,构造器 属性调用 @Test public void fieldCall() throws NoSuchFieldException, IllegalAccessException, ...
- 【H5】10 嵌入技术
到目前为止,您应该掌握了将图像.视频和音频嵌入到网页上的诀窍了. 此刻,让我们继续深入学习,来看一些能让您在网页中嵌入各种内容类型的元素: <iframe>, <embed> ...
- 【Vue】03 Slot 插槽 & 自定义事件
顾名思义就是一个槽,可以嵌入各种各样的东西 Vue的插槽就是一个slot标签,可以在这个定义了插槽的组件中插入其他的组件 但是有一点很重要:使用插槽的组件必须要用div标签一个根标签包裹,否则无效 & ...
- 人形机器人从人类演示(demenstration)数据中学习人类行为(behavior)的几种方式
人形机器人从人类演示(demenstration)数据中学习的几种方式 使用仿真环境,在仿真环境中生成近似人类的行为数据,然后利用仿真生成的数据训练机器人. 该种方式最为传统,也最为易行,但是由于仿真 ...
- MindSpore分布式并行训练 (GPU-Docker)mindspore—1.2.1—gpu—docker版本运行报错,Failed to init nccl communicator for group,init nccl communicator for group nccl_world_group
如题目所述: 计算框架MindSpore分布式并行训练报错,具体版本:docker-gpu-1.2.1 运行环境: 硬件:Intel CPU, 4卡泰坦 软件:Ubuntu18.04宿主机,docke ...
- 设计和实现AI算法算法时有没有必要在代码中加注释,没有用必要在实现之前弄个UML图???
问题如题: 设计和实现AI算法算法时有没有必要在代码中加注释,没有用必要在实现之前弄个UML图??? 今天看到一个博文: https://www.cnblogs.com/siyuanwai/p/154 ...
- 清除 Nuxt 状态缓存:clearNuxtState
title: 清除 Nuxt 状态缓存:clearNuxtState date: 2024/8/7 updated: 2024/8/7 author: cmdragon excerpt: 摘要:本文介 ...
- inline,static inline
https://blog.csdn.net/A_BCDEF_/article/details/89485894 inline 函数被调用时,需要出栈入栈.当函数频繁被调用时,则不断地有函数出栈入栈,会 ...