清晰地记得在知乎第一次回答网络掩码的问题,感觉已经写的很浅显了,但是一看评论区,还是有很多读者没有理解网络掩码到底是怎么一回事。于是开始仔细回忆当初自己是怎么理解网络掩码的,接下来的文字就是当初理解的过程,望能够给读者一点启发和帮助。
先抛开网络掩码不谈,咱们从最简单的开始,假定有一台主机,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)