解决IP不够用的问题

1. 根本矛盾:僧多粥少

IPv4 地址总共只有 43 亿个(2\^{32})。

早在 2011 年,全球的 IPv4 地址就已经被分配光了。但是现在你家里可能就有 5 台设备(手机、电脑、iPad、电视...),全世界加起来设备早已超过几百亿。

如果不解决这个问题,大约 90% 的人都没法上网。


2. 解决方案:公网 IP vs 私网 IP

为了省着用,工程师们想出了一个绝妙的办法:"只有在公海上航行才需要合法执照,在自家小河沟里划船随便叫什么都行。"

于是,IP 地址被划分成了两类:

  • 公网 IP (Public IP): 全球唯一,必须花钱向运营商申请。这才是真正的"互联网门牌号"。
  • 私网 IP (Private IP): 免费,随便用,但是出不去互联网
    • 你最眼熟的 192.168.x.x
    • 还有 10.x.x.x
    • 以及 172.16.x.x

现在的家庭网络架构通常是这样的:

  • 你家里的所有设备(手机、电脑) :用的全是私网 IP(比如 192.168.1.5, 192.168.1.6)。这些 IP 在互联网上是无效的,出了你家门就是废纸。
  • 你的路由器 :它是全家唯一的"富豪",拥有一个运营商分配的公网 IP(比如 110.242.68.4)。

Shutterstock


3. 核心魔术:路由器如何"偷天换日"?

既然只有路由器有公网 IP,那你的手机是怎么刷到抖音的呢?全靠路由器的 NAT 功能。

我们可以把路由器想象成一家大公司的收发室

场景模拟:你要给百度写信
  1. 你(内网设备):
    • 你想发请求给百度。
    • 寄信人:192.168.1.5 (你的内网 IP)
    • 收信人:百度 IP
    • 问题: 这封信如果直接扔到公网,回信时百度找不到 192.168.1.5 是谁(因为全世界有一亿人的电脑都叫这个)。
  1. 路由器(NAT 转换):
    • 信到了路由器这里,被拦截下来。
    • 路由器把信封上的"寄信人"擦掉,改成路由器自己的公网 IP
    • 关键动作: 路由器在自己的小本本(NAT 映射表)上记一笔:

"刚才我用我的名义帮 192.168.1.5 发了一封信去百度,如果百度回信了,记得转给它。"

  1. 百度(服务器):
    • 收到信,一看寄信人是路由器的公网 IP。
    • 处理完,把回信发给路由器。
  1. 路由器(逆向转换):
    • 收到百度的回信。
    • 查小本本:"哦,这是刚才帮 192.168.1.5 发的那个请求的回信。"
    • 把信封上的"收信人"擦掉,改回 192.168.1.5
    • 把信转交给你。

结果: 你完全感觉不到中间发生了替换,你以为是你直接连上了百度。


4. 进阶:如果全家人都在刷百度怎么办?(NAPT)

你可能会问:"如果我和我爸同时访问百度,百度回了两封信,路由器怎么知道哪封是给我的,哪封是给爸爸的?"

这时候,传输层 的知识(端口号)就派上用场了!这叫 NAPT (Network Address Port Translation)

路由器的小本本记得更详细:

|---------------------|----------|---------------|------------|--------|
| 内网 IP | 内网端口 | 转换后的公网 IP | 分配的新端口 | 目标 |
| (192.168.1.5) | 1001 | 110.242.68.4 | 8001 | 百度 |
| (192.168.1.6) | 1001 | 110.242.68.4 | 8002 | 百度 |

  • 当路由器收到发给 110.242.68.4:8001 的数据包,就知道是给你的。
  • 当路由器收到发给 110.242.68.4:8002 的数据包,就知道是给爸爸的。

5. 总结

  • NAT 的本质:一个公网 IP 代表无数个内网设备上网。
  • 好处: 极大地节省了 IPv4 地址(原本需要 10 个 IP 的家庭,现在只要 1 个)。
  • 副作用: 外网无法主动访问内网(因为外网不知道你在内网的端口映射)。这就是为什么你在家里搭个网站,外面的人直接输 IP 访问不到你的原因(除非你在路由器上做"端口映射")。

相关推荐
宴之敖者、23 分钟前
Linux——\r,\n和缓冲区
linux·运维·服务器
LuDvei24 分钟前
LINUX错误提示函数
linux·运维·服务器
未来可期LJ31 分钟前
【Linux 系统】进程间的通信方式
linux·服务器
Abona32 分钟前
C语言嵌入式全栈Demo
linux·c语言·面试
Lenyiin1 小时前
Linux 基础IO
java·linux·服务器
The Chosen One9851 小时前
【Linux】深入理解Linux进程(一):PCB结构、Fork创建与状态切换详解
linux·运维·服务器
Hill_HUIL1 小时前
学习日志22-静态路由
网络·学习
莱茶荼菜1 小时前
yolo26 阅读笔记
人工智能·笔记·深度学习·ai·yolo26
大佐不会说日语~1 小时前
使用Docker Compose 部署时网络冲突问题排查与解决
运维·网络·spring boot·docker·容器
Kira Skyler1 小时前
eBPF debugfs中的追踪点format实现原理
linux