📚 第五章 IP协议相关技术
📄 一句话概括

NAT 在边界上把私有地址换成公网地址,回程再换回来。 严格说今天用的是 NAPT:它不只换地址,还换端口。

📝 本节和前面几节的关系

4.3.8 讲过私有地址,这一节讲它们怎么和公网对接。 5.6.2 会讲那张转换表,这一节先把定义和范围理清。

一、三段私有地址

RFC 1918 规定了三段「谁都能用、但不能上公网」的地址:

地址段 地址数 典型用途
10.0.0.0/8 16777216 大企业、云内网
172.16.0.0/12 1048576 中型网络
192.168.0.0/16 65536 家庭、小办公室

第三行是你家里在用的: 「192.168.1.1」这个网关地址,全世界有几亿台设备在用—— 它们各自在自己的局域网里当网关,互不干扰。 这就是「私有地址可以重复使用」的含义:它只在「一个组织内部」唯一,不要求全球唯一。 而 NAT 的作用就是「让这种重复不冲突」。

二、NAT 和 NAPT 的区别

两个词经常混用,但严格说不一样:

类型 改什么 一个公网 IP 能带几台
NAT 只改 IP 地址 一台
NAPT 改 IP 加端口 很多台

第二行才是今天实际在用的:因为它靠端口号区分「同一个公网地址后面的不同内网设备」。 没有端口,回程的包就不知道该给谁。 所以「NAT」这个词在今天其实是个「简称」:大家说 NAT,指的是 NAPT。 真正的「纯 NAT」(一对一)只在「地址迁移」等少数场景用。

三、它在哪一层做

NAT 是「网络层加传输层」的操作:改 IP 地址要用网络层的字段,改端口要用传输层的字段。 所以它是「跨层」的,这也是它「违反端到端原则」的根源。

改什么 在哪个头里 后果
源/目的 IP IP 头 地址不再等于身份
源/目的端口 TCP/UDP 头 必须懂上层协议

第二行的后果最麻烦: 要改端口,就得知道「这个包是不是 TCP/UDP、头有多长」——于是 NAT 设备被迫理解上层协议。 遇到 ICMP(没有端口)、FTP(地址写在载荷里)就会出问题。 所以 NAT 不是「一个简单的地址转换」:它把「网络应该透明」这个前提破坏掉了, 后面所有的麻烦(5.6.4)都是从这里长出来的。

四、动手 Demo:NAT 到底改了什么

先把三段私有地址列出来,再看一次出方向和回方向的转换。 注意「源地址换了、端口也换了」:这就是 NAPT。

rows = [('出去', '192.168.3.152:51000', '203.0.113.7:40001'),
        ('回来', '203.0.113.7:40001', '192.168.3.152:51000')]
for a, b, c in rows:
    print(a, b, '->', c)

实跑输出:

--------------------------------------------------------------------
NAT 到底改了什么
--------------------------------------------------------------------
**NAT 做的事只有一件**:**在包的边界上,把「私有地址」换成「公网地址」。**
**回程再换回来。**

  私有地址段             地址数           典型用途
  -----------------------------------------------------------
  **10.0.0.0/8**         **16777216**     **大企业**
  **172.16.0.0/12**      **1048576**      **中型网络**
  **192.168.0.0/16**     **65536**        **家庭和小办公室**

**这三段是 RFC 1918 规定的「谁都可以用、但不能上公网」的地址。**
**所以「全世界有无数台 192.168.1.1」**——**它们各自在自己的局域网里当网关,互不干扰。**

**转换过程看一眼就懂**:
  方向         源                          目的
  -----------------------------------------------------------------
  **出去**     **192.168.3.152:51000**     **203.0.113.7:40001**
  **回来**     **203.0.113.7:40001**       **192.168.3.152:51000**

**源地址被换了,端口也被换了**——**所以严格说这不是 NAT,是 NAPT(网络地址端口转换)。**
**只是大家习惯统称 NAT。**
**为什么要换端口**:**因为一个公网地址要供很多台内网设备用**,
**只换地址的话,回程就分不清该给谁了。**
**端口就是「门牌号后面的房间号」。**

「端口也换了」这件事很多教材不提,但它很关键: 如果只换 IP 不换端口,一个公网地址就只能带一台内网设备—— 那就完全解决不了「地址不够」的问题。 「回程」那一行是「表」在起作用: NAT 设备记住「40001 这个端口对应 192.168.3.152 的 51000」,回程的包一进来就查表改回去。 所以 NAT 是「有状态」的——设备一重启,表就没了,所有连接都断。 「203.0.113.7」这个地址是文档专用段(TEST-NET-3):写例子时用它,不会和真实地址撞车。 这一点和 2001:db8::/32 是一个道理。

30 秒实验

  1. 算一下:10.0.0.0/8 有多少个地址?是 192.168.0.0/16 的几倍?
  2. 想一下:为什么「纯 NAT」解决不了地址不够?
  3. 想一下:NAT 设备重启后为什么所有连接都断?

常见误区

  1. 以为「NAT 就是换个 IP」。 还换端口,否则一个公网地址只能带一台设备。
  2. 以为「私有地址是随便定的」。 RFC 1918 规定了三段,乱用会撞车。
  3. 以为「NAT 不影响上层」。 它必须懂 TCP/UDP,否则改不了端口。
自测三问(点开对答案) 1. 三段私有地址是哪三段? —— **10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。** 2. NAT 和 NAPT 的区别是什么? —— **NAT 只改 IP,NAPT 改 IP 加端口**;今天用的是 NAPT。 3. NAT 为什么是「有状态」的? —— **它要维护一张转换表**,回程靠查表改回去;设备重启表就丢了。

下一节看那张表怎么工作、能装多少会话。

相关笔记