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