Zhouyao's Blog

Do Something Big With Us

浅谈网络掩码

《浅谈网络掩码》

清晰地记得在知乎第一次回答网络掩码的问题,感觉已经写的很浅显了,但是一看评论区,还是有很多读者没有理解网络掩码到底是怎么一回事。于是开始仔细回忆当初自己是怎么理解网络掩码的,接下来的文字就是当初理解的过程,望能够给读者一点启发和帮助。

先抛开网络掩码不谈,咱们从最简单的开始,假定有一台主机,IP地址 = 1.1.1.1,没有网络掩码,连接在互联网上,问题来了,这台主机如何访问Internet上亿亿万万其它主机?

这还不简单,只要主机发送一个ARP广播,获得对方的MAC地址,那么就可以直接通信了啊,这是我当初美好的憧憬。这意味着全球所有主机都位于一个广播域,否则无法完成以上乌托邦式的幻想,对吗?

这样的网络通信可能吗?

全球20亿+的主机,每台主机每天发送的一条ARP广播,网络里就会被广播消息所挤满,压根没有带宽给主机们通信。

这样的网络安全吗?

一台恶意的主机,每天周期性地向网络里扔广播包,网络就会瘫痪。

综上所述,以上纯属不切实际的幻想。

计算机网络的先驱们是如何完美解决这个问题的?

主要归纳为以下几点:

1  将Internet分割成千千万万个广播域

2  一个广播域对应一个网段

3  一个网段内的主机之间的通信,通过ARP广播发现对方的MAC地址,直接通信

4  不同网段的主机之间的通信,需要把IP报文发给各自的网关,由网关代理转发通信

5  每个网段需要至少一台网关

6  一个网段的主机与其网关处于同一个网段,它们之间的通信方式请参考3

7  最最令人匪夷所思的一点在这里概括,这一点阻碍千千万万计算机网络初学者快速学习网络

7.1  主机与自己网关的直接通信

二层目的MAC = 网关的MAC

三层目的IP   = 网关的IP

7.2  主机A与其它网段的主机B通信,需要把流量发给自己的网关,代理通信

二层目的MAC = 网关的MAC

三层目的IP   = 主机B的IP

8  广播报文的活动范围仅限该广播域,网关收到广播报文不得将其从其它接口广播出去

问题又来了,如何将Internet分割成若干个广播域呢?

先来看一个例子:

主机A = 1.1.1.1

主机B = 1.1.1.129

主机C = 1.1.2.3

主机A想和主机B、C通信,是直接通信?还是网关代理转发通信?

主机A无从知道主机B、C是否和自己在同一个网段。

如果B、C和自己不在一个广播域,却使用ARP广播,是无论如何也发现不了对方的MAC地址,更谈不上通信。

如果B、C和自己在一个广播域,却使用网关代理通信,最终流量会被重定向到目的地,造成资源的浪费。

为了避免通信的不确定性,先驱们总要想点措施,让主机A可以独立判断是何种通信方式。这个措施就是网络掩码!

网络掩码

主机A = 1.1.1.1     255.255.255.0(网络掩码)

主机B = 1.1.1.131   255.255.255.0(网络掩码)

主机C = 1.1.2.3     255.255.255.0 (网络掩码)

主机A与主机B的通信

主机A用IP“1.1.1.1”与掩码“255.255.255.0”按位与,得到网段1.1.1.0。

主机A把主机B的IP “1.1.1.131”也采用相同的操作,也得到网段1.1.1.0。

既然网段相同,那么没什么好说的,直接发送ARP广播,就可以发IP报文发给对方了。

主机B的动作还A是一样的,反向的IP报文也可以流动到主机A,双向IP报文自由流动,并完成通信。

主机A与主机C的通信

A的网段 = 1.1.1.0

C的网段 = 1.1.2.0

既然不同,那么就需要网关介入。假定A的网关IP = 1.1.1.254。

于是ARP广播发现网关的MAC地址,然后把IP报文发给网关。

Destination MAC = 网关的MAC

Destination IP Address   = 1.1.2.3

网关接收到该IP报文,剥除掉二层以太网头部封装,那么就剩下IP报文了。

