§ 1.3 · Section

地址 · Address

IP, MAC & Domain Names

网络上每台主机都得有"门牌号",不然数据包找不到它。但"门牌号"这个词其实有三种不同的地址——IP、MAC、域名——它们各自解决不同的问题,又互相配合。

生活场景
🗺️ 三种方式找到同一个人

你想找朋友小明——可以用三种方式描述他:

身份证号:370100199001011234——一辈子不变,全国唯一。
现居地址:北京市朝阳区 XX 路 5 号院 3 栋 501——小明搬家就换。
名字:张小明——方便你叫他,但同名的人很多。

在网络世界里,这三种描述对应:
① 身份证号 = MAC 地址(出厂烧死,全球唯一);
② 现居地址 = IP 地址(走到哪,临时分一个);
③ 名字 = 域名(baidu.com 这种,方便人记)。

为什么需要"三套"地址系统

初学者最自然的疑问是:一套地址不够用吗?为什么要搞得这么复杂?答案是:这三套地址解决的是三个完全不同、且都无法互相替代的问题。

再加上第四个:端口解决"到了机器以后交给哪个程序"。你的电脑同时开着浏览器、微信、游戏、下载器,包到了以后总得有个依据分发给正确的程序。四套标识各管一段,缺任何一个网络都会立刻塌掉一大块。这一节我们把它们全部拆开讲清楚。

四套地址的分工,用寄快递一次说透:域名相当于你在通讯录里存的"公司前台"(人记得住的名字);IP 相当于"某市某区某路 5 号院 3 栋"(快递系统真正认的地址);MAC 相当于楼里那扇门上钉的门牌(只在这栋楼里管用,出了小区没人认);端口相当于"501 室里的哪张办公桌"。少一样都送不到人手里——没名字你查不到地址,没地址快递发不出,没门牌进了楼找不着门,没桌号进了门不知道给谁。

MAC 地址 · 出厂身份证号

MAC 地址(Media Access Control)是网卡出厂时被厂家烧进硬件的唯一编号,格式像这样:a4:5e:60:3f:21:b7。前 6 位是厂家编号(IEEE 分配),后 6 位是厂家自己排的流水号。理论上全球唯一。

说白了,MAC 就是网卡的身份证号:出厂那天就烧死在硬件里,一辈子不改。它的两段结构跟身份证也像——前半段代表"哪个地方发的"(厂商编号),后半段是"这个厂商自己排的第几号"。所以看到一串 MAC 的前三段,就跟看到身份证前六位一样,能猜出它是"哪儿的人"。

拆开看它的结构,会发现设计得相当克制:总共 48 位(6 字节),一分为二

a4:5e:60 : 3f:21:b7
└──┬──┘   └──┬──┘
   │         └── NIC 序号(24 位)厂家自己排的流水号,1677 万个
   └── OUI(24 位)Organizationally Unique Identifier
       向 IEEE 花钱买的厂商前缀,一个 OUI 约需数千美元

常见 OUI 前缀(可以拿来认设备品牌):
  00:1A:11 → Google          B8:27:EB → 树莓派基金会
  3C:5A:B4 → Google          00:50:56 → VMware(虚拟机)
  A4:5E:60 → Apple           08:00:27 → VirtualBox(虚拟机)
  F0:9F:C2 → Ubiquiti        52:54:00 → QEMU/KVM(虚拟机)

OUI 这个设计有个很实用的副产品:看 MAC 前三段就能猜出设备是什么牌子。运维排查"局域网里这个陌生 IP 是谁",第一步往往就是查它的 MAC 前缀——查出来是 B8:27:EB,那基本就是有人插了个树莓派;查出来是 08:00:27,那是台 VirtualBox 虚拟机。网上有大量免费的 OUI 查询库可以用。

"1677 万个"这个数字换算一下:一个厂商买一个 OUI 前缀,就能给 1677 万块网卡编号——相当于给一个中等国家的每个人都发一张不重复的会员卡。所以苹果这种大厂手里握着几十个 OUI,而一个小型模块厂买一个就够用一辈子。

其中"可被伪造"这一条得单独敲一下:"烧进硬件"只能保证出厂值固定,可它并不能保证发出去的包上写的是真值。这好比小区门口的登记本——你确实有身份证,但登记的时候写谁的名字全凭你自觉。所以任何"只要 MAC 对就放你上网"的认证,等于门卫只看你自己写在本子上的名字放人,纯属摆样子。

那"只在同一局域网内有效"到底是什么意思?看这个关键事实:数据包每经过一台路由器,MAC 地址就被完全替换一次,而 IP 地址从头到尾不变。

你的电脑 → 家用路由器 → 运营商路由器 → ... → 百度服务器

第 1 跳(你家局域网内):
  源 MAC: a4:5e:60:3f:21:b7 (你的网卡)
  目的 MAC: ac:84:c6:11:22:33 (你家路由器)
  源 IP: 192.168.1.20    目的 IP: 110.242.68.66

第 2 跳(你家到运营商):
  源 MAC: ac:84:c6:aa:bb:cc (路由器的外网口)  ← 全换了!
  目的 MAC: 00:0c:29:dd:ee:ff (运营商设备)    ← 全换了!
  源 IP: 你家公网IP        目的 IP: 110.242.68.66  ← IP 目的地没变

结论:MAC 是"下一站是谁",IP 是"终点是哪"。

