跳到主要内容
预计阅读 27 分钟

IP 协议与网络层 — 互联网的”邮政系统”

如果数据链路层是一条条本地公路,网络层就是连接全球的高速公路系统。IP 协议赋予了每台设备一个可以在全球范围内寻址和路由的”门牌号”。

📋 开篇自测:你已经知道多少?

  1. IPv4 地址由多少位组成?你能手动计算一个 CIDR 地址的网络号和广播地址吗?
  2. 路由器是怎么决定把一个数据包从哪个接口转发出去的?
  3. 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 bit4 表示 IPv4
头部长度4 bit单位:4 字节。最小 5(20 字节),最大 15(60 字节)
总长度16 bit整个 IP 数据包的大小(头部+数据),最大 65535 字节
TTL8 bit生存时间,每经过一个路由器减 1,减到 0 则丢弃
协议8 bit上层协议。6=TCP,17=UDP,1=ICMP
源 IP32 bit发送方 IP 地址
目的 IP32 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)用于报告网络错误和提供诊断信息。我们最常用的 pingtraceroute 命令就是基于 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

八、章节小结

  1. IPv4 地址由 32 位组成,分为网络号和主机号,CIDR 表示法是现代 IP 编址的标准。
  2. IPv6 使用 128 位地址,从根本上解决地址耗尽问题,头部设计更加简洁高效。
  3. 路由是网络层的核心功能,路由器通过路由表和最长前缀匹配来转发数据包。
  4. 子网划分通过从主机位借位来创建更小的网络,满足网络分段管理的需求。
  5. NAT 通过地址转换让私有网络访问公网,是当前 IPv4 网络的重要支撑技术。
  6. ICMP 提供网络诊断和错误报告功能,pingtraceroute 是基于它的常用工具。

📝 结尾自测:检验你的收获

  1. 给定地址 10.30.200.50/20,请计算出网络地址、广播地址和可用主机范围。
  2. 为什么 IP 地址在路由转发过程中始终不变,而 MAC 地址在每一跳都会改变?
  3. 解释最长前缀匹配:路由表中有 10.0.0.0/8 和 10.30.0.0/16 两条路由,目的地 10.30.5.1 会匹配哪条?为什么?
  4. 你家里的路由器使用的是哪种 NAT 类型?为什么一个公网 IP 可以让多台设备同时上网?
  5. IPv6 相比 IPv4 有哪些主要改进?除了地址空间更大,还有什么优势?

下一章预告:IP 层只负责”尽力而为”地投递数据包,数据可能丢失、乱序、重复。下一章我们将深入 TCP 协议,看看它如何在这样不可靠的基础上构建出可靠的传输——三次握手、四次挥手、滑动窗口、拥塞控制,每一个机制都是精妙的工程艺术。

购买课程解锁全部内容

网络通信第一课:10 章掌握计算机网络

¥29.90