从 IP 地址到 NAT:你的设备是怎么上网的
打开笔记本,连上 WiFi,浏览器就能刷网页。这中间的事情看起来「自动」得理所当然,但只要随便追问一句——我的设备凭什么能和远端服务器通信?为什么家里五六台设备只有一个宽带账号?——就会发现背后藏着一整条链路。
这篇把 IP 地址、子网掩码、DHCP、NAT 四件事按顺序串起来讲。它们不是孤立的知识点,而是设备从「插上网线 / 连上 WiFi」到「能上网」这条路上依次经过的四个环节。
IP 地址:设备的门牌号
网络里的每台设备要通信,就得有个地址让对方找到自己。IP 地址就是这个门牌号。
IPv4 地址由 4 个字节组成,每个字节取值 0-255,用点分开写:
192.168.1.100
10.0.0.1
8.8.8.8
但不是所有地址都能在公网上出现。RFC 1918 划出了三段地址,专门留给内网(局域网)使用:
| 范围 | CIDR 写法 | 常见场景 |
|---|---|---|
| 10.0.0.0 – 10.255.255.255 | 10.0.0.0/8 | 企业内网、云 VPC |
| 172.16.0.0 – 172.31.255.255 | 172.16.0.0/12 | 较少见,Docker 默认网桥用这段 |
| 192.168.0.0 – 192.168.255.255 | 192.168.0.0/16 | 家庭路由器最常见 |
所以你在家里看到的 192.168.1.x、在公司看到的 10.x.x.x,都是内网地址。这些地址不会出现在公网上,不同的局域网里可以重复使用——就像不同小区都能有「1 栋 101 室」,不会冲突,因为它们在不同的小区里。
那公网地址呢?ISP(运营商)分配给你家路由器的那个地址才是公网地址,全球唯一。后面讲 NAT 的时候会回到这件事。
子网掩码:谁跟谁在同一个网段
有了 IP 地址还不够。设备要发数据包的时候需要知道一件事:目标和我在同一个局域网里吗?
如果在同一个网段,数据包直接发就行(走二层,不经过路由器)。如果不在,数据包得先交给网关(路由器),让它帮忙转发。
判断「同不同网段」的工具就是子网掩码。
先说清楚「网段」是什么
网段就是一组能直接通信的设备的集合。想象一栋办公楼:同一层的人可以直接走过去说话,但要找另一层的人就得坐电梯。这里「一层楼」就是一个网段,「电梯」就是路由器(网关)。
具体到 IP 地址:192.168.1.100 和 192.168.1.200 在同一个网段,数据包直接发送,不经过路由器。但 192.168.1.100 和 192.168.2.100 虽然只差一个数字,却可能不在同一个网段——取决于子网掩码画的那条线在哪里。
掩码怎么画这条线
子网掩码和 IP 地址一样是 32 位。掩码为 1 的位对应「网络部分」(相当于楼层号),为 0 的位对应「主机部分」(相当于楼层内的工位号)。把 IP 地址和掩码做按位与(AND),得到的就是网络地址——可以理解为「楼层号」。两台设备算出来的网络地址相同,它们就在同一个网段。
举个例子,子网掩码 255.255.255.0 换成二进制是前 24 位全 1、后 8 位全 0:
IP 地址: 192.168.1.100 → 11000000.10101000.00000001.01100100
子网掩码: 255.255.255.0 → 11111111.11111111.11111111.00000000
AND 结果: 192.168.1.0 → 11000000.10101000.00000001.00000000
所以 192.168.1.100 和 192.168.1.200 做完 AND 都得到 192.168.1.0——同一网段。而 192.168.2.100 算出来是 192.168.2.0,不同网段,走网关。
CIDR 表示法
写掩码有个更简洁的方式:直接写前缀里有多少个 1。255.255.255.0 就是 /24,255.255.0.0 就是 /16。
常见的几个:
| CIDR | 掩码 | 主机位数 | 可用主机数 |
|---|---|---|---|
| /8 | 255.0.0.0 | 24 | 16,777,214 |
| /16 | 255.255.0.0 | 16 | 65,534 |
| /24 | 255.255.255.0 | 8 | 254 |
| /28 | 255.255.255.240 | 4 | 14 |
可用主机数的算法:2 的主机位次方减 2。减掉的两个一个是网络地址(主机位全 0),一个是广播地址(主机位全 1),都不能分配给设备。
以 /24 为例:2^8 - 2 = 254 台,地址范围 .1 到 .254。家用路由器给你分的通常就是这个网段,够用了。
划子网是在干什么
一个大网段可以切成更小的子网。比如公司拿到一个 /24 网段(254 台),可以切成 4 个 /26(每段 62 台),分给不同部门。掩码越长,网段越小,能容纳的主机越少——这就是「子网划分」。
不想算二进制:步长速算
每次都转二进制做 AND 太慢。有个速算法只需要一步减法:步长 = 256 - 掩码关键字节。
「关键字节」是掩码里不是 255 也不是 0 的那个字节。比如 255.255.252.0,关键字节是 252,步长 = 256 - 252 = 4。
有了步长,三个问题都能口算:
网络地址:拿 IP 的对应字节除以步长,向下取整再乘回去。比如 IP 是 192.168.21.x,步长 4:21 ÷ 4 = 5.25,向下取整 5,5 × 4 = 20 → 网络地址 192.168.20.0。
广播地址:网络地址的关键字节 + 步长 - 1,后面的字节填 255。20 + 4 - 1 = 23 → 广播地址 192.168.23.255。
可用主机数:步长乘以后面字节的总数,再减 2。步长 4,后面还有 1 个字节(256 个值),4 × 256 - 2 = 1022。
再验证一个:IP 10.20.130.50,掩码 255.255.192.0。关键字节 192,步长 = 256 - 192 = 64。130 ÷ 64 = 2.03,向下取整 2,2 × 64 = 128 → 网络地址 10.20.128.0,广播地址 10.20.191.255(128 + 64 - 1 = 191),可用主机 64 × 256 - 2 = 16382。
关键字节也不是随便什么数都行——合法的子网掩码要求二进制必须是左边连续 1、右边连续 0,所以一个字节只可能是以下 9 种值:
| 掩码值 | 二进制 | 步长 |
|---|---|---|
| 0 | 00000000 | 256 |
| 128 | 10000000 | 128 |
| 192 | 11000000 | 64 |
| 224 | 11100000 | 32 |
| 240 | 11110000 | 16 |
| 248 | 11111000 | 8 |
| 252 | 11111100 | 4 |
| 254 | 11111110 | 2 |
| 255 | 11111111 | — |
碰到掩码关键字节不在这张表里的(比如 255.255.2.0),那一定是配错了。
DHCP:自动分配 IP 的流程
知道了 IP 地址和子网掩码的概念,下一个问题是:每台设备的 IP 从哪来?
早期是手动配的——管理员给每台机器写死一个 IP、掩码、网关、DNS。设备少的时候还行,一旦设备多了,手动管理就是灾难:地址冲突、搬了工位忘改配置、新人入职等半天。
DHCP(Dynamic Host Configuration Protocol)就是解决这个问题的。设备连上网络后,自动从 DHCP 服务器拿到 IP 和相关配置,不用人工介入。
四步握手:DORA
DHCP 的工作流程叫 DORA,四个步骤:
Discover — 设备刚连上网络,还没有 IP 地址。它向整个网段广播一条消息:「有没有 DHCP 服务器?我需要一个 IP。」广播用的目标地址是 255.255.255.255,因为这时候它不知道服务器在哪。
Offer — DHCP 服务器收到广播后,从自己管理的地址池里挑一个空闲 IP,连同子网掩码、网关、DNS、租约时长一起打包,回复给设备:「这个 IP 给你用,租期 24 小时。」
Request — 设备收到 Offer(可能收到多个,如果网络里有多台 DHCP 服务器),选定一个,再广播一条消息:「我要用这个 IP,是某某服务器给我的。」这一步是广播而不是单播,是为了让其他 DHCP 服务器知道自己的 Offer 没被选中,可以把那个 IP 回收。
Acknowledge — 被选中的 DHCP 服务器确认:「没问题,这个 IP 正式归你了,租期从现在开始计算。」设备收到 ACK 后,才真正把 IP 配置到网卡上。
租约续期
DHCP 分配的 IP 不是永久的,有租期(lease)。典型的家用路由器租期是 24 小时。设备会在租期过半时尝试续租——给同一台 DHCP 服务器发 Request,不用再走完整的四步。如果续租失败(比如服务器挂了),设备会在租期到 87.5% 时再试一次,这次是广播,任何 DHCP 服务器都可以响应。
租期到了还没续上,设备就得放弃这个 IP,重新走一遍 DORA。
这也解释了一个常见现象:路由器重启后,你的设备可能会拿到和之前不一样的 IP。
NAT:一个公网 IP 怎么够全家用
到这里,设备已经有了内网 IP,知道了子网掩码和网关。但内网地址在公网上不能用——服务器不认识 192.168.1.100,就算回复了,公网上的路由器也不知道往哪送。
解决方案是 NAT(Network Address Translation),由路由器把内网地址「翻译」成公网地址。
工作原理
家里的路由器有两个身份:对内是网关(比如 192.168.1.1),对外有一个 ISP 分配的公网 IP(比如 203.0.113.5)。
当你的笔记本(192.168.1.100)要访问一个网站时:
- 笔记本发出数据包,源地址
192.168.1.100:54321(端口是系统随机分的),目标地址93.184.216.34:443 - 数据包到达路由器。路由器把源地址改成自己的公网 IP 加一个新端口:
203.0.113.5:10001,同时在 NAT 表里记一笔——10001 → 192.168.1.100:54321 - 数据包以公网 IP 的身份发到互联网上,对方服务器看到的来源是
203.0.113.5:10001 - 服务器回复,目标地址
203.0.113.5:10001 - 路由器收到回包,查 NAT 表,发现
10001对应的是192.168.1.100:54321,把目标地址改回去,转发给笔记本
整个过程对两端都是透明的。笔记本不知道自己的地址被改过,服务器也不知道背后其实是一台内网设备。
为什么需要 NAT
根本原因是 IPv4 地址不够用。32 位地址理论上限约 43 亿个,去掉保留地址后实际可用的更少。全球几十亿台联网设备,如果每台都要一个公网 IP,早就分完了。NAT 让一整个局域网的设备共享一个公网 IP,大大缓解了地址枯竭的问题。
代价也有:外部无法主动连入内网设备(因为路由器的 NAT 表里没有对应条目),想从外面访问家里的设备就需要端口转发或者内网穿透之类的手段。
连上 WiFi 后完整链路
把上面四件事串起来,看一遍设备从连上 WiFi 到能刷网页的全过程:
- 笔记本连上 WiFi,此时没有 IP 地址
- 笔记本广播 DHCP Discover
- 路由器(兼 DHCP 服务器)回复 Offer:IP
192.168.1.100,掩码/24,网关192.168.1.1,DNS8.8.8.8,租期 24 小时 - 笔记本广播 Request 确认选择,路由器 ACK
- 笔记本配置好网卡:IP
192.168.1.100,掩码255.255.255.0,网关192.168.1.1 - 用户打开浏览器访问网站,DNS 先把域名解析成 IP(比如
93.184.216.34) - 笔记本用子网掩码判断:
93.184.216.34不在192.168.1.0/24网段内,数据包交给网关 - 路由器收到数据包,做 NAT——把源地址从内网 IP 替换成公网 IP,记录映射关系
- 数据包经过公网到达目标服务器,服务器回复
- 路由器收到回包,查 NAT 表,把目标地址改回内网 IP,转发给笔记本
- 浏览器收到响应,页面渲染出来
这十一步在毫秒级内完成,所以感知上就是「连上 WiFi 就能上网」。
几个容易混淆的点
网关和路由器是什么关系? 在家庭网络里,网关就是路由器。但严格来说,网关是一个概念——「数据包离开当前网段的出口」,路由器是承担这个角色的设备。在企业网络里,网关也可能是一台三层交换机。
IP 和 MAC 地址的区别? MAC 地址是网卡出厂时烧进去的物理地址,在局域网内用来标识设备。IP 地址是逻辑地址,可以变(DHCP 每次可能分不同的)。数据包在局域网内传输靠 MAC 地址(二层),跨网段传输靠 IP 地址(三层),两者通过 ARP 协议关联。
为什么手动配 IP 要同时填掩码、网关、DNS? 因为这四样东西各管一件事:IP 是你的地址,掩码决定你和谁同网段,网关是出网段的出口,DNS 是域名到 IP 的翻译服务。少填任何一个,网络就不完整——比如不填网关,局域网内能通但上不了外网。
IPv6 解决了什么? IPv6 用 128 位地址,数量大到可以给地球上每粒沙子分一个。地址够用了,理论上就不再需要 NAT,每台设备都可以有全球唯一的地址。但 IPv4 到 IPv6 的迁移是个漫长的过程,目前两者共存。