这个对比可以说是整个网络知识里最重要的一张图。用坐火车打比方:IP 地址是你手上那张"北京 → 广州"的票(全程不变),MAC 地址是你每一段路要换乘的具体那趟车次(每段都换)。路由器的工作就是"看你的终点,告诉你下一趟该坐哪班车,然后把你送上去"。

换个更日常的说法:IP 是快递面单上的"收件地址",从头到尾一个字不改;MAC 是每一段路上"当前该交给谁"——从你手里交给小区快递柜,快递柜交给取件小哥,小哥交给分拣中心,中心交给货车司机。面单上的收件地址从来没变过,但"手上拿着这个包裹的人"换了七八个。这就是"IP 定终点、MAC 定下一站"的全部含义。

最后补一个把 IP 翻译成 MAC 的关键协议:ARP。你的电脑知道要发给 192.168.1.1,但网卡只认 MAC,怎么办?它会在局域网里大喊一声(广播):"谁是 192.168.1.1?把你的 MAC 告诉我!"——路由器听到就回一句"我是,我的 MAC 是 ac:84:c6:11:22:33"。这个问答结果会被缓存下来(就是上一节 arp -a 看到的那张表),几分钟内不用再问。ARP 完全没有身份验证,谁都能冒充回答"我是网关",这就是著名的 ARP 欺骗攻击的原理——网吧和公共 WiFi 里最经典的中间人手法。

ARP 干的活儿说白了就是在小区院子里喊一嗓子问路:"5 号楼 301 是哪位?"——谁应声,你就把东西交给他。问题在于这套流程压根不查证件:只要有人抢先应一句"我就是 301",你就真把东西给他了。这就是 ARP 欺骗——攻击者在公共 WiFi 里抢答"我是网关",从此全网段的数据都先经他的手过一遍。

IP 地址 · 网络世界的"现居地址"

IP 地址(Internet Protocol Address)是主机在当前网络上的"逻辑位置"。它会变——你连家里 WiFi 是一个 IP,连 5G 是另一个 IP,去公司又是另一个。

IP 相当于你现在住的那个地址:在家是一个,出差住酒店是另一个,去公司上班又是另一个。身份证号(MAC)跟着人走,住址(IP)跟着位置走——这就是为什么快递要写住址而不是身份证号:快递员认得路,可认不得你的身份证。

IPv4 是最经典的 IP 格式:192.168.1.101——4 个数字,每个 0-255,点号分隔。全世界总共能编 232 = 43 亿个地址——早就不够用了(这就是 IPv6 出现的原因)。

43 亿这个数字听着很多,换算一下就明白多不够用了:全球 82 亿人,联网设备超过 300 亿台——相当于一个小区规划了 43 个车位,结果住进来 300 户人家,家家都有车。停车位不够怎么办?要么想办法让几家轮流用一个位(这就是后面要讲的 NAT),要么重新划一块大得多的停车场(这就是 IPv6)。

那"点分十进制"这个写法到底是怎么来的?其实 IP 地址本质上就是一个 32 位的二进制数,只是人类读二进制太痛苦,才每 8 位切一刀、转成十进制、用点号连起来:

二进制: 11000000 . 10101000 . 00000001 . 01100101
十进制:    192    .   168    .    1    .   101

所以每一段的范围是 0~255(8 位能表示 256 个值)。
你看到 "192.168.1.256" 这种写法,一定是错的。

整个 IPv4 空间:2^32 = 4,294,967,296 ≈ 43 亿
而 2025 年全球人口 82 亿、联网设备超 300 亿 —— 差了一个数量级。
类型格式典型例子说明
IPv44 个 0-255 数字8.8.8.8经典老格式,43 亿上限,已耗尽
IPv68 组 16 进制2001:4860:4860::8888新格式,能给地球每粒沙子都分一个
公网 IP全球唯一110.242.68.66整个互联网认识你
私网 IP局域网内唯一192.168.1.101只在你家局域网里有效

公网 IP 与私网 IP:为什么全世界都在用 192.168 开头

你有没有觉得奇怪:你家的 WiFi 是 192.168.1.x,你同学家也是,公司也是,全世界几十亿台设备都在用这几个网段——它们不会冲突吗?答案是不会,因为这些地址被 RFC 1918 明确规定为"私有地址",永远不允许出现在公网上。它们是特意留出来给局域网内部随便用的。

这件事打个比方就一秒懂:192.168.1.1 好比每个小区里都有的"1 号楼 101 室"——全国得有几百万个"101 室",但一点都不冲突,因为你送快递从来不会只写"101 室",你得先写清楚是哪个城市哪个小区。私网 IP 就是"只在自己小区里管用的门牌号",出了小区大门,谁都不认。

私有网段CIDR 写法可用地址数典型用途
10.0.0.0 – 10.255.255.25510.0.0.0/8约 1678 万大型企业、云厂商 VPC、K8s 集群
172.16.0.0 – 172.31.255.255172.16.0.0/12约 105 万中型企业、Docker 默认网桥(172.17)
192.168.0.0 – 192.168.255.255192.168.0.0/1665536几乎所有家用路由器的默认段
100.64.0.0 – 100.127.255.255100.64.0.0/10约 419 万运营商级 NAT(CGNAT)——很多人的宽带其实在这里
169.254.0.0 – 169.254.255.255169.254.0.0/1665536链路本地地址:DHCP 失败时系统自己瞎编的

