IPv4与IPv6地址结构、子网划分及双栈过渡实战指南
1. 为什么今天还要回头啃 IPv4 和 IPv6 这些老概念刚入行那会儿我也觉得 IP 地址这东西没什么好聊的——不就是一串数字嘛会配就行。直到有一次线上环境出问题一台机器怎么都连不上另一台排查了大半天最后发现是子网掩码配错了两台机器压根不在一个网段里。那次之后我才真正意识到IP 这块基础不扎实后面学什么路由、防火墙、容器网络都是空中楼阁。IPv4 和 IPv6 是计算机网络里最底层、也最容易被忽略的一块。它解决的问题很朴素在一个由无数设备组成的网络里怎么给每台设备一个唯一标识并且让数据准确送到对方面前。听起来简单但真要把地址结构、子网划分、地址类型、过渡机制这些讲清楚能写厚厚一本书。这篇内容我打算按自己平时带新人、排查问题的思路来写不搞教科书那套从 OSI 七层模型讲起的流程。适合谁看如果你是刚学网络的学生、准备考证的运维、写后端但总被网络问题卡住的开发或者单纯想把这块知识补扎实的人都能从里面找到能直接用的东西。我会把 IPv4 的地址结构、子网划分、特殊地址IPv6 的地址格式、类型、优势以及两者怎么共存过渡全部拆开揉碎讲一遍中间穿插我自己踩过的坑和实际配置经验。核心关键词先摆出来IPv4 地址、IPv6 地址、子网掩码、CIDR、地址分类、NAT、双栈、地址过渡。这些词你后面会反复看到它们就是这块知识的骨架。2. IPv4 地址结构深度拆解与子网划分实操2.1 32 位地址到底是怎么组成的IPv4 地址本质是一个32 位的二进制数。32 位听起来抽象我们换个说法它由 4 个字节组成每个字节 8 位写成十进制就是 0 到 255 之间的数字中间用点隔开比如192.168.1.1。这种写法叫点分十进制纯粹是为了让人看着舒服机器眼里它就是 32 个 0 和 1。为什么是 32 位因为早期设计者觉得这个长度够用了理论上能提供约 43 亿个地址2 的 32 次方。当年没人想到后来手机、电脑、摄像头、冰箱全都要联网43 亿根本不够分这才有了 IPv6。这个背景很重要理解了它你才能明白为什么会有 NAT、为什么 IPv6 要搞 128 位。一个 IPv4 地址在逻辑上分成两部分网络部分和主机部分。网络部分标识你属于哪个网段主机部分标识你是这个网段里的哪台设备。怎么区分这两部分靠子网掩码。掩码里连续的 1 对应网络部分连续的 0 对应主机部分。比如掩码255.255.255.0前 24 位是 1后 8 位是 0意味着前 24 位是网络号后 8 位是主机号。提示子网掩码的 1 必须是连续的不能出现255.0.255.0这种这是硬性规则配错了设备直接不认。2.2 地址分类那段历史以及为什么现在没人用了早期 IPv4 采用有类编址把地址按第一个字节的范围分成 A、B、C、D、E 五类。A 类以 0 开头第一个字节 1 到 126默认掩码/8能容纳上千万台主机B 类以 10 开头第一个字节 128 到 191默认掩码/16C 类以 110 开头第一个字节 192 到 223默认掩码/24只能放 254 台主机D 类是组播地址224 到 239E 类保留做实验240 到 255。这套分类现在基本只存在于考卷里。原因很现实太浪费。一个公司如果只需要 300 个地址申请一个 B 类6 万多个地址浪费得离谱申请一个 C 类254 个又不够用。这种粗放的分法在地址越来越紧张的年代根本撑不住于是CIDR无类别域间路由登场了。CIDR 的核心思想是不再看第一个字节定类别而是用斜杠后面的数字直接指定网络位数。比如192.168.1.0/24斜杠后的 24 就表示前 24 位是网络号。这样你可以自由地划出/25、/26、/30各种大小的网段按需分配浪费大大减少。现在你看到的所有现代网络配置用的都是 CIDR。2.3 子网划分手把手算一遍你就懂了子网划分是 IPv4 里最实用、也最容易算错的部分。我带新人的时候发现大家卡住的点几乎都一样不知道一个网段里到底有多少可用地址网络地址和广播地址怎么算。这里我用一个具体例子走一遍。假设给你一个网段192.168.10.0/24要划分成 4 个子网每个子网能放 50 台左右设备。怎么算第一步确定要借几位。4 个子网需要 2 的 2 次方所以要借 2 位主机位当子网位。原来的/24变成/26掩码就是255.255.255.192。第二步算每个子网的块大小。主机位还剩 6 位32 减 262 的 6 次方是 64所以每个子网跨度是 64 个地址。第三步列出四个子网子网网络地址可用主机范围广播地址子网 1192.168.10.0192.168.10.1 - 192.168.10.62192.168.10.63子网 2192.168.10.64192.168.10.65 - 192.168.10.126192.168.10.127子网 3192.168.10.128192.168.10.129 - 192.168.10.190192.168.10.191子网 4192.168.10.192192.168.10.193 - 192.168.10.254192.168.10.255每个子网 64 个地址去掉网络地址和广播地址可用 62 个满足 50 台的需求。这里有个规律要记住网络地址是子网的第一个地址主机位全 0广播地址是最后一个主机位全 1这两个都不能分配给设备。注意很多人算可用地址数量时直接用 2 的 n 次方忘了减 2。/26是 64 个地址可用是 62 个不是 64 个。这个错误在配地址池的时候特别致命会导致地址池越界。2.4 那些必须记住的特殊地址IPv4 里有几个地址是特权阶级不能随便用考试和实战都绕不开127.0.0.0/8环回地址最常用的是127.0.0.1代表本机。你 ping 它永远通哪怕网卡坏了。0.0.0.0表示本机所有网卡或默认路由。服务端监听0.0.0.0意味着监听所有网卡客户端连0.0.0.0通常没意义。255.255.255.255受限广播地址只在本网段内广播路由器不转发。私有地址段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。这三段是专门留给内网用的公网上不路由。你在家里、公司看到的地址基本都是这几段。169.254.0.0/16链路本地地址。设备开了 DHCP 但没拿到地址时会自动给自己配一个这范围的地址。看到这个地址基本可以断定是 DHCP 出问题了。私有地址这个设计非常关键它是NAT网络地址转换的基础。因为公网地址不够用大家内网都用私有地址出门的时候通过 NAT 转换成公网地址。你家路由器就是这个角色它把家里所有设备的私有地址统一换成运营商给你的那一个公网地址。2.5 NAT让 IPv4 续命的关键技术NAT 的原理说白了就是地址翻译。内网设备要访问外网数据包经过路由器时路由器把源地址从私有地址改成自己的公网地址同时记下这个映射关系回包回来时再根据映射关系改回原来的私有地址。NAT 有好几种形式静态 NAT是一对一固定映射动态 NAT是从地址池里动态分配PAT端口地址转换是最常见的多个内网设备共用一个公网地址靠不同的端口号区分。你家路由器用的就是 PAT所以家里十几台设备能同时上网全靠端口号在背后做区分。NAT 解决了地址不够的问题但也带来副作用外网无法主动访问内网设备。因为 NAT 表里没有对应的映射外网发来的包不知道转给谁。这就是为什么你在家搭个服务外网访问不了得做端口映射。这个限制在做 P2P、视频通话、游戏联机时特别明显也是后来推动 IPv6 普及的原因之一。3. IPv6 地址体系全解析与实战配置3.1 128 位地址为什么这么设计IPv6 把地址长度从 32 位直接拉到128 位。这个跨度很大理论地址数量是 2 的 128 次方这个数字大到什么程度大概可以给地球上每一粒沙子都分配一个地址而且还有富余。当年设计者干脆一步到位就是不想再经历一次地址枯竭。128 位写成二进制太长所以 IPv6 用十六进制表示每 16 位一组共 8 组组间用冒号隔开比如2001:0db8:0000:0000:0000:ff00:0042:8329。这写法太啰嗦于是有两条缩写规则前导零可以省略0db8写成db80042写成42。连续的零可以用::代替但只能出现一次上面那个地址可以缩写成2001:db8::ff00:42:8329。注意::只能出现一次因为它代表这里省略了若干组零出现两次机器就不知道每组该补几个零了。这是新手最容易犯的格式错误。3.2 IPv6 的地址类型比 IPv4 丰富得多IPv6 没有广播这个概念了取而代之的是更精细的分类单播地址一对一通信最常见。包括全局单播地址2000::/3 开头相当于公网地址、链路本地地址fe80::/10 开头每块网卡自动生成只在本链路有效、唯一本地地址fc00::/7相当于私有地址。组播地址一对多ff00::/8 开头。IPv6 大量使用组播比如 solicited-node 组播用于地址解析。任播地址一对最近的一个。同一个任播地址配在多台设备上数据包送到拓扑上最近的那台。这个在 CDN、DNS 根服务器里用得很多。链路本地地址fe80::开头这个要特别说一下。每块网卡启用 IPv6 后会自动生成一个不需要 DHCP也不需要手动配。它的作用范围仅限本地链路路由器不转发。你在排查 IPv6 问题时ping6一个fe80::地址必须指定出接口否则机器不知道从哪块网卡发出去。3.3 IPv6 相比 IPv4 到底强在哪不只是地址多。IPv6 在协议设计上做了不少优化这些才是它真正的价值报头简化。IPv4 报头是变长的20 到 60 字节带一堆可选字段路由器处理起来慢。IPv6 把报头固定成 40 字节可选功能挪到扩展报头里路由器只处理基础报头转发效率更高。取消广播。IPv4 里 ARP 请求是广播的一个网段里所有设备都得处理。IPv6 用组播替代只有相关设备才响应减少了对无关设备的打扰。内置自动配置。IPv6 支持SLAAC无状态地址自动配置设备接入网络后能自己算出地址不一定需要 DHCP 服务器。当然 IPv6 也能用 DHCPv6两种方式可以共存。原生支持端到端。IPv6 地址足够多理论上不需要 NAT每台设备都能有全局地址外网可以直接访问。这对 P2P、物联网设备非常友好。当然实际部署中出于安全考虑很多网络还是会做防火墙策略。报头里没有校验和。IPv4 报头有校验和每跳路由器都要重算。IPv6 把这个活交给上层协议TCP/UDP去做路由器负担更轻。3.4 在设备上配一个 IPv6 地址理论讲完来点能直接抄的。在 Linux 上给网卡配 IPv6 地址用ip命令# 查看当前网卡的 IPv6 地址 ip -6 addr show # 给 eth0 添加一个全局 IPv6 地址前缀长度 64 sudo ip -6 addr add 2001:db8::100/64 dev eth0 # 添加默认网关 sudo ip -6 route add default via 2001:db8::1 dev eth0 # 验证连通性 ping6 2001:db8::1如果要持久化不同发行版写法不一样。以常见的 systemd-networkd 为例配置文件里加[Network] Address2001:db8::100/64 Gateway2001:db8::1配完记得检查一下内核有没有开启 IPv6 转发做路由器的话这个必须开# 临时开启 sudo sysctl -w net.ipv6.conf.all.forwarding1 # 永久生效写入 /etc/sysctl.conf net.ipv6.conf.all.forwarding1提示有些环境默认把 IPv6 关了配了半天不生效先确认/proc/sys/net/ipv6/conf/all/disable_ipv6是不是 0。这个坑我踩过排查了半小时才发现是系统层面禁用了。3.5 地址规划别把 IPv6 当 IPv4 用很多人第一次规划 IPv6 地址习惯性地想我要划几个子网每个子网放多少台机器然后按 IPv4 的思路去算。这是错的。IPv6 的标准做法是每个子网固定用 /64因为 SLAAC 自动配置要求前缀必须是 64 位。一个 /64 能放 2 的 64 次方个地址你根本用不完不需要像 IPv4 那样精打细算。规划的重点变成怎么给不同的区域、不同的用途分配不同的 /64 前缀。通常运营商或上级会给一个 /48 或 /56 的段你在这个段下面按区域划 /64。比如2001:db8:1::/48给办公区2001:db8:2::/48给服务器区每个区域内部再细分 /64。这种大手大脚的划法在 IPv4 时代不可想象但在 IPv6 里是标准操作。4. IPv4 与 IPv6 共存过渡的实战方案4.1 双栈目前最主流的过渡方式IPv4 和 IPv6 不可能一夜之间切换中间必然有一段长期共存期。双栈Dual Stack是最简单也最主流的方案设备同时配 IPv4 和 IPv6 地址两套协议栈并行运行访问 IPv4 目标走 IPv4访问 IPv6 目标走 IPv6。双栈的好处是透明。应用层基本不用改操作系统会根据 DNS 解析结果自动选择用哪套协议。现在主流的操作系统、路由器、云服务商都支持双栈。你打开一台现代服务器ip addr一看通常既有inet也有inet6。但双栈有个经典问题叫Happy Eyeballs。当目标同时有 A 记录IPv4和 AAAA 记录IPv6时客户端如果先试 IPv6 但 IPv6 不通会卡住一段时间才回退到 IPv4用户体验很差。解决办法是客户端同时发起 IPv4 和 IPv6 连接谁先通用谁。这个机制现在主流浏览器和系统都实现了但自己写网络程序时要注意。4.2 隧道技术让 IPv6 包穿过 IPv4 网络如果两个 IPv6 网络之间隔着一段 IPv4 网络可以用隧道把 IPv6 包封装在 IPv4 包里传过去。常见的隧道技术有几种6to4用 2002::/16 前缀把 IPv4 地址嵌进 IPv6 地址里自动建立隧道。配置简单但依赖中继实际效果不稳定现在基本淘汰了。Teredo给没有公网 IPv4 的设备用把 IPv6 包封装在 UDP 里穿过 NAT。同样因为复杂和不稳定用得越来越少。手动配置隧道两端手动指定隧道端点稳定可控适合固定场景。GRE 隧道通用性强很多企业用它在两个站点间传 IPv6。隧道技术的共同问题是增加了封装开销且 MTU 会变小。IPv6 包本身可能就 1500 字节再套一层 IPv4 头超过链路 MTU 就得分片性能下降。配隧道时通常要把 MTU 调小比如设成 1480 或 1400给封装留空间。4.3 翻译技术NAT64 和 DNS64如果一端只支持 IPv6另一端只支持 IPv4就需要协议翻译。NAT64 负责把 IPv6 包翻译成 IPv4 包DNS64 负责把 IPv4 的 DNS 结果合成一个 IPv6 地址让纯 IPv6 客户端能看到IPv4 服务。这套组合在移动网络里用得比较多因为移动运营商推进 IPv6 比较积极。但翻译技术有局限只支持 TCP、UDP、ICMP 这些基础协议带内嵌地址的协议比如 FTP、SIP翻译起来很麻烦需要 ALG应用层网关辅助而 ALG 又经常出问题。注意NAT64 环境下应用如果硬编码了 IPv4 地址是没法工作的。写代码时尽量用域名让 DNS 去处理协议选择。4.4 过渡方案怎么选一张表说清楚方案适用场景优点缺点双栈绝大多数场景透明、应用无需改需要两套地址和路由隧道两 IPv6 网络隔 IPv4不改中间网络MTU 变小、配置复杂NAT64/DNS64纯 IPv6 访问 IPv4单向过渡友好协议支持有限464XLAT移动网络客户端无感依赖运营商部署实际生产环境里双栈是首选其他方案都是补充。我个人的经验是能双栈就双栈实在不行再考虑隧道或翻译。隧道和翻译都是权宜之计维护成本高出问题时排查链路长能不用就不用。5. 常见问题排查与避坑经验实录5.1 地址配了但不通先查这几项网络不通是最常见的问题我总结了一套排查顺序基本能覆盖八成情况查地址和掩码ip addr看地址配没配对掩码对不对。掩码错了会导致同网段设备互相不通。查路由ip route看有没有默认网关网关地址在不在本网段。查链路ip link看网卡是不是 UP 状态物理层通不通。查 ARP/邻居IPv4 用arp -nIPv6 用ip -6 neigh看能不能解析到对端 MAC。查防火墙iptables -L或nft list ruleset看有没有规则把包拦了。抓包前面都正常还不通直接tcpdump抓包看数据包到底发出去没有、有没有回。这套流程走下来绝大多数问题都能定位。最怕的是一上来就瞎猜改这改那最后把配置改乱了问题反而更难查。5.2 IPv6 特有的坑IPv6 有些问题是 IPv4 里没有的第一次遇到容易懵链路本地地址必须指定接口。ping6 fe80::1会报错得写成ping6 fe80::1%eth0。因为fe80::地址每块网卡都有不指定接口机器不知道从哪发。重复地址检测DAD。IPv6 配地址后会先做 DAD确认地址没被占用才正式启用。这期间地址处于 tentative 状态不能用。如果 DAD 失败地址会变成 duplicated直接不可用。排查时看ip -6 addr的状态标记。RA 和 DHCPv6 的关系。IPv6 的自动配置靠路由器发RA路由器通告RA 里会告诉设备用 SLAAC 还是 DHCPv6。如果 RA 没发或者被拦了设备可能拿不到地址。排查时先确认 RA 有没有正常发出。MTU 问题。IPv6 不允许中间路由器分片分片只能由源端做。如果路径 MTU 发现PMTUD被防火墙拦了 ICMPv6会出现小包能通大包不通的诡异现象。这个坑很深遇到时记得检查 ICMPv6 有没有被拦。5.3 常见问题速查表现象可能原因排查命令同网段不通掩码配错ip addr对比掩码跨网段不通缺默认路由ip route拿到 169.254 地址DHCP 失败检查 DHCP 服务IPv6 地址 tentativeDAD 未完成ip -6 addr看状态ping6 链路本地失败没指定接口加%eth0小包通大包不通MTU/PMTUD 问题ping -M do -s测 MTU外网访问不了内网NAT 无映射检查端口映射配置5.4 我踩过的几个真实坑第一个坑是子网掩码写成255.255.255.0但实际需要/25。当时两台机器地址看着在同一段但一台是192.168.1.10/24另一台是192.168.1.200/25。/25的网段是192.168.1.0到192.168.1.127200根本不在这个范围里自然不通。这种问题看地址看不出来必须看掩码。第二个坑是IPv6 的::缩写用错。有次配地址写成2001:db8::1::2系统直接报错。原因是::出现了两次机器无法确定每组补几个零。正确写法只能有一个::。第三个坑是NAT 环境下做端口映射忘了开对应端口的防火墙。映射配好了外网还是访问不了查了半天发现是防火墙把入站包拦了。NAT 和防火墙是两回事映射只解决地址转换放行还得靠防火墙规则。第四个坑是隧道 MTU 没调。配了个 GRE 隧道传 IPv6小包正常一传大文件就卡死。后来把隧道接口 MTU 从 1500 调到 1400问题解决。封装会占掉一部分空间MTU 必须留够余量。5.5 给新手的几条实操建议如果你刚开始接触这块我给几条实在的建议先玩熟 IPv4 再碰 IPv6。IPv4 的概念网段、掩码、网关、路由是基础这些没搞明白学 IPv6 会更晕。多用ip命令少用ifconfig。ifconfig已经过时了ip命令功能更全输出更清晰是现在的主流。抓包是终极武器。理论再熟不如抓一次包看得明白。tcpdump和 Wireshark 一定要会用。配之前先画图。把网段、地址、网关在纸上画出来比在脑子里想靠谱得多尤其是子网划分的时候。改配置前先备份。网络配置改错了可能直接失联改之前把原配置存一份出问题能快速回滚。这块知识的特点是入门容易精通难。地址长什么样、怎么配半小时就能学会但子网划分、路由选择、过渡方案这些需要反复实践才能真正掌握。我的经验是别指望看一遍就全记住遇到问题回来查、回来算几次之后自然就熟了。网络这东西纸上谈兵没用配通了、抓包看明白了才算真的会了。