地址 · Address
网络上每台主机都得有"门牌号",不然数据包找不到它。但"门牌号"这个词其实有三种不同的地址——IP、MAC、域名——它们各自解决不同的问题,又互相配合。
你想找朋友小明——可以用三种方式描述他:
① 身份证号:370100199001011234——一辈子不变,全国唯一。
② 现居地址:北京市朝阳区 XX 路 5 号院 3 栋 501——小明搬家就换。
③ 名字:张小明——方便你叫他,但同名的人很多。
在网络世界里,这三种描述对应:
① 身份证号 = MAC 地址(出厂烧死,全球唯一);
② 现居地址 = IP 地址(走到哪,临时分一个);
③ 名字 = 域名(baidu.com 这种,方便人记)。
为什么需要"三套"地址系统
初学者最自然的疑问是:一套地址不够用吗?为什么要搞得这么复杂?答案是:这三套地址解决的是三个完全不同、且都无法互相替代的问题。
- MAC 解决"这根线上谁是谁"同一个交换机下挂着 20 台机器,电信号是广播出去的,每台机器都得判断"这一帧是不是给我的"。MAC 就是这个判断依据。它不需要可路由,只需要在这一小片区域里唯一。
- IP 解决"全球几十亿台里怎么找到你"MAC 地址是扁平的——48 位随机数,没有任何规律,路由器不可能记住全球所有 MAC。IP 地址是分层的:前面几位表示"哪个国家哪家运营商哪个城市",后面才是具体的机器。这种层级结构让路由器只需要记住"这一大片归谁",而不是每台机器。
- 域名解决"人类记不住数字"你能记住
110.242.68.66吗?记住了明天百度换 IP 你就白记了。域名把"是谁"和"在哪"解耦了——网站可以随便搬家,域名不变。
再加上第四个:端口解决"到了机器以后交给哪个程序"。你的电脑同时开着浏览器、微信、游戏、下载器,包到了以后总得有个依据分发给正确的程序。四套标识各管一段,缺任何一个网络都会立刻塌掉一大块。这一节我们把它们全部拆开讲清楚。
四套地址的分工,用寄快递一次说透:域名相当于你在通讯录里存的"公司前台"(人记得住的名字);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 地址随机化"防止商场用 WiFi 探针追踪你。
- 可被伪造"烧进硬件"只是说出厂值固定,操作系统完全可以在发包时填一个假的。Linux 上一条
ip link set eth0 address 00:11:22:33:44:55就改了。所以任何靠 MAC 做安全认证的方案都是纸糊的。 - 有特殊值
ff:ff:ff:ff:ff:ff是广播地址,意思是"这一段网络里所有机器都听着"。ARP 询问、DHCP 请求都靠它。
其中"可被伪造"这一条得单独敲一下:"烧进硬件"只能保证出厂值固定,可它并不能保证发出去的包上写的是真值。这好比小区门口的登记本——你确实有身份证,但登记的时候写谁的名字全凭你自觉。所以任何"只要 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 亿 —— 差了一个数量级。
| 类型 | 格式 | 典型例子 | 说明 |
|---|---|---|---|
| IPv4 | 4 个 0-255 数字 | 8.8.8.8 | 经典老格式,43 亿上限,已耗尽 |
| IPv6 | 8 组 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.255 | 10.0.0.0/8 | 约 1678 万 | 大型企业、云厂商 VPC、K8s 集群 |
172.16.0.0 – 172.31.255.255 | 172.16.0.0/12 | 约 105 万 | 中型企业、Docker 默认网桥(172.17) |
192.168.0.0 – 192.168.255.255 | 192.168.0.0/16 | 65536 | 几乎所有家用路由器的默认段 |
100.64.0.0 – 100.127.255.255 | 100.64.0.0/10 | 约 419 万 | 运营商级 NAT(CGNAT)——很多人的宽带其实在这里 |
169.254.0.0 – 169.254.255.255 | 169.254.0.0/16 | 65536 | 链路本地地址: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 / 21 | FTP 数据 / 控制 | 110 | POP3 收邮件 | 3306 | MySQL |
| 22 | SSH / SFTP | 143 | IMAP 收邮件 | 5432 | PostgreSQL |
| 23 | Telnet(明文,别用) | 443 | HTTPS | 6379 | Redis |
| 25 | SMTP 发邮件 | 445 | SMB 文件共享 | 8080 | HTTP 备用 / 代理 |
| 53 | DNS | 1433 | SQL Server | 27017 | MongoDB |
| 80 | HTTP | 3389 | Windows 远程桌面 | 9200 | Elasticsearch |
关键概念来了:一个网络连接由五个要素唯一确定,叫"五元组"。这解释了一个常见困惑——为什么你能同时开五个标签页访问同一个网站,服务器却不会搞混?
五元组 = 协议 + 源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.com、xuehai-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 的两成。
老式电话簿一年印一次,过时就要等新版。
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 毫秒。
动手验证一下,nslookup 和 dig 是最常用的两个工具:
$ 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 让这条原则失效了——你无法主动连到别人家的电脑。这也是 IP 协议设计哲学上的一次重大倒退。
- 主动服务变得困难你想让朋友访问你电脑上的游戏服务器或 NAS,必须在路由器上手动配"端口转发"(把外部 8080 指到内部某台机器),或者用 UPnP 让程序自动开洞。
- P2P 需要"打洞"两台都在 NAT 后面的机器要直连,得靠第三方服务器牵线(STUN/TURN),让双方同时向对方发包,在两边的 NAT 表里各撞出一个洞。视频通话、联机游戏全靠这套。"NAT 类型严格"导致游戏组不了队,说的就是这件事。
- 连接数与状态压力NAT 表要为每个连接保存状态,还得设超时清理。这就是为什么 BT 下载开太多连接会把家用路由器搞卡死——不是带宽跑满了,是 NAT 表爆了。
- 溯源与封禁困难一整栋楼共用一个公网 IP,某个网站封了这个 IP,全楼的人都上不去。这就是"我啥也没干怎么被封了"的常见来源。
顺便区分一下几个容易混的概念: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 怎么来的?分两种:
- 动态 IP(DHCP)路由器临时分一个给你——家用宽带、手机 WiFi 都是这种。便宜,省心。
- 静态 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 是"所有门都开着"。打个比方,前者是你在自己家餐桌上吃饭,后者是你把菜端到小区门口那张桌上——菜是一样的菜,谁能夹一筷子完全是两回事。部署时这一个字符搞反,轻则同事连不上,重则第二天上安全通报。
三种地址,三种用途:MAC 是身份证(一生不变);IP 是住址(暂时所属);域名是绰号(方便人记)。它们一起工作,让数据包既能在全球互联网上找到你,又能在你家客厅找到你的手机。
再加上第四个标识——端口(0~65535),负责"包到了机器以后交给哪个程序"。四者合起来构成完整的寻址体系:域名 → IP → MAC → 端口,恰好对应协议的应用层、网络层、链路层、传输层。
几个必须记住的数字与事实:MAC 是 48 位,前 24 位是厂商 OUI,可以拿来认品牌,但能被软件伪造;IP 每过一台路由器目的地不变,MAC 全换——这是最重要的一条;192.168/16、10/8、172.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 年的三百亿台设备。