为什么访问网站时不用写子网掩码,但配置本机 IP 时必须写?

4 阅读4分钟

为什么访问网站时不用写子网掩码,但配置本机 IP 时必须写?

我以前一直有一个疑问。

我给自己电脑配 IP 的时候,通常不能只写一个 IP,还要再写子网掩码,比如:

IP: 192.168.1.10
Mask: 255.255.255.0
Gateway: 192.168.1.1

但我访问一个网站,或者访问一台服务器时,通常只需要写:

8.8.8.8

或者:

www.example.com

并没有谁让我再写一个“目标服务器的子网掩码”。

那问题就来了:

既然我自己有掩码,服务器自己也应该有掩码,那我访问服务器时,到底用谁的掩码?

这个问题真正的关键,不在服务器。

关键在于:

子网掩码不是目标地址的一部分。它是本机拿来做发送判断的一条规则。


一、为什么本机配置 IP 时必须带掩码?

因为如果只有一个 IP:

192.168.1.10

系统其实不知道:

我所在的本地网络范围到底有多大

比如下面这些地址:

192.168.1.20
192.168.2.20
192.168.100.20

哪些算“和我在同一个本地网络里”,哪些应该交给网关?

只看 192.168.1.10 这个 IP,本身是判断不出来的。

如果掩码是:

255.255.255.0

也就是 /24,那系统大致会把自己理解成:

192.168.1.0/24

这时 192.168.1.20 算本地网络。

但如果掩码换成:

255.255.0.0

也就是 /16,那系统理解的本地网络范围就变成:

192.168.0.0/16

这时 192.168.2.20 也可能被认为在本地网络里。

所以本机 IP 必须配掩码,不是为了告诉别人你是谁。

而是为了让系统知道:

我应该把哪些目标当成本地直连,哪些目标应该交给网关。


二、为什么访问目标时不用写“目标掩码”?

因为你访问目标时,告诉系统的只是:

我要访问谁

比如:

8.8.8.8

这个 IP 只是目标地址。

但“怎么去这个目标”,不是由目标服务器的掩码决定的。

而是由你本机的网络配置决定的。

也就是说,你发包时真正用到的是:

  • 本机 IP
  • 本机掩码
  • 本机路由表
  • 本机默认网关

你根本不需要先知道目标服务器自己的掩码。

因为你当前要解决的问题不是:

目标服务器觉得自己在哪个网段

而是:

从我这台机器出发,这个包下一步该交给谁

这就是为什么访问目标时不用写“目标掩码”。


三、本机真正拿掩码做的,是判断“目标在不在本地”

假设本机配置是:

IP: 192.168.1.10
Mask: 255.255.255.0
Gateway: 192.168.1.1

现在访问:

192.168.1.20

系统会用自己的掩码来判断:

192.168.1.10 & 255.255.255.0 = 192.168.1.0
192.168.1.20 & 255.255.255.0 = 192.168.1.0

两个结果一样,说明目标在同一个本地网络里。

这时本机就知道:

可以直接找它

于是它会在本地网络里用 ARP 去找这个目标 IP 对应的 MAC。

也就是说,这时候本机做的判断其实是:

这个目标离我够近,可以直接交给它

四、如果目标不在本地网络,本机就交给网关

现在如果访问的是:

8.8.8.8

本机还是只用自己的掩码来算:

192.168.1.10 & 255.255.255.0 = 192.168.1.0
8.8.8.8 & 255.255.255.0 = 8.8.8.0

结果不一样。

于是本机知道:

这个目标不在我的本地网络里

那它接下来不会去找 8.8.8.8 的 MAC。

它会做的事是:

把包先交给默认网关

也就是:

下一跳先走 192.168.1.1

所以这里真正起作用的,不是“目标的掩码”。

而是:

本机用自己的掩码先判断目标远不远,再决定是直连还是交给网关。


五、所以“到底用谁的掩码”,答案其实很简单

答案就是:

谁在发包,谁用自己的掩码和路由表。

客户端发请求时,客户端用自己的掩码和路由表来判断下一跳。

服务器回响应时,服务器再用它自己的掩码和路由表来判断下一跳。

路由器继续转发时,也是路由器用自己的路由表在做判断。

它不是双方先交换掩码,再协商一套结果。

也不是客户端拿服务器的掩码来决定怎么发。

每一台机器,都只负责自己这一次发送动作。

所以这个问题真正想通以后,你会发现:

子网掩码不是“目标地址自带的信息”,而是当前发包机器本地的一条判断规则。


最后一句

配置本机 IP 时必须写掩码,是因为系统需要知道本地网络范围;访问服务器时不用写目标掩码,是因为发包时真正起作用的是本机自己的掩码、路由表和网关。掩码不是目标地址的一部分,而是本机用来判断“目标在不在本地、下一跳该交给谁”的规则。