最后那一行是排障的黄金线索。如果你 ipconfig 看到自己的 IP 是 169.254.x.x,那意味着 DHCP 彻底失败了——网线可能没插好、路由器 DHCP 服务挂了、或者 WiFi 认证没过。系统拿不到地址,只好自己在这个网段里随机挑一个凑合用(这叫 APIPA)。看到这个地址就别再研究浏览器和 DNS 了,直接回去查物理连接。

169.254.x.x 这个地址说白了就是系统自己瞎编的一个门牌号:它去物业登记(DHCP)没人应门,只好在门上随手贴了个纸条写"我就住这儿了"。这号码除了它自己谁也不认,所以你上不了网。看到它就等于看到"物业没给你办登记"这五个字,去查网线和路由器,别在浏览器上瞎折腾。

倒数第二行的 100.64.0.0/10 也值得知道。因为公网 IPv4 早就分完了,很多运营商已经不给每个宽带用户单独的公网 IP,而是让一整个小区的用户共用一个公网 IP(这叫 CGNAT,运营商级 NAT),给你的只是这个网段里的一个地址。后果是:你没法搭建能从外面访问的服务器、玩某些联机游戏组不了房、远程访问家里 NAS 会失败。判断方法很简单:把路由器后台显示的"WAN 口 IP"和百度搜"IP"查到的公网 IP 对比一下,如果不一样,你就在 CGNAT 后面

CGNAT 通俗地说就是一整栋楼共用一个快递代收点:所有人的包裹都先寄到楼下那个点,再由代收点分给各户。好处是省地址,坏处是外面的人没法直接寄到你家门口——你想让朋友直连你家的 NAS 或游戏房间,包裹到了代收点就停住了,因为代收点压根不知道该往哪一户送。这就是"NAT 类型严格、组不了队"的根源。

子网掩码与 CIDR:把一个大网切成几块

IP 地址其实是"两段拼起来的":前面一段说"你在哪个网络",后面一段说"你是这个网络里的第几台机器"。问题是——从第几位开始算"后面一段"?这就是子网掩码要回答的问题。

换成大白话,IP 地址就像"某小区 3 栋 501"这样一串话:前半截"某小区 3 栋"说的是你在哪一片,后半截"501"说的是你是这片里的第几户。子网掩码干的活儿,就是拿一把尺子在这串话上划一刀,明确告诉大家:"从这儿往左是小区名,从这儿往右是户号。"

IP 地址:  192.168.1.101  → 11000000.10101000.00000001.01100101
子网掩码: 255.255.255.0  → 11111111.11111111.11111111.00000000
                             └────── 网络号 24 位 ─────┘└主机号 8 位┘

掩码里连续的 1 有 24 个,所以简写成 CIDR 记法: /24
即   192.168.1.0/24

这个网段的构成:
  192.168.1.0    ← 网络地址,代表"这整个网段",不能分给机器
  192.168.1.1    ← 通常留给网关(习惯,非强制)
  192.168.1.2 ~ 192.168.1.254  ← 可用主机地址,共 254 个
  192.168.1.255  ← 广播地址,发给它 = 发给全网段所有机器

可用主机数公式:2^(32-前缀长度) - 2
  /24 → 2^8  - 2 = 254
  /25 → 2^7  - 2 = 126
  /30 → 2^2  - 2 = 2     (常用于两台路由器之间的点对点链路)
  /16 → 2^16 - 2 = 65534

掩码的作用是让主机做一次极简判断:把自己的 IP 和目标 IP 分别跟掩码做"按位与"运算,结果相同就是邻居,不同就是外人。相同就直接用 ARP 喊人,不同就交给默认网关。这一次运算只需要几个 CPU 周期,却是整个 IP 转发逻辑的起点。

这个"按位与"听着玄,其实就是把两个地址的小区名截出来比一比:一样,说明是同小区的邻居,你自己走过去敲门就行;不一样,说明人在城外,交给小区门口的快递员(网关)。每台设备发每一个包,都在做这一次"是不是邻居"的判断——就这么一下比较,撑起了整个互联网的转发逻辑。

我:192.168.1.101 & 255.255.255.0 = 192.168.1.0
它:192.168.1.50  & 255.255.255.0 = 192.168.1.0   → 相同,是邻居,直接喊
它:110.242.68.66 & 255.255.255.0 = 110.242.68.0  → 不同,是外人,交给网关

CIDR(Classless Inter-Domain Routing,无类域间路由)在 1993 年出现之前,IP 地址是按"A/B/C 类"死分的:A 类固定 /8(1678 万个地址)、B 类固定 /16(6.5 万个)、C 类固定 /24(254 个)。这个粗粒度的划分极其浪费——一个需要 300 台机器的公司,C 类不够用,只能申请一整个 B 类,白白占掉 6 万多个地址。CIDR 的贡献就是把这个刻度从"三档"变成了"可以卡在任意一位上",需要 300 个就给你一个 /23(510 个),不多不少。CIDR 硬生生把 IPv4 的寿命延长了二十多年——没有它,IPv4 大概在 2000 年前后就会彻底耗尽。

A/B/C 类那套老规矩,好比装修公司只卖三种规格的柜子:小柜装 254 件、中柜装 6.5 万件、大柜装 1678 万件,没有中间尺寸。你家只有 300 件东西,小柜塞不下,就只能买中柜——白白空掉 6 万多格。CIDR 干的活儿相当于改成"按需定制",你要 300 格就给你做 510 格的,多一分不浪费。就靠这一手,IPv4 硬撑了二十多年。

