ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

你家的电脑,凭什么能访问全世界?——NAT 网络地址转换,一次讲透

你家的电脑,凭什么能访问全世界?——NAT 网络地址转换,一次讲透 你有没有想过一个问题你家的电脑分配到的 IP 大概率是192.168.1.x这种私有地址。你邻居家的电脑很可能也是192.168.1.5。你同事在另一个城市他家的电脑也是192.168.1.5。全世界有几亿台电脑用的都是192.168.1.5这个一模一样的 IP。可当你访问百度、访问 GitHub 时数据却总能准确无误地回到你家那台电脑而不是跑到别人家那个同款 IP的电脑上。凭什么答案就是今天要讲的NATNetwork Address Translation网络地址转换。它是让私有地址和公网互联网共存的那座桥也是你每天都在用、却未必意识到它存在的技术。先搞懂为什么会有私有地址这回事故事要从一个现实困境说起。互联网上的每台设备理论上都需要一个全球唯一的 IP 地址才能被找到。可 IPv4 地址总共只有2 32 ≈ 43 2^{32} \approx 43232≈43亿个。早在很多年前这个数字就远远不够分给全世界的每一台手机、电脑、路由器了。于是人们想了个拆东墙补西墙的办法划出一批私有地址让大家在自家内部随便用但这些地址在公网上是无效的、不能直接上互联网。这三段最常说的私有地址范围你八成见过10.0.0.0 ~ 10.255.255.255大公司内网常用172.16.0.0 ~ 172.31.255.255192.168.0.0 ~ 192.168.255.255家庭路由器默认就是这个私有地址的好处是全球可以无限复用。你家、我家、他家的内网都可以各用各的192.168.1.x互不冲突——因为反正这些地址也上不了公网重复就重复没人管。但问题随之而来既然192.168.1.5这个地址全球有上亿台设备在用那你这台上网时公网上的服务器该怎么回信它回给哪个192.168.1.5这个看似无解的矛盾就是 NAT 出场的原因。NAT 的绝活出口时换件衣服进口时换回来NAT 通常运行在你家路由器或公司网关上。它的思路用一个比喻最好懂你的电脑在内网用的是小名私有 IP。出了门要跟公网打交道得用学名公网 IP。NAT 就是那个在门口帮你换名字的管家。具体过程分两步第一步出门发请求。你的电脑用192.168.1.5想访问百度的服务器。数据包先到路由器路由器做两件事把数据包的源 IP从私有的192.168.1.5换成路由器自己的公网 IP比如203.0.113.7把源端口也换成一个它新分配的、暂时唯一的端口比如40001并在一张表里记下这笔换装记录192.168.1.5:3000 ↔ 203.0.113.7:40001。第二步回门收响应。百度的服务器收到请求看到的源地址是203.0.113.7:40001于是把响应发回给这个地址。响应到了路由器路由器查那张换装记录表发现40001端口对应的是内网的192.168.1.5:3000就把响应换回原来的衣服转交给你家那台电脑。关键就在那张表。正因为路由器记下了哪个端口 ↔ 哪台内网机器的对应关系响应才能准确无误地找到你而不是找到别家那个同名的192.168.1.5。这张表学术上叫NAT 转换表NAT Translation Table。NAT 其实有几种换法上面讲的是家庭场景最常见的NAPT网络地址端口转换也叫 PAT——它同时转换 IP 和端口让一个公网 IP通过不同的端口同时服务内网成百上千台设备。这是你现在能全家多台设备共享一个公网 IP 上网的根本原因。除了它还有另外几种408 和面试也常考简单对个表类型换什么特点静态 NAT内网 IP ↔ 公网 IP一对一固定用于让公网能主动找到某台内网服务器动态 NAT从公网地址池里临时挑一个一对一地址池有限用完得等NAPT/PATIP 端口都换多对一家庭/企业最常用一个公网 IP 带一堆设备其中静态 NAT尤其值得注意它和另一个常听到的词——端口映射——是一回事你在路由器上把公网的 80 端口映射到内网某台服务器的 80 端口这样外面的人就能通过你的公网 IP访问到你家内网里那台服务器了。这也是NAT 穿透、内网服务对外暴露的基础。NAT 的功劳和它的代价NAT 解决了 IPv4 地址枯竭的燃眉之急是互联网能续命到今天的关键功臣之一。但它不是免费的午餐代价也很实在破坏了端到端的纯粹性互联网最初的设计理念是任何两台设备都能直接对话。NAT 让内网设备躲在路由器后面外面的机器无法主动连进来除非你做端口映射。这也解释了很多烦恼为什么你家里的电脑不能直接当服务器用、为什么打联机游戏要折腾NAT 类型。协议要翻墙有些协议会把 IP、端口信息藏在数据内容里比如 FTP、SIP、某些 P2PNAT 只改了包头没改内容就会导致这些协议在 NAT 后面出问题。于是才有了各种NAT 穿越NAT Traversal“技术去专门解决怎么让 NAT 后面的设备能被连上”。地址转换有开销每个包都要查表、改写、记账高并发下也是性能负担。IPv6那个一劳永逸的答案聊 NAT就绕不开它的终结者——IPv6。NAT 说到底是 IPv4 地址不够用时的权宜之计。而 IPv6 把地址从 32 位扩到了128 位地址数量是2 128 2^{128}2128多到可以给地球上每一粒沙子都分配一个 IP。IPv6 的愿景就是让每台设备重新拥有全球唯一的公网地址从而彻底不需要 NAT——恢复互联网端到端的本意。这也是为什么你会看到IPv6 能直连、NAT 类型不再是问题的说法。不过从 IPv4 到 IPv6 的迁移是个漫长的过程全世界几十亿设备要升级所以在可预见的未来NAT 依然会是我们上网路上那个默默无闻、却不可或缺的换装管家。结语一座桥让不够也能够用NAT 给我最深的感触是一个关于工程智慧的道理面对资源不够的死结最高明的解法往往不是造更多资源而是用一套转换机制让有限的资源被复用起来。IPv4 地址不够了那就让内网用私有地址无限复用出公网时再换装成少数几个公网地址。一个公网 IP靠端口复用就能带起成千上万台设备。用一个转换层把稀缺变成了够用。这跟计算机世界里很多设计异曲同工——虚拟内存用有限的物理内存假装出更大的空间缓存用一小块快速存储假装加速了慢速存储。真正的工程大师都擅长加一层把不够变成够用。NAT、IP 地址、子网、路由……这些网络层的知识是 408 计算机网络的核心也是理解互联网运作的钥匙。推荐 B站【408实验室】的《数据结构》打牢基本功再系统地啃一遍计算机网络把数据包怎么从你家走到世界这条线彻底串起来。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进