从 IP 地址到 NAT:你的设备是怎么上网的

· 约 8 分钟读完

打开笔记本,连上 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.25510.0.0.0/8企业内网、云 VPC
172.16.0.0 – 172.31.255.255172.16.0.0/12较少见,Docker 默认网桥用这段
192.168.0.0 – 192.168.255.255192.168.0.0/16家庭路由器最常见

所以你在家里看到的 192.168.1.x、在公司看到的 10.x.x.x,都是内网地址。这些地址不会出现在公网上,不同的局域网里可以重复使用——就像不同小区都能有「1 栋 101 室」,不会冲突,因为它们在不同的小区里。

那公网地址呢?ISP(运营商)分配给你家路由器的那个地址才是公网地址,全球唯一。后面讲 NAT 的时候会回到这件事。

子网掩码:谁跟谁在同一个网段

有了 IP 地址还不够。设备要发数据包的时候需要知道一件事:目标和我在同一个局域网里吗?

如果在同一个网段,数据包直接发就行(走二层,不经过路由器)。如果不在,数据包得先交给网关(路由器),让它帮忙转发。

判断「同不同网段」的工具就是子网掩码。

先说清楚「网段」是什么

网段就是一组能直接通信的设备的集合。想象一栋办公楼:同一层的人可以直接走过去说话,但要找另一层的人就得坐电梯。这里「一层楼」就是一个网段,「电梯」就是路由器(网关)。

具体到 IP 地址:192.168.1.100192.168.1.200 在同一个网段,数据包直接发送,不经过路由器。但 192.168.1.100192.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.100192.168.1.200 做完 AND 都得到 192.168.1.0——同一网段。而 192.168.2.100 算出来是 192.168.2.0,不同网段,走网关。

CIDR 表示法

写掩码有个更简洁的方式:直接写前缀里有多少个 1。255.255.255.0 就是 /24255.255.0.0 就是 /16

常见的几个:

CIDR掩码主机位数可用主机数
/8255.0.0.02416,777,214
/16255.255.0.01665,534
/24255.255.255.08254
/28255.255.255.240414

可用主机数的算法: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 种值:

掩码值二进制步长
000000000256
12810000000128
1921100000064
2241110000032
2401111000016
248111110008
252111111004
254111111102
25511111111

碰到掩码关键字节不在这张表里的(比如 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)要访问一个网站时:

  1. 笔记本发出数据包,源地址 192.168.1.100:54321(端口是系统随机分的),目标地址 93.184.216.34:443
  2. 数据包到达路由器。路由器把源地址改成自己的公网 IP 加一个新端口:203.0.113.5:10001,同时在 NAT 表里记一笔——10001 → 192.168.1.100:54321
  3. 数据包以公网 IP 的身份发到互联网上,对方服务器看到的来源是 203.0.113.5:10001
  4. 服务器回复,目标地址 203.0.113.5:10001
  5. 路由器收到回包,查 NAT 表,发现 10001 对应的是 192.168.1.100:54321,把目标地址改回去,转发给笔记本

整个过程对两端都是透明的。笔记本不知道自己的地址被改过,服务器也不知道背后其实是一台内网设备。

为什么需要 NAT

根本原因是 IPv4 地址不够用。32 位地址理论上限约 43 亿个,去掉保留地址后实际可用的更少。全球几十亿台联网设备,如果每台都要一个公网 IP,早就分完了。NAT 让一整个局域网的设备共享一个公网 IP,大大缓解了地址枯竭的问题。

代价也有:外部无法主动连入内网设备(因为路由器的 NAT 表里没有对应条目),想从外面访问家里的设备就需要端口转发或者内网穿透之类的手段。

连上 WiFi 后完整链路

把上面四件事串起来,看一遍设备从连上 WiFi 到能刷网页的全过程:

  1. 笔记本连上 WiFi,此时没有 IP 地址
  2. 笔记本广播 DHCP Discover
  3. 路由器(兼 DHCP 服务器)回复 Offer:IP 192.168.1.100,掩码 /24,网关 192.168.1.1,DNS 8.8.8.8,租期 24 小时
  4. 笔记本广播 Request 确认选择,路由器 ACK
  5. 笔记本配置好网卡:IP 192.168.1.100,掩码 255.255.255.0,网关 192.168.1.1
  6. 用户打开浏览器访问网站,DNS 先把域名解析成 IP(比如 93.184.216.34
  7. 笔记本用子网掩码判断:93.184.216.34 不在 192.168.1.0/24 网段内,数据包交给网关
  8. 路由器收到数据包,做 NAT——把源地址从内网 IP 替换成公网 IP,记录映射关系
  9. 数据包经过公网到达目标服务器,服务器回复
  10. 路由器收到回包,查 NAT 表,把目标地址改回内网 IP,转发给笔记本
  11. 浏览器收到响应,页面渲染出来

这十一步在毫秒级内完成,所以感知上就是「连上 WiFi 就能上网」。

几个容易混淆的点

网关和路由器是什么关系? 在家庭网络里,网关就是路由器。但严格来说,网关是一个概念——「数据包离开当前网段的出口」,路由器是承担这个角色的设备。在企业网络里,网关也可能是一台三层交换机。

IP 和 MAC 地址的区别? MAC 地址是网卡出厂时烧进去的物理地址,在局域网内用来标识设备。IP 地址是逻辑地址,可以变(DHCP 每次可能分不同的)。数据包在局域网内传输靠 MAC 地址(二层),跨网段传输靠 IP 地址(三层),两者通过 ARP 协议关联。

为什么手动配 IP 要同时填掩码、网关、DNS? 因为这四样东西各管一件事:IP 是你的地址,掩码决定你和谁同网段,网关是出网段的出口,DNS 是域名到 IP 的翻译服务。少填任何一个,网络就不完整——比如不填网关,局域网内能通但上不了外网。

IPv6 解决了什么? IPv6 用 128 位地址,数量大到可以给地球上每粒沙子分一个。地址够用了,理论上就不再需要 NAT,每台设备都可以有全球唯一的地址。但 IPv4 到 IPv6 的迁移是个漫长的过程,目前两者共存。