顺便记几个在文档和云平台里天天见的 CIDR 简写:0.0.0.0/0 表示"所有 IP 地址"(防火墙规则里写这个就是"对全世界开放",写之前请务必想清楚);10.0.0.0/8 是云上 VPC 的常见默认段;/32 表示"就这一个 IP"(安全组里精确放行某台机器时用)。

IPv6:给地球每粒沙子都分一个地址

IPv4 的 43 亿个地址在 2011 年 2 月 3 日正式宣告分配完毕(IANA 把最后 5 个 /8 段发给了五大区域注册机构)。解决办法有两条:一是靠 NAT 硬撑,二是换新协议。IPv6 就是后者,它把地址从 32 位直接拉到 128 位

32 位到 128 位,听着只是翻了四倍,实际差距大得离谱:好比把车位号从 4 位数改成 16 位数,能停的车不是多了四倍,而是多了 79 亿亿亿倍。换个说法——IPv4 全部地址加起来,还不够给一个小区的沙堆里每粒沙子分一个;IPv6 能给地球表面每平方米分一摩尔个。这就是"再也不用为地址发愁"的意思。

IPv4:  32 位 → 2^32  ≈ 4.3 × 10^9   (43 亿)
IPv6: 128 位 → 2^128 ≈ 3.4 × 10^38

这个数字有多大?
  地球表面积约 5.1 × 10^14 平方米
  平均每平方米可分配 6.6 × 10^23 个地址
  ——比一摩尔(6.02 × 10^23)还多。

完整写法:2001:0db8:85a3:0000:0000:8a2e:0370:7334
简化规则:① 每组前导 0 可省  ② 连续全零组用 :: 代替(只能用一次)
简化后:  2001:db8:85a3::8a2e:370:7334

几个必须认识的 IPv6 地址:
  ::1                     本机回环(相当于 127.0.0.1)
  ::                      全零地址(相当于 0.0.0.0)
  fe80::/10               链路本地,自动生成,只在本网段有效
  fc00::/7                唯一本地地址 ULA(相当于私网 IP)
  2000::/3                全球单播地址,真正能上公网的那一段
  2001:4860:4860::8888    Google 公共 DNS 的 IPv6 版
  2400:3200::1            阿里公共 DNS 的 IPv6 版

URL 里写 IPv6 必须加方括号,否则冒号会跟端口号混淆:
  http://[2001:db8::1]:8080/index.html

IPv6 除了地址多,还带来几个实质变化:① 头部更简洁——固定 40 字节,去掉了校验和(交给上下层做,不再重复劳动)和分片字段(改由源主机负责,路由器不再分片,转发更快);② 自动配置——主机可以不需要 DHCP 服务器,靠 SLAAC 机制根据路由器广播的前缀自己算出一个全球唯一地址;③ 强制支持组播,取消了广播——减少了大量无用的全网喊话;④ 不再需要 NAT——地址够用了,每台设备都能有真正的公网地址。

这四条改进用生活话讲: 头部瘦身相当于快递面单从三联单简化成一张,签收环节少了两道重复登记(校验和以前 TCP 算一遍、IP 又算一遍,纯属重复劳动); 自动配置相当于你搬进小区不用去物业排队,门口有块牌子写着"本小区门牌规则如此",你自己就能算出自己的号; 取消广播相当于取消了小区大喇叭,改成只通知报了名的那几户,省下所有人的耳朵; 不用 NAT 相当于家家都有独立门牌,不必再共用一个快递代收点。

但正如上一节说的,IPv6 与 IPv4 不兼容,这拖累了它整整二十年。目前的主流过渡方案是双栈(Dual Stack):一台主机同时拥有 IPv4 和 IPv6 地址,能走 v6 就走 v6,不能就退回 v4。你可以自己看看现在的状况:

# 看本机有没有 IPv6 地址
PS> ipconfig | findstr IPv6
   IPv6 地址 . . . . . . . . : 2409:8a1e:xxxx:xxxx::1
   临时 IPv6 地址. . . . . . : 2409:8a1e:xxxx:xxxx::2a1
   本地链接 IPv6 地址. . . . : fe80::1c4d:5f2a:8b91:3e7c%12

# 测试能不能通过 IPv6 上网
$ ping -6 ipv6.baidu.com
$ curl -6 https://ipv6.google.com    # 通了说明你的 IPv6 是可用的
$ curl https://test-ipv6.com/        # 网页版综合检测

端口号:同一台机器上的"房间号"

IP 地址只能把包送到"这台机器",但一台机器上同时跑着几十个联网程序——浏览器、微信、网易云、Steam、系统更新——包到了以后交给谁?这就是端口号(Port)要解决的问题。

端口打个比方就是写字楼里的房间号:IP 把包裹送到"某路 5 号院 3 栋",进了楼还得知道去哪个房间。IP 定位到楼,端口定位到门。再顺一句:端口不是插口、不是硬件、你在机箱背后找不到它——它纯粹是操作系统在小本本上记的一行"8080 号房间归 node 这个程序用"。

端口是一个 16 位无符号整数,范围 0~65535。它不是硬件,不是物理插口,纯粹是操作系统维护的一个数字标签:某个程序向内核申请"我要监听 8080 端口",之后所有目标端口是 8080 的包,内核都送给它。

65535 个端口是什么规模?相当于一栋写字楼有六万五千个房间,普通人一辈子也占不满。其中 0~1023 这一千来间是"物业专用"(要 root 权限才能占),剩下六万多间随便用——这也是为什么开发时随手挑 3000、8080、5173 都不会撞车。

