子网掩码是如何生效的&子网掩码的作用

整个转发过程只有一条规则:查自己的路由表。主机和路由器做的是同一件事,只是表的行数不同。由此推出掩码是什么、网关是什么、以及「掩码不同能不能通」的全部答案。

写这篇之前,我一直以为子网掩码就是用来划分网段的。但公司内网里见到的情况对不上:两台机器明明属于不同的网络——子网掩码和网关都不一样——却能互相连通。我猜它们接的那台路由器上面还有一层设备,把两个网段接在了一起。这个猜测对不对、掩码在这中间到底起了什么作用,值得弄清楚。

所以这篇文章只做两件事:先构建出一套通用的模型,然后拿它去跑每一种情况。

模型

整个过程只有一条规则

不管是你的电脑、公司的路由器,还是运营商机房里的路由器,拿到一个包之后做的事都一样:

任何一台设备拿到一个包在自己的路由表里找目的 IP 落在哪一条?落在一条「直连」上直接送给对方本人,到此结束落在一条「下一跳」上交给它,目的 IP 一个字节没改一条都不落丢弃,回「网络不可达」它拿到之后,从头一模一样再跑一遍这张图
这条规则不分主机和路由器,每一台设备拿到包都跑一遍。

就是这么简单的规则,包每经过一台设备就跑一遍。

主机的路由表

对于一台主机来说,这条规则在一张只有两行的表上跑:

A 的路由表
A = 192.168.1.10 /24,网关 192.168.1.1
目的类型怎么走这一行由谁定
192.168.1.0/24直连直接送给对方掩码算出来的
0.0.0.0/0下一跳交给 192.168.1.1「网关」那一栏配的
第一行是掩码的全部作用,第二行是网关的全部作用。

掩码和网关对于主机的意义,就是维护这样的两行路由表。

路由器的路由表

路由器的路由表
接口① 192.168.1.1 /24 接口② 192.168.2.1 /24 上联交给运营商
目的类型怎么走这一行由谁定
192.168.1.0/24直连从接口①直接送接口①那个地址算出来的
192.168.2.0/24直连从接口②直接送接口②那个地址算出来的
0.0.0.0/0下一跳交给运营商上联配的
条目的类型一种也没多、规则一个字没变,只是它有两个接口,于是有两行直连。

提示

这里的接口是什么?

接口是一个配了 IP 和掩码的三层入口。它背后可能是一个网口,也可能是一堆桥在一起的网口。

接口哪些网口网段
家用路由器的 LAN 接口LAN1–4 加 WiFi192.168.1.0/24
交换机上 VLAN 10端口 1–8192.168.1.0/24
交换机上 VLAN 20端口 9–16192.168.2.0/24

最长前缀匹配

一个目的 IP 可能同时落进好几行。规矩是前缀越长越优先/32 胜过 /24/24 胜过 /0

目的 192.168.2.10 落在路由器表的哪一行
它同时落在这两行里,前缀长的那行赢
目的类型怎么走这一行由谁定
192.168.2.0/24← 落在这一行直连从接口②直接送前缀 24 位,更具体
0.0.0.0/0← 不中下一跳交给运营商前缀 0 位,最不具体
任何 IP 都落在 0.0.0.0/0 里,而它永远排最后——「默认路由」这个名字就是这么来的。

掩码生效在哪一步

掩码的作用只有一个:生成「直连」那一行。主机和路由器都一样——主机拿自己的 IP 和掩码算出第一行,路由器每个接口各算出一行。

所以主机发包时那次「和掩码做运算再比较」并不是另一套机制,它就是在判断第一行中不中。下面这对机器为例(也正是后面的第 2 种情况,先把算法本身看清楚):

主机IP掩码
A192.168.1.10/24
B192.168.1.200/25
A 拿自己的 /24 掩码算两次
192.168.1.200&/24=192.168.1.0
A 认为的「B 的网段」
192.168.1.10&/24=192.168.1.0
A 自己的网段
两个结果是同一个,落在第一行,直接送给 B
B 拿自己的 /25 掩码算两次
192.168.1.200&/25=192.168.1.128
B 自己的网段
192.168.1.10&/25=192.168.1.0
B 认为的「A 的网段」
两个结果不是同一个,不符合直连,交给网关处理
同一对机器,A 是 /24、B 是 /25,于是两边算出了相反的结论。

掩码是每台主机自己私有的一个参数,只在自己计算的时候使用。IP 包头里根本没有掩码这个字段,所以对方的掩码是多少,你无从知晓。

拿模型跑各种情况

1、掩码不同,但两边都认对方在本段

交换机同一广播域A192.168.1.10/24B192.168.1.20/25

各自算各自的第一行,看对方在不在里面:

192.168.1.0.128.255A /24本段 .0 – .255.20(B)在里面B /25本段 .0 – .127.10(A)在里面
两条线段长短不一样,但都把对方盖在里面了。

两者可以互相直连。

2、只有一方认

把 B 的地址换到轴的右半边,掩码不动:

交换机同一广播域A192.168.1.10/24B192.168.1.200/25
192.168.1.0.128.255A /24本段 .0 – .255.200(B)在里面B /25本段 .128 – .255.10(A)不在里面
B 那条线段整个挪到了右半边,A 掉在它外面——两边的世界观第一次出现分歧。

于是两趟落在了不同的行上:

A 发给 B命中第一行
AB直接送达
B 发回 A第一行不中,掉到第二行
B网关看网关的表
网关拿到包之后跑的是同一条规则,下场见下面三种。
网关 192.168.1.129,接口配 /24它算出来的直连是 192.168.1.0/24,.10 命中
B网关 192.168.1.129A
去程直连、回程绕一跳,路径不对称。网关还会顺手告诉 B「以后直接找 A 就行」(ICMP 重定向)。
网关 192.168.1.129,接口配 /25它算出来的直连是 192.168.1.128/25,.10 不中
B网关 192.168.1.129上层外网扔进上游黑洞
掉到了网关自己的默认路由上,包被送出局域网然后丢掉。
B 根本没配网关第一行不中、又没有第二行,一条都不落
B回包压根没发出去
不是发出去之后失踪了,是在本机就丢了,当场报网络不可达。
网关的地址一个字没改、只动了它的掩码,就是完全不同的下场——而这两台机器什么都没动。

提示

为什么这里的网关是 .129 而不是 .1

因为网关自己也得先送得到。B 的第一行是 192.168.1.128/25192.168.1.1 不在里面——它既不命中第一行,又正是第二行要交出去的那个对象,等于自己指着自己。所以下一跳必须落在自己的直连段里,配成 .1 的话系统会直接拒绝这条路由。

3、网段不一样

交换机A192.168.1.10/24C192.168.2.10/24

这次两趟的第一行都不中:

A 发给 C第一行不中,掉到第二行
A192.168.1.1看这台网关的表
C 发回 A第一行不中,掉到第二行
C192.168.2.1看那台网关的表
两个包各奔各的网关,谁也没有直接看过对方一眼。

要让两趟都走通,需要有一台设备在这两段里各有一个接口——它表里因此有两行直连,两个方向都直接命中:

路由器192.168.1.1 /24192.168.2.1 /24交换机A192.168.1.10/24C192.168.2.10/24
A 发给 C(有了这台路由器之后)路由器表里 192.168.2.0/24 是直连,直接命中
A接口① 192.168.1.1接口② 192.168.2.1C送达
没有这台设备的话,包会掉到网关自己的默认路由上,被送出局域网然后丢掉。

所以让两个网段互通,解法只有两个:把地址改到同一个网段,或者放一台在两段里各有一个接口的设备(家用路由器、三层交换机都算)。

广播问题

掩码把 32 位切成两截:为 1 的那些位是网络位,剩下的是主机位。主机位全 0 的那个地址是这一段的网络地址,全 1 的那个是这一段的广播地址

IP192.168.1.1011000000101010000000000100001010
掩码255.255.255.011111111111111111111111100000000
网络地址主机位全 0192.168.1.011000000101010000000000100000000
广播地址主机位全 1192.168.1.25511000000101010000000000111111111
网络位(掩码为 1 的那些位)主机位
掩码为 1 的那些位是网络位,剩下的是主机位。两个地址都由这条分界线定死。

这两个地址把可以分配给主机的范围夹在中间,而它们自己都不能分配给任何主机。

广播包一样要查表、一样命中第一行,区别只在命中之后:它不是送给某一台机器,而是在二层上喊给一整段,意思是「本段里所有人都收下」。可「本段」有多大,恰恰是第一行圈出来的,于是掩码不一致时两边圈出的人群就不是同一批:

192.168.1.0.128.255A /24本段 .0 – .255A 的广播地址 .255B /25本段 .0 – .127B 的广播地址 .127
同一根线上的两台机器,两条线段的右端点不在一处,于是各自的广播地址也不是同一个。
A 往 192.168.1.255 喊一嗓子那是 A 自己算出来的广播地址
A192.168.1.255B 不理
B 的广播地址是 .127,.255 压根不在它的本段里,在它眼里只是一台普通主机的地址,不是「叫我」。

这会导致一类特别难查的故障:两台机器互相点对点访问明明是通的(那是第一行命中的功劳),但凡是依赖广播做发现的东西全部失灵——局域网里的设备发现、某些打印机和 NAS 的自动搜索、老式的网上邻居、部分游戏的联机列表,都会莫名其妙看不到对方。

提示

DHCP 不受这个影响。它用的是 255.255.255.255 这个受限广播地址,不经过掩码计算,所以掩码配错的机器照样能拿到地址——而且拿到的往往就是正确的掩码,故障因此自愈了。这也是为什么这类问题几乎只出现在手工配置静态 IP 的机器上。

评论

评论加载中……

登录后再评论

注册要用邮箱收个验证码,只为确认邮箱能收信,不会拿去做别的。账号设置