IP 协议基础
IP 协议基础
一个问题:几十亿台设备怎么寻址
如果让你设计一个全球网络,第一步是什么?答案是:给每台设备分配一个唯一地址。但 IPv4 地址只有 32 位,能表示 2^32 ≈ 43 亿个地址。听起来很多,但 2025 年全球联网设备已经超过 200 亿台。43 亿根本不够分。
IPv4 的设计者(1970 年代)显然低估了互联网的规模。1981 年 RFC 791 发布 IPv4 时,全球计算机数量才几万台。没人想到 40 年后连冰箱、灯泡都要 IP。
地址不够用是 IPv4 的根本困境。围绕这个困境,诞生了一整套 IP 协议族:子网划分(CIDR)、网络地址转换(NAT)、私有地址、IPv6。下面我们从"为什么要有 IP 地址"开始,一步步走完这套体系。
IP 地址是什么
IP 地址是一个 32 位二进制数,按 8 位一组分成 4 段,每段转成十进制,用点分隔。比如 192.168.1.100,二进制是 11000000.10101000.00000001.01100100。
这个 32 位地址分两部分:网络号和主机号。网络号表示"这个 IP 在哪个网络",主机号表示"这个网络里的第几台设备"。问题是:32 位里哪几位是网络号、哪几位是主机号?
早期答案:用 IP 地址的第一个字节判断。0-127 开头是 A 类(8 位网络号,24 位主机号,可容纳 1677 万台主机),128-191 是 B 类(16+16),192-223 是 C 类(24+8,256 台主机)。这就是分类网络。但它非常浪费:一家公司有 200 台机器,给个 C 类(256)正好;但给个 A 类(1677 万)就是巨大浪费。
现代答案:CIDR(无类域间路由)。用子网掩码告诉你哪些位是网络号。192.168.1.100/24 表示前 24 位是网络号,后 8 位是主机号。子网掩码写出来就是 255.255.255.0。/24 里的 24 是前缀长度。
CIDR 让网络规模可以灵活划分。/24 是 256 个地址,/16 是 65536 个,/30 是 4 个(点对点链路最常用)。可以精确匹配组织规模。
私有地址和公网地址
IPv4 地址分公网和私网两类。
公网地址全球唯一,你在任何地方 ping 它都能路由到。8.8.8.8(Google DNS)、1.1.1.1(Cloudflare DNS)都是公网 IP。
私有地址只在一个局域网内使用,不同局域网可以重复。RFC 1918 规定了三段私有地址:
10.0.0.0/8(1677 万地址,A 类)172.16.0.0/12(104 万地址,B 类)192.168.0.0/16(65536 地址,C 类,最常用)
你家路由器给你分配的 192.168.1.100 就是私有地址。你邻居家也用 192.168.1.100,但两家的 IP 互不冲突,因为它们在不同的局域网里,靠 NAT 转换到不同的公网 IP 出去。
为什么这么设计?因为 IPv4 地址不够,所有人不可能都拿公网 IP。私有地址让你家里、公司里可以有几十亿台设备用同样的 IP(192.168.1.100),反正它们在各自的局域网里互不相通。
IP 数据报结构
IP 数据报(也叫 IP 包)是网络层的基本传输单位。IPv4 头部 20 字节固定,加可选字段最多 60 字节。
IPv4 头部结构:
几个关键字段:
TTL(生存时间):每经过一个路由器减 1,到 0 路由器把包丢掉。这是为了防止路由环路(两个路由器互相指向对方,包永远转圈)。你 ping 看到 time to live=56 是因为 Windows 默认初始 TTL 64,路上丢了 8 跳。
协议:上层协议类型。6 是 TCP,17 是 UDP,1 是 ICMP。路由器看这个字段决定把数据报交给本机的哪个协议栈。
标识、标志、片偏移:分片相关。如果一个数据报超过路径上某个链路的 MTU(通常 1500 字节),路由器会把它切成几片,每片带不同的片偏移,对端再拼起来。但分片是性能杀手,IPv6 直接禁了路由器分片,只能源端分片。
头部校验和:只校验 IP 头部,不校验数据。数据校验交给上层(TCP/UDP 自己有校验和)。
一个完整的 IP 通信过程
你的电脑 192.168.1.100 要发包给 8.8.8.8(Google DNS):
第 1 步:查路由表。 你的电脑看 8.8.8.8 不在本地子网(192.168.1.0/24),查路由表找下一跳——默认网关 192.168.1.1。
第 2 步:ARP 解析。 你的电脑需要把包发给 192.168.1.1,但不知道它的 MAC。问 ARP 拿到 MAC。
第 3 步:封装帧。 数据链路层把 IP 包封装成以太网帧:
IP 通信中的以太网帧封装:
第 4 步:路由器接收。 路由器收到帧,解封看到目的 IP 8.8.8.8。查自己的路由表,决定下一跳(比如 10.0.0.1)。
第 5 步:重封装。 路由器换 MAC 头(源 MAC 变成自己新接口的 MAC,目的 MAC 变成 10.0.0.1 的 MAC),TTL 减 1,转发。
第 6 步:逐跳转发。 包这样一跳一跳往 Google 服务器走,每跳都换 MAC 头,IP 头不变。最终到达 Google。
关键洞察:IP 头从源到目的全程不变(除了 TTL 减 1 和校验和重算),MAC 头每跳都变。IP 是"端到端"的逻辑地址,MAC 是"点到点"的物理地址。
分片:什么时候发生
假设你的应用要发一个 5000 字节的 UDP 数据包。UDP 头 8 字节,IP 头 20 字节,总共 5028 字节。但中间某段链路的 MTU 只有 1500 字节(标准以太网),包过不去。
路由器把 5000 字节的数据切分:
- 片 1:1480 字节数据 + 20 字节 IP 头 = 1500 字节
- 片 2:1480 字节数据 + 20 字节 IP 头 = 1500 字节
- 片 3:1040 字节数据 + 20 字节 IP 头 = 1060 字节
每片 IP 头的"片偏移"字段不同,标识字段相同,对端靠这两个字段拼回去。
分片的风险:一片丢失,全部重传。5000 字节的数据切 3 片,丢 1 片就要全重传。TCP 通过 MSS 协商避免分片:TCP 握手时双方告知自己的 MSS(一般是 MTU - 40),数据超过 MSS 就在传输层切片。UDP 没有这个机制,只能 IP 层分片。
路径 MTU 发现(PMTUD):发送方发一个"不许分片"标志的 IP 包,如果中间路由器发现包太大,回 ICMP "需要分片" 消息,附带自己的 MTU。发送方收到后调小包大小再发。Linux 缺省开启,Windows 缺省开启。
IPv6 解决了什么问题
IPv6 地址是 128 位,能表示 2^128 个地址。地球上每粒沙子都能分到几个 IP。
但 IPv6 不只是地址变长。它做了一系列改进:
- 简化头部:IPv4 头 13 个字段,IPv6 头 8 个字段。路由器处理更快。
- 禁止路由器分片:源端必须自己分片,避免中间设备的复杂逻辑。
- 无广播,只有组播:广播是带宽杀手,IPv6 完全淘汰。
- 邻居发现协议(NDP)替代 ARP:跨网段工作,效率更高。
- IPsec 强制支持:加密和认证是协议内置,不是可选。
- 即插即用(SLAAC):主机接入网络自动配置 IP,不用 DHCP。
中国 IPv6 部署率 2024 年超过 70%,但很多普通用户不知道自己已经在用 IPv6(运营商默认开启)。访问 test-ipv6.com 可以测试你当前是否走 IPv6。
真实场景:怎么看自己的 IP
Windows:
ipconfigLinux/macOS:
ip addr show
# 或
ifconfig输出会显示:
- 网卡名(eth0、en0、wlan0)
- IP 地址(192.168.1.100/24)
- 物理 MAC 地址
- 默认网关
- DNS 服务器
公网 IP 需要访问 https://api.ipify.org 或 https://ifconfig.me,这些服务会返回你从 NAT 出口看到的公网 IP。
思考题
- 一个公司有 200 台主机,给分配
192.168.10.0/24子网够用吗?给192.168.10.0/25呢?为什么?(提示:可用主机数 = 2^主机位数 - 2,减去网络地址和广播地址) - 你的电脑 IP 是
192.168.1.100/24,网关192.168.1.1。你 ping8.8.8.8和 ping192.168.1.50,ARP 请求的目的 IP 分别是多少?(提示:同子网 vs 跨子网) - 假设路径上某段链路的 MTU 是 1400 字节(PPPoE 拨号常见),你的应用发 5000 字节数据。中间路由器会怎么分片?发几片?最终能重组吗?
- IPv6 地址 128 位,理论上能编址 2^128 个设备。但实际上很多位是固定的(FE80 前缀用于链路本地)。IPv6 实际可用地址够用吗?
延伸阅读
- 《深入浅出计算机网络》(高军)第 4 章
- RFC 791: Internet Protocol
- RFC 8200: Internet Protocol, Version 6
- 动手实验:在 Linux
ip route show看本机路由表 - 动手实验:访问 https://test-ipv6.com 看自己是否支持 IPv6