范围官方名称特点例子
0 – 1023知名端口 Well-Known由 IANA 严格分配,Linux 上需要 root 权限才能监听80 HTTP、443 HTTPS、22 SSH、53 DNS
1024 – 49151注册端口 Registered向 IANA 登记,但普通用户也能用3306 MySQL、6379 Redis、8080 备用 HTTP
49152 – 65535动态/私有端口 Ephemeral客户端发起连接时系统随机挑,用完就还你浏览器每开一个连接就占一个

那 20 个最值得背下来的知名端口:

端口服务端口服务端口服务
20 / 21FTP 数据 / 控制110POP3 收邮件3306MySQL
22SSH / SFTP143IMAP 收邮件5432PostgreSQL
23Telnet(明文,别用)443HTTPS6379Redis
25SMTP 发邮件445SMB 文件共享8080HTTP 备用 / 代理
53DNS1433SQL Server27017MongoDB
80HTTP3389Windows 远程桌面9200Elasticsearch

关键概念来了:一个网络连接由五个要素唯一确定,叫"五元组"。这解释了一个常见困惑——为什么你能同时开五个标签页访问同一个网站,服务器却不会搞混?

五元组 = 协议 + 源IP + 源端口 + 目的IP + 目的端口

你开三个标签页访问 example.com:
  TCP  192.168.1.20 : 51234  →  93.184.216.34 : 443   ← 标签页 1
  TCP  192.168.1.20 : 51235  →  93.184.216.34 : 443   ← 标签页 2
  TCP  192.168.1.20 : 51236  →  93.184.216.34 : 443   ← 标签页 3
                      └─ 只有源端口不同,就足以区分成三个独立连接

所以:服务器端口是固定的(443),客户端端口是随机的。
一台服务器理论上能接的连接数远不止 65535 个 ——
因为区分靠的是完整五元组,不同客户端 IP 可以用相同端口号。

五元组这件事,用餐厅点菜来理解最顺:同一桌四个人各点一份宫保鸡丁,厨房怎么不搞混?因为厨房记的不是"宫保鸡丁",而是"3 号桌 1 号位的宫保鸡丁""3 号桌 2 号位的宫保鸡丁"。菜名一样、桌号一样,只要座位号不同,就是四份完全独立的订单。你开五个标签页访问同一个网站,区别就在那个"座位号"——随机分配的源端口。

实用命令,排查"端口被占用"这类问题的标准动作:

# Windows:看谁占了 8080
PS> netstat -ano | findstr :8080
  TCP    0.0.0.0:8080     0.0.0.0:0      LISTENING     14328
PS> tasklist | findstr 14328              # 用 PID 反查是哪个程序

# Linux / macOS:更直接
$ ss -tlnp | grep 8080                    # 或 lsof -i :8080
LISTEN 0 511 *:8080 users:(("node",pid=8123,fd=20))

# 看本机所有正在监听的端口(安全自查必备)
$ ss -tlnp
# 注意区分 127.0.0.1:3306(只本机可连)和 0.0.0.0:3306(全网可连!)

最后那条注释是安全上最要命的一课。把数据库绑在 0.0.0.0 上而没有防火墙,等于把家门钥匙挂在门外。互联网上有大量自动扫描程序全天候扫描 3306、6379、27017 这些端口,一台新开的云服务器如果 Redis 无密码暴露在公网,被入侵的时间通常以分钟计。

说白了,绑 0.0.0.0 又不设密码,就是把家门钥匙插在锁孔上,人出门了。你可能觉得"我这台机器谁知道啊"——互联网上有一大堆机器人 7×24 小时挨个门牌试锁,它们压根不需要知道你是谁,只需要一间间试过去。新开一台云服务器暴露无密码 Redis,从开机到被人种上挖矿程序,常常不到十分钟。

域名与 DNS · 给人看的名字

域名(Domain Name)是给人类看的——baidu.comxuehai-wuya.pages.dev。它比 IP 好记得多。

但计算机只认 IP。所以每次你输入域名,系统都要先做一次"翻译"——这就是 DNS(域名系统)做的事。它像一本全球联网的"电话簿"——问一句"xuehai-wuya.pages.dev 对应什么 IP",毫秒级给你答案。

DNS 干的活儿就是查通讯录:你只记得"妈妈"两个字,手机替你翻出后面那串号码再拨出去。你压根没意识到中间有这一步,因为它快到没有感觉。整个互联网上你敲的每一个网址,背后都先悄悄查了一次这本通讯录。

域名的结构是从右往左逐级收窄的,这一点跟中文地址正好相反,也是初学者最容易读错的地方:

www . mail . example . com .
 │      │       │       │   └─ 根域(root),平时省略不写的那个点
 │      │       │       └───── 顶级域 TLD(Top-Level Domain)
 │      │       └───────────── 二级域,你花钱注册的那一段
 │      └───────────────────── 三级域 / 子域,你自己随便加
 └──────────────────────────── 主机名

读法:从右往左 —— 根 → com → example → mail → www
中文地址是"中国 北京市 朝阳区 XX路 5号"(左→右收窄)
域名恰好反过来(右→左收窄)

读法记不住的话,就这么想:中文报地址是"从大说到小"(中国 → 北京 → 朝阳区 → 5 号),
域名是"从小说到大"(www → example → com → 根),
说白了就是同一件事倒着念一遍。