如果网关的某一个接口的IP地址,网段也是“1.1.2.0”,那么剩下的问题又变成了同一个网段的通信了,不是吗?

否则,网关会根据IP报文的目的IP  =“1.1.2.3”查找路由表,发给更靠近目的地“1.1.2.3”的下一跳路由器。

网络掩码为255.255.255.0的网段可以容纳多少台主机?

以主机A = 1.1.1.1 为例,掩码“255.255.255.0”一共24个二进制1,所以主机的IP 也经常写做1.1.1.1/24,其中的24就是掩码的长度,这个长度也是二进制1的长度。

24个二进制1,三个字节,也意味着主机A的从左到右的三个字节代表着网段,既1.1.1,那么右边剩下的一个字节就是主机可以使用地址空间了,可以这样来表示:

1.1.1.X

其中的X表示0-255的任意数字,那么这个网段一共有多少个地址空间呢?

0-255,一共256个地址。

1.1.1.0

通常保留,表示该网段地址,主机无法使用。

1.1.1.255

通常保留为该网段的广播地址,主机也无法使用。

那么该网段主机一共可以使用的IP地址= 256-2 =254个。

那么就可以得到公式:

网段可用的IP = 2 (32-掩码长度) – 2

如果想让一个广播域的主机变少,只需要将网络掩码的长度变长,比如

掩码长度为25,则得到

网段可用的IP = 2 (32-25)-2 = 27-2 = 128 -2 =126

掩码长度为26,则得到

网段可用的IP = 2 (32-26)-2 = 26-2 = 64 -2 =62

假设主机A与主机B的网络掩码长度为255.255.255.128,二进制长度为25位,则

主机A = 1.1.1.1/25

主机B = 1.1.1.131/25

那它们还在不在一个网段呢?

计算一下便知,

主机A的网段 = 1.1.1.0

主机B的网段 = 1.1.1.1228

很显然不在一个网段,那么就不能直接通信,需要借助网关才可以通信,不是吗?

看出来网络掩码的神奇之处了吗?

网络掩码的长度将决定着主机们是否在一个网段的唯一标尺。

如果想让广播域变小,即广播域里容纳的主机变少,可以增加网络掩码的长度。

如果想让广播域容纳更多的主机,将广播域变大,可以减小网络掩码的长度。

关于上一篇文章,为何网络掩码必须由连续的1或0组成,这里需要补充说明一点。

老王的资产:

8.x.x.x

8/8

老王的掩码长度为8,这个网段可以容纳主机 = 2(32-8)-2 = 224-2 = 16777214

上文也说过,如果想把该网段切割得更小一点,比如平均切割成两个,那么只要网络掩码增加一位即可。分割之后得两个网段分给两个儿子,其中:

王大明 8.0.x.x -8.127.x.x

8.0/9

王小明 8.128.x.x -8.255.x.x

8.128/9

很简单,只要将网络掩码长度增加1,分别找到两个网段得起始点,就可以表示两个网段了。

小明的大儿子,又分得小明一半的家产:

8.128/10

如果8.128/10网段的主机与8.0/10网段的主机通信,很显然这是不同网段的通信,需要网关介入才可以通信,对吗?

但如果掩码不是连续的1,而是这个样子的“11111111.01”

我们来重新计算 8.128.x.x 网段,都换算成二进制:

00001000.10  11111111.01

以上两者按位与的结果是

00001000.00 = 8.0

小明的大儿子的网段竟然和王大明是相同的,既然相同网段,那么使用ARP广播就可以发现王大明网段主机的MAC地址了?

可是它们并不是一个网段的,中间有网关的分割,ARP广播无法到达对方,因为网关会自动终结ARP广播报文。

而它们明明可以使用网关通信的啊!现在由于掩码的1的不连续,却无法通信!

而要避免这种通信的不确定性,所以要求网络掩码从左到右需要连续的1,中间不能夹杂着0。

 

文章转载自微信公众号—车小胖谈网络,浅谈网络掩码(https://mp.weixin.qq.com/s/86fyNrRCPdsSsEKCq2BEhA)

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

+ seventy nine = eighty eight

This site uses Akismet to reduce spam. Learn how your comment data is processed.