IP 协议与网络层 — 互联网的”邮政系统”
如果数据链路层是一条条本地公路,网络层就是连接全球的高速公路系统。IP 协议赋予了每台设备一个可以在全球范围内寻址和路由的”门牌号”。
📋 开篇自测:你已经知道多少?
- IPv4 地址由多少位组成?你能手动计算一个 CIDR 地址的网络号和广播地址吗?
- 路由器是怎么决定把一个数据包从哪个接口转发出去的?
- NAT 解决了什么问题?它的基本工作原理是什么?
一、IP 地址:互联网的门牌号
1.1 IPv4 地址结构
IPv4 地址由 32 位二进制数组成,通常用”点分十进制”表示:
二进制:11000000.10101000.00000001.01100100
十进制:192 .168 .1 .100
每段 8 位(1 字节),取值范围 0-255
总共可表示 2^32 = 约 43 亿个地址
1.2 网络号与主机号
一个 IP 地址由两部分组成:网络号标识所在的网络,主机号标识网络中的具体设备。
IP 地址: 192.168.1.100
子网掩码: 255.255.255.0 (/24)
192.168.1 . 100
|---------| |--|
网络号 主机号
网络号 = IP地址 AND 子网掩码
= 192.168.1.100 AND 255.255.255.0
= 192.168.1.0
广播地址 = 网络号中主机位全部置1
= 192.168.1.255
1.3 CIDR 表示法
CIDR(Classless Inter-Domain Routing,无类域间路由)用 /n 表示前 n 位是网络号:
192.168.1.0/24 --> 前24位是网络号,后8位是主机号
可用主机数:2^8 - 2 = 254
10.0.0.0/8 --> 前8位是网络号,后24位是主机号
可用主机数:2^24 - 2 = 16,777,214
172.16.0.0/12 --> 前12位是网络号,后20位是主机号
可用主机数:2^20 - 2 = 1,048,574
为什么要减2?
- 主机号全0: 网络地址(代表整个网络)
- 主机号全1: 广播地址(发给网络内所有主机)
CIDR 计算练习:
题目: 求 172.20.135.91/21 的网络地址、广播地址和可用主机范围
步骤1: /21 意味着前 21 位是网络号
21 = 16 + 5,所以前两个字节不变(172.20)
第三个字节 135 = 10000111(二进制)
前5位是网络号: 10000 = 128
后3位是主机号
步骤2: 网络地址 = 172.20.10000|000.00000000 = 172.20.128.0
步骤3: 广播地址 = 172.20.10000|111.11111111 = 172.20.135.255
步骤4: 第一个可用 = 172.20.128.1
最后一个可用 = 172.20.135.254
步骤5: 可用主机数 = 2^11 - 2 = 2046
1.4 公有地址与私有地址
并非所有 IP 地址都能在互联网上使用。RFC 1918 保留了三段地址作为私有地址,供内部网络自由使用:
私有地址范围:
+-------------+----------------------------+----------------+
| 类别 | 地址范围 | CIDR |
+-------------+----------------------------+----------------+
| A 类私有 | 10.0.0.0 - 10.255.255.255 | 10.0.0.0/8 |
| B 类私有 | 172.16.0.0 - 172.31.255.255| 172.16.0.0/12 |
| C 类私有 | 192.168.0.0-192.168.255.255| 192.168.0.0/16 |
+-------------+----------------------------+----------------+
你家 Wi-Fi 分配的 192.168.x.x 就是 C 类私有地址
公司内网常用的 10.x.x.x 就是 A 类私有地址
私有地址不能直接在互联网上路由,必须通过 NAT(网络地址转换)才能访问公网。
🤔 想一想 IPv4 只有 43 亿个地址,但全球上网设备远不止这个数。为什么现在还没”用完”?(提示:NAT 和私有地址起了什么作用?)
二、IPv6:地址空间的大爆发
2.1 为什么需要 IPv6
IPv4 的 43 亿地址早已分配殆尽——IANA 在 2011 年将最后的地址块分配给各区域注册机构(RIR),各 RIR 也在随后几年陆续耗尽。虽然 NAT 缓解了地址不足的问题,但它带来了诸多限制:端到端连接被破坏、P2P 通信困难、配置复杂等。
IPv6 用 128 位地址,总量为 2^128 ≈ 3.4 × 10^38 个地址——这个数字大到可以给地球上的每一粒沙子分配一个地址。
2.2 IPv6 地址格式
IPv4: 192.168.1.100 (32位,点分十进制)
IPv6: 2001:0db8:85a3:0000:0000:8a2e:0370:7334 (128位,冒分十六进制)
缩写规则:
1. 每组前导零可省略: 0db8 -> db8, 0000 -> 0
2. 连续的全零组可用 :: 替代(只能用一次)
完整: 2001:0db8:0000:0000:0000:0000:0000:0001
缩写: 2001:db8::1
2.3 IPv4 vs IPv6 头部对比
IPv4 头部(20-60 字节,字段多,有选项):
+-------+-----+----------+----------------+
|版本(4)|头长 |服务类型 |总长度 |
+-------+-----+----------+----------------+
|标识 |标志|片偏移 |
+--------------+----+--------------------+
|TTL |协议 |头部校验和 |
+-------+------+------------------------+
|源IP地址 |
+---------------------------------------+
|目的IP地址 |
+---------------------------------------+
|选项(可选,0-40字节) |
+---------------------------------------+
IPv6 头部(固定 40 字节,简洁高效):
+-------+----------+----------+---------+
|版本(6)|流量类别 |流标签 |
+-------+----------+----------+---------+
|载荷长度 |下一头部 |跳数限制 |
+------------------+----------+---------+
| |
| 源地址 (128位) |
| |
+---------------------------------------+
| |
| 目的地址 (128位) |
| |
+---------------------------------------+
IPv6 的改进:移除了头部校验和(由上层负责)、取消了分片字段(由源端负责)、固定头部长度加速路由器处理。
2.4 IPv6 的关键配套协议
IPv6 不再依赖 ARP 和 DHCP,而是引入了两个重要的新机制:
- NDP(邻居发现协议):取代 IPv4 中的 ARP,用于发现同一链路上的邻居节点、解析 IPv6 地址到 MAC 地址、检测地址冲突和路由器。NDP 基于 ICMPv6 实现,使用组播而非广播,效率更高。
- SLAAC(无状态地址自动配置):设备可以根据路由器通告的网络前缀,自行生成完整的 IPv6 地址(通常基于 MAC 地址或随机值),无需 DHCP 服务器参与。这大大简化了 IPv6 网络的部署和管理。
三、IP 数据包的格式与生命周期
3.1 IPv4 头部关键字段
| 字段 | 大小 | 说明 |
|---|---|---|
| 版本 | 4 bit | 4 表示 IPv4 |
| 头部长度 | 4 bit | 单位:4 字节。最小 5(20 字节),最大 15(60 字节) |
| 总长度 | 16 bit | 整个 IP 数据包的大小(头部+数据),最大 65535 字节 |
| TTL | 8 bit | 生存时间,每经过一个路由器减 1,减到 0 则丢弃 |
| 协议 | 8 bit | 上层协议。6=TCP,17=UDP,1=ICMP |
| 源 IP | 32 bit | 发送方 IP 地址 |
| 目的 IP | 32 bit | 接收方 IP 地址 |
3.2 TTL——防止数据包永远漂流
TTL(Time To Live)是 IP 数据包的”寿命计数器”。每经过一个路由器,TTL 减 1。当 TTL 降为 0 时,路由器丢弃该数据包并向发送方返回一条 ICMP “Time Exceeded” 消息。
TTL 的旅程:
发送方(TTL=64) --> 路由器A(TTL=63) --> 路由器B(TTL=62) --> ... --> 目的地
如果路由环路存在:
路由器X(TTL=3) --> 路由器Y(TTL=2) --> 路由器X(TTL=1) --> 路由器Y(TTL=0) --> 丢弃!
traceroute(Linux/macOS)或 tracert(Windows)命令就是利用 TTL 逐步递增来探测路由路径的:
$ traceroute www.example.com
1 gateway (192.168.1.1) 1.234 ms
2 10.10.0.1 5.678 ms
3 203.0.113.1 12.345 ms
4 93.184.216.34 25.678 ms # 到达目的地
四、路由原理:数据包的”导航系统”
4.1 路由表
路由器根据路由表来决定数据包的转发方向。路由表记录了”到某个网络应该走哪个接口/下一跳”:
路由表示例:
+------------------+-------------+-----------+--------+
| 目的网络 | 子网掩码 | 下一跳 | 接口 |
+------------------+-------------+-----------+--------+
| 192.168.1.0 | /24 | 直连 | eth0 |
| 10.0.0.0 | /8 | 10.0.0.1 | eth1 |
| 172.16.0.0 | /16 | 10.0.0.2 | eth1 |
| 0.0.0.0 | /0 | 203.0.113.1| eth2 | <-- 默认路由
+------------------+-------------+-----------+--------+
查找规则:最长前缀匹配(Longest Prefix Match)
- 多条路由都匹配时,选择子网掩码最长(最精确)的那条
4.2 路由转发过程
PC-A (192.168.1.10) 要访问 Server (10.20.30.40)
eth0 eth1 eth0
PC-A -----> [Router-1] -----> [Router-2] -----> Server
192.168.1.10 | | 10.20.30.40
步骤1: PC-A 查看路由表,发现目标不在本网段,发给默认网关 Router-1
帧: [MAC-R1 | MAC-A | IP包(src=192.168.1.10, dst=10.20.30.40)]
步骤2: Router-1 拆掉帧头,查看 IP 目的地址 10.20.30.40
查路由表: 10.0.0.0/8 --> 下一跳 Router-2
构造新帧: [MAC-R2 | MAC-R1 | IP包(src=192.168.1.10, dst=10.20.30.40)]
注意: IP地址不变! MAC地址变了!
步骤3: Router-2 拆帧头,查看 IP 目的地址
查路由表: 10.20.30.0/24 --> 直连 eth0
ARP 查找 10.20.30.40 的 MAC 地址
构造新帧: [MAC-Server | MAC-R2 | IP包(src=192.168.1.10, dst=10.20.30.40)]
核心要点:IP 地址在整个传输过程中保持不变(标记源和目的),而 MAC 地址在每一跳都会改变(标记当前跳的两端)。
4.3 静态路由与动态路由
静态路由:管理员手动配置,适用于小型网络。
动态路由:路由器之间通过路由协议自动交换路由信息,适用于大型网络。常见的动态路由协议:
路由协议分类:
内部网关协议(IGP)—— 同一自治系统内部使用
├── RIP (Routing Information Protocol)
│ - 距离矢量算法,以跳数为度量
│ - 最大跳数 15,适用于小型网络
│
└── OSPF (Open Shortest Path First)
- 链路状态算法,以带宽为度量
- 支持大型网络,收敛速度快
外部网关协议(EGP)—— 不同自治系统之间使用
└── BGP (Border Gateway Protocol)
- 路径矢量算法
- 互联网的"核心路由协议"
- 全球互联网由 BGP 连接各大运营商的自治系统
🤔 想一想 为什么互联网需要区分 IGP 和 EGP?如果全世界只用一种路由协议会有什么问题?
五、子网划分实战
5.1 为什么要划分子网
一个公司拿到了 172.16.0.0/16 这个网段,有 65534 个可用地址。但不可能把 6 万多台设备放在同一个广播域里——广播风暴会让网络瘫痪。
解决方案:把大网段切分成多个小网段(子网),分配给不同的部门。
5.2 子网划分方法
原始网段: 172.16.0.0/16 (65534 个主机)
需求: 划分成 4 个子网
方法: 从主机位借 2 位给网络位 (2^2 = 4)
172.16.0.0/16 --> 172.16.0.0/18 (4个子网)
子网1: 172.16.0.0/18 (172.16.0.1 - 172.16.63.254) = 16382台
子网2: 172.16.64.0/18 (172.16.64.1 - 172.16.127.254) = 16382台
子网3: 172.16.128.0/18 (172.16.128.1 - 172.16.191.254) = 16382台
子网4: 172.16.192.0/18 (172.16.192.1 - 172.16.255.254) = 16382台
验证: 4 x 16382 = 65528 (加上 4 个网络地址和 4 个广播地址 = 65536 = 2^16)
5.3 变长子网掩码(VLSM)
实际场景中,不同子网需要的地址数量差异很大。比如研发部需要 200 个地址,而管理层只需要 10 个。这时可以使用 VLSM(Variable Length Subnet Mask)进行非等分划分。
六、NAT:私有地址访问公网的桥梁
6.1 NAT 的基本原理
NAT(Network Address Translation)将私有 IP 地址转换为公有 IP 地址,让内网设备能访问互联网:
内网设备 NAT 路由器 互联网
192.168.1.10:5000 --> 203.0.113.5:40001 --> Web 服务器
192.168.1.20:6000 --> 203.0.113.5:40002 --> Web 服务器
192.168.1.30:7000 --> 203.0.113.5:40003 --> Web 服务器
NAT 转换表:
+-------------------+--------------------+
| 内网地址:端口 | 公网地址:端口 |
+-------------------+--------------------+
| 192.168.1.10:5000 | 203.0.113.5:40001 |
| 192.168.1.20:6000 | 203.0.113.5:40002 |
| 192.168.1.30:7000 | 203.0.113.5:40003 |
+-------------------+--------------------+
响应数据回来时,NAT 路由器根据转换表把公网端口映射回内网地址
6.2 NAT 的类型
| 类型 | 说明 | 适用场景 |
|---|---|---|
| 静态 NAT | 一对一映射,一个私有 IP 固定映射一个公有 IP | 服务器对外提供服务 |
| 动态 NAT | 多对多映射,从公有 IP 池中动态分配 | 中型企业出口 |
| NAPT/PAT | 多对一映射,多个私有 IP 共享一个公有 IP(靠端口区分) | 家庭路由器、大多数场景 |
6.3 NAT 的局限性
- 破坏端到端连接:外部设备无法主动连接内网设备
- 增加延迟:地址转换需要处理时间
- 应用兼容性:某些协议(如 FTP、SIP)在 IP 载荷中携带地址信息,NAT 需要做深度包检测才能正确转换
七、ICMP:网络的”体检报告”
7.1 ICMP 的作用
ICMP(Internet Control Message Protocol)用于报告网络错误和提供诊断信息。我们最常用的 ping 和 traceroute 命令就是基于 ICMP 实现的。
ICMP 常见消息类型:
+------+------------------+----------------------------------+
| 类型 | 名称 | 说明 |
+------+------------------+----------------------------------+
| 0 | Echo Reply | Ping 回复 |
| 3 | Dest Unreachable | 目的不可达(网络/主机/端口不可达) |
| 8 | Echo Request | Ping 请求 |
| 11 | Time Exceeded | TTL 到期(traceroute 的基础) |
+------+------------------+----------------------------------+
7.2 ping 的工作原理
PC-A PC-B
| ICMP Echo Request (type=8) |
| -----------------------------------> |
| ICMP Echo Reply (type=0) |
| <----------------------------------- |
| |
Round-trip time: 25ms
$ ping www.example.com
PING www.example.com (93.184.216.34): 56 data bytes
64 bytes from 93.184.216.34: icmp_seq=0 ttl=56 time=25.3 ms
64 bytes from 93.184.216.34: icmp_seq=1 ttl=56 time=24.8 ms
八、章节小结
- IPv4 地址由 32 位组成,分为网络号和主机号,CIDR 表示法是现代 IP 编址的标准。
- IPv6 使用 128 位地址,从根本上解决地址耗尽问题,头部设计更加简洁高效。
- 路由是网络层的核心功能,路由器通过路由表和最长前缀匹配来转发数据包。
- 子网划分通过从主机位借位来创建更小的网络,满足网络分段管理的需求。
- NAT 通过地址转换让私有网络访问公网,是当前 IPv4 网络的重要支撑技术。
- ICMP 提供网络诊断和错误报告功能,
ping和traceroute是基于它的常用工具。
📝 结尾自测:检验你的收获
- 给定地址 10.30.200.50/20,请计算出网络地址、广播地址和可用主机范围。
- 为什么 IP 地址在路由转发过程中始终不变,而 MAC 地址在每一跳都会改变?
- 解释最长前缀匹配:路由表中有 10.0.0.0/8 和 10.30.0.0/16 两条路由,目的地 10.30.5.1 会匹配哪条?为什么?
- 你家里的路由器使用的是哪种 NAT 类型?为什么一个公网 IP 可以让多台设备同时上网?
- IPv6 相比 IPv4 有哪些主要改进?除了地址空间更大,还有什么优势?
下一章预告:IP 层只负责”尽力而为”地投递数据包,数据可能丢失、乱序、重复。下一章我们将深入 TCP 协议,看看它如何在这样不可靠的基础上构建出可靠的传输——三次握手、四次挥手、滑动窗口、拥塞控制,每一个机制都是精妙的工程艺术。
购买课程解锁全部内容
网络通信第一课:10 章掌握计算机网络
¥29.90