常见 TLD 类型:
  通用顶级域 gTLD:  .com .org .net .info .dev .app .xyz
  国家顶级域 ccTLD: .cn .jp .uk .de .io(英属印度洋领地).tv(图瓦卢)
  新顶级域:         .shop .cloud .ai .top(2013 年后开放,已超 1500 个)

顺便解释两个有趣的事实:.io 其实是英属印度洋领地的国家域名,因为拼写像 Input/Output 被科技圈爱上;.tv 属于太平洋岛国图瓦卢,这个只有一万人的国家靠出租域名赚到的钱,一度占其财政收入的近十分之一;.ai 属于安圭拉,近年 AI 热潮让这个小岛的域名收入暴涨到超过其 GDP 的两成。

这几件事说白了就是"门牌号的批发生意":图瓦卢这个只有一万人的岛国,什么产业都没有,就因为分到的国家后缀恰好是 .tv,靠出租"门牌号后缀"这一项,撑起了将近十分之一的国家财政。安圭拉更神——AI 一火,它手里那个 .ai 后缀的年租金超过了全岛 GDP 的两成。

Analogy · 一本会自己更新的电话簿

老式电话簿一年印一次,过时就要等新版。
DNS 像一本全球 24 小时在线的电话簿——任何人买了域名,几分钟内全世界都能查到。
这本"电话簿"分布在几十万台服务器上,互相备份——任何一个节点挂了,全球 DNS 也不会瘫。

那这次"查号"具体是怎么完成的?完整过程是一次逐级递归查询,一共可能问四五次。假设你的电脑第一次访问 www.example.com

① 查本机缓存        浏览器缓存 → 系统 DNS 缓存 → hosts 文件
                    命中就结束(0 毫秒,最常见的情况)
② 问本地 DNS        向 192.168.1.1 或 223.5.5.5 发一个 UDP 53 包
                    "www.example.com 的 A 记录是什么?"
③ 本地 DNS 问根     "com 归谁管?" → 全球 13 组根服务器之一回答
                    "去问 a.gtld-servers.net"
④ 本地 DNS 问 TLD   "example.com 归谁管?" → com 的服务器回答
                    "去问 ns1.example.com"
⑤ 本地 DNS 问权威   "www.example.com 是什么?" → 权威服务器回答
                    "93.184.216.34,TTL 300 秒"
⑥ 结果层层缓存      本地 DNS 存 300 秒,你的系统也存,浏览器也存

首次完整查询:50~200 毫秒
命中缓存:0~2 毫秒  ← 所以 99% 的查询你根本感觉不到

这五步查询,用问路来理解一遍就特别清楚:你要找"某市某区某小学", 先想想自己记不记得(查缓存); 记不住就问路边保安(本地 DNS); 保安也不知道,他打电话问市政府总机"某区归哪个分局管"(问根); 再问那个分局"这所小学归你们哪个片区"(问顶级域); 最后问到片区,才拿到确切门牌(问权威)。这一整套问下来 50~200 毫秒,但因为答案会被记在本子上,后面 99% 的次数都是 0 毫秒。

动手验证一下,nslookupdig 是最常用的两个工具:

$ nslookup www.example.com
服务器:  public1.alidns.com
Address:  223.5.5.5
非权威应答:                          <- "非权威"= 这是缓存里的答案
名称:    www.example.com
Address:  93.184.216.34

$ dig +short baidu.com A              # 只看结果,最常用
110.242.68.66
39.156.66.10                          <- 返回多个 IP,这是最朴素的负载均衡

$ dig baidu.com MX                    # 查邮件服务器
$ dig baidu.com NS                    # 查这个域名归哪台服务器管
$ dig +trace baidu.com                # 完整跟踪上面 ③④⑤ 每一步

# 遇到"改了 DNS 还是访问老 IP",清缓存:
PS> ipconfig /flushdns                # Windows
$ sudo dscacheutil -flushcache        # macOS

DNS 里有几种记录类型是绝对高频的,值得记住:A 记录(域名 → IPv4)、AAAA 记录(域名 → IPv6,四个 A 表示地址长了四倍)、CNAME(域名 → 另一个域名,用于把 www.a.com 指到 CDN 的地址)、MX(这个域名的邮件该送到哪台服务器)、TXT(放任意文本,实际用于域名所有权验证、SPF 反垃圾邮件配置)、NS(这个域名由哪台 DNS 服务器权威负责)。

最后说一个非常实用的知识点:TTL(Time To Live)。每条 DNS 记录都带一个 TTL,表示"这个答案你可以缓存多少秒"。它直接决定了你改 DNS 后多久生效——TTL 设成 86400(一天),那全世界的缓存最长要一天才更新完。所以运维界有条铁律:准备迁移服务器前 48 小时,先把 TTL 调到 60 秒;迁移完稳定了再调回去。不这么做,就会出现"一半用户访问新服务器、一半还在访问旧服务器"的分裂状态。

TTL 这件事,打个比方就是你把新号码告诉朋友,但朋友们的通讯录多久才更新一遍:TTL 设成一天,就意味着最慢有人要一整天以后才会用新号码给你打电话,在这之前他一直拨旧号。所以搬服务器之前先把 TTL 从一天调成一分钟,等于提前通知大家"这几天我的号可能会变,别存太久"。这一步没做,就会出现半数用户在新家、半数还在敲旧门的分裂局面。

NAT:一个公网 IP 让全家上网的魔术

现在把前面的知识串起来,一个矛盾就浮现了:你家有 15 台设备,全都是 192.168.1.x 这种私网地址,而私网地址在公网上是不可路由的——那它们到底是怎么上网的?

答案是 NAT(Network Address Translation,网络地址转换)。你家路由器在包出门的瞬间,把源地址"偷偷改掉",改成自己那个唯一的公网 IP;包回来时再改回去。准确地说,家用路由器做的是 NAT 的一个变种叫 NAPT(也叫 PAT、端口复用 NAT)——它不只改 IP,还改端口,靠端口来区分是家里哪台设备。

NAT 说白了就是一栋楼共用一个快递代收点:你家十五台设备的包裹都从这个点寄出去,寄件人一律写"代收点地址";东西回来时,代收点翻自己那本小册子——"哦,60001 号是 301 室的手机"——再准确送到你手上。外面的世界只见过那个代收点,从来不知道楼里到底住了几户。

【出门时】你的手机发包
  源: 192.168.1.101:51234  →  目的: 110.242.68.66:443
                    ↓ 路由器改写,并在表里记一笔
  源: 203.0.113.7:60001    →  目的: 110.242.68.66:443
      └ 你家唯一的公网 IP    └ 路由器新分配的端口

【路由器内部的 NAT 映射表】
  内部地址:端口          外部端口   目标
  192.168.1.101:51234  ←→  60001   110.242.68.66:443   手机
  192.168.1.20:44521   ←→  60002   93.184.216.34:443   笔记本
  192.168.1.87:33012   ←→  60003   47.95.11.2:8883      智能插座

【回来时】百度的响应包
  源: 110.242.68.66:443  →  目的: 203.0.113.7:60001
                    ↓ 路由器查表,发现 60001 对应手机
  源: 110.242.68.66:443  →  目的: 192.168.1.101:51234
                                          ↑ 准确还原,送达手机

NAT 是网络史上一次极为成功的"权宜之计"。它带来的好处显而易见:① 极大缓解了 IPv4 枯竭——理论上一个公网 IP 能带六万多个并发连接,实际家用几十台设备毫无压力;② 附带了一层安全屏障——外面的机器无法主动发起连接进来,因为路由器的 NAT 表里没有对应条目,包直接被丢掉,这等于免费送了一道防火墙。

"六万多个并发连接"换算一下就有画面了:相当于一个代收点能同时挂着六万多个待办包裹的记录。你家十五台设备一起刷视频、开游戏、看直播,加起来也就用掉几百个,压根摸不到天花板。真正会把它撑爆的是 BT 下载——一开就是几千上万个连接,代收点的小册子瞬间写满,路由器就卡死了。

但它的代价同样真实,而且你在生活里一定遇到过:

顺便区分一下几个容易混的概念:NAT 是改地址(发生在路由器上,你不知情);代理(Proxy)是替你去请求(发生在应用层,你主动配置的);VPN 是先加密建隧道、再从远端出网(改变的是你的"出口位置")。三者都会让"你看到的 IP"和"别人看到的你的 IP"不一样,但机制完全不同。

这三个概念用一句生活话就能分清:NAT 是楼下代收点悄悄替你换了寄件地址(你压根不知情);代理是你花钱请了个跑腿的,东西他去买、他去取,你只跟他打交道(你主动配的);VPN 是你挖了条只有你和对面知道的密道,先钻过去,再从对面那个城市出门办事(改的是你"从哪儿出门")。三个都让别人看到的不是你真实的门牌号,但干的活儿完全不是一回事。

三种地址如何配合

一次典型的"打开百度"过程,三种地址是这样协作的:

先把分工一句话说清:域名负责"人记得住",IP 负责"全球找得到",MAC 负责"这一段线上交给谁",端口负责"进了机器给哪个程序"。四者是接力,而不是竞争——每一棒交接的地方,恰好就是一层协议的边界。

这个接力过程,用一次点外卖走一遍就完全通了:你在 App 里点了"楼下那家川菜"(域名)→ 平台把它换成商家的确切地址(IP)→ 骑手取到餐,一路上不断决定"下一个路口往哪拐"(每一跳换 MAC)→ 到了你楼下,还得知道是几零几(端口)。四个环节缺一个,这顿饭就到不了你嘴里。

① 你输入 baidu.com

计算机看不懂这名字,先去问 DNS——"baidu.com 对应哪个 IP?"

② DNS 返回 IP

DNS 服务器回答:"是 110.242.68.66"。你的电脑记住了这个公网 IP。

③ 你的电脑构造数据包

包上写:源 IP(你的)= 192.168.1.101,目标 IP = 110.242.68.66。

④ 数据包经过你家的路由器

路由器一看"目标是公网 IP,不在我家局域网"——把包丢给上级网络,并把你的私网 IP"翻译"成你家对外的公网 IP(这个翻译叫 NAT)。

⑤ 数据包穿越公网

一路上经过几十个路由器,每个路由器都看一眼目标 IP,决定下一跳送哪。

⑥ 抵达百度机房

百度的服务器收到,按端口分发给具体的服务进程,处理请求,回包给你。

动态 vs 静态 IP

你的 IP 怎么来的?分两种:

实践中还有第三种、也是最推荐的选择:DHCP 静态保留(也叫地址绑定)。你在路由器后台把某台设备的 MAC 和一个固定 IP 绑在一起,设备端仍然用 DHCP 自动获取,但每次都拿到同一个号。这个方案兼具两者优点——设备端零配置、地址却永不变,且绝不会跟别人冲突。三者对比:

三种方式的差别,就是停车位的三种玩法纯动态 DHCP 好比每天进小区随便找个空位停(明天可能换地方,但绝不会跟人抢);设备端手填静态 好比你自己拿油漆在地上刷了个"我的车位"(物业压根不知道,明天照样把这位子分给别人,两车一起堵门口);DHCP 静态保留 好比在物业那儿登记了固定车位(物业记着这位子有主,别人不会被分到,你自己也啥都不用干)。第三种才是家里 NAS、打印机、摄像头的正确答案。

纯动态 DHCP设备端手填静态DHCP 静态保留
地址会变吗不会不会
配置在哪无需配置每台设备上单独填只在路由器上配一次
冲突风险——手填的地址可能又被 DHCP 分给别人无(路由器知道这个号被占了)
换网络后正常连不上网——地址不在新网段正常
适合谁手机、笔记本、访客设备不接入 DHCP 的工业设备NAS、打印机、摄像头、树莓派

第四行是最容易踩的坑:在笔记本上手填了公司的静态 IP,回家连 WiFi 就上不了网了——因为你填的 10.20.30.40 在家里的 192.168.1.0/24 网段里根本不合法。这种"在公司好好的、回家就断网"的故障,八成就是这个原因。

为什么手填静态 IP 回家就断网?说白了就是你把公司那个小区的门牌号,硬贴到了自己家门上——你家小区压根没有"10 号楼"这个楼,邮递员站在院子里转半天也找不着你。所以笔记本、手机这类到处跑的设备,永远别手填静态 IP。

localhost · 一个特殊的 IP

127.0.0.1(或者 localhost)是个特殊地址——它永远指向你自己这台机器。程序员常说"我在 127.0.0.1:3000 起了个服务",意思是"这个服务跑在我自己电脑上,外面访问不到"。
你 ping 一下 127.0.0.1——光速返回,因为根本没出网。

127.0.0.1 相当于你写给自己的一张便签,直接贴在自己冰箱上:从写到看,全程没出过家门,更没经过邮局。所以网线拔了、WiFi 关了,它照样通——因为这事压根不需要外面的世界参与。

除了它,IPv4 里还有一批"有特殊含义"的地址,混用它们会导致非常难查的问题。这张表值得收藏:

地址 / 网段含义常见误用
0.0.0.0作为监听地址时 = "本机所有网卡";作为目标时 = "未指定"把它当成"本机地址"用——它不是,它是"所有地址"
127.0.0.0/8回环网段,整整 1677 万个地址全指向本机以为只有 127.0.0.1 一个
255.255.255.255受限广播——发给"本网段所有主机",路由器不转发以为能广播到整个互联网
169.254.0.0/16链路本地——DHCP 失败的标志看到它还在查浏览器和 DNS
224.0.0.0/4组播地址——发一次,一组订阅者都收到当成普通单播 IP 去 ping
8.8.8.8 / 223.5.5.5 / 1.1.1.1公共 DNS(Google / 阿里 / Cloudflare)用它们测"网通不通"其实很合适,但别当自己的网关

第一行是新手最容易搞混的一对,值得再强调一遍:服务监听 127.0.0.1:8000,只有本机能访问;监听 0.0.0.0:8000,局域网里所有人都能访问。前者用于开发,后者用于部署。搞反的两个典型后果是:"我明明启动了服务,同事却连不上"(绑了 127.0.0.1),以及"我的开发数据库怎么被人删库了"(绑了 0.0.0.0 且没设密码)。

整张表里最值得记住的还是那对:127.0.0.1 是"只招待自己人",0.0.0.0 是"所有门都开着"。打个比方,前者是你在自己家餐桌上吃饭,后者是你把菜端到小区门口那张桌上——菜是一样的菜,谁能夹一筷子完全是两回事。部署时这一个字符搞反,轻则同事连不上,重则第二天上安全通报。

Recap · 收束

三种地址,三种用途:MAC 是身份证(一生不变);IP 是住址(暂时所属);域名是绰号(方便人记)。它们一起工作,让数据包既能在全球互联网上找到你,又能在你家客厅找到你的手机。
再加上第四个标识——端口(0~65535),负责"包到了机器以后交给哪个程序"。四者合起来构成完整的寻址体系:域名 → IP → MAC → 端口,恰好对应协议的应用层、网络层、链路层、传输层。
几个必须记住的数字与事实:MAC 是 48 位,前 24 位是厂商 OUI,可以拿来认品牌,但能被软件伪造;IP 每过一台路由器目的地不变,MAC 全换——这是最重要的一条;192.168/1610/8172.16/12 是 RFC 1918 规定的私网段,全世界随便用不会冲突;看到 169.254.x.x 就是 DHCP 失败0.0.0.0 是"所有网卡"而不是"本机"。
子网掩码的唯一职责是划出"网络号 / 主机号"的分界,CIDR 记法(/24)让这条界线能卡在任意一位上,硬生生给 IPv4 延寿二十多年。而真正的解药 IPv6 把地址拉到 128 位,多到"地球每平方米能分一摩尔个",代价是不向后兼容,普及了二十多年才过半。
最后是 NAT:它让全家十几台私网设备共用一个公网 IP,代价是打破了"任何主机都能直连任何主机"的原始设计——你玩游戏组不了队、访问不了家里的 NAS,根源都在这里。整个现代 IPv4 互联网,本质上是靠 CIDR + NAT + DNS 这三根拐杖,硬撑着一套 1981 年设计的地址方案,服务了 2025 年的三百亿台设备。

☰ 主页
Xue Hai Wu Ya · Network · § 1.3 · Address