5TCP/IP详解(卷1:协议)

RARP

逆地址解析协议

RARP请求RARP响应

🎯 AI 时代的学习建议:不要只读理论。理解这一章的设计动机(为什么需要这个概念?)和边界条件(什么情况下会失效?)。当 AI 生成的代码涉及这些概念时,你能判断它是否用对了场景。AI 能帮你总结内容,但无法替代你亲手阅读、思考、建立直觉的过程。

第5章:RARP(Reverse Address Resolution Protocol)

逆地址解析协议

一、导读

1.1 本章学习目标

第5章介绍RARP(逆地址解析协议)——ARP的反向操作。ARP将IP地址转换为MAC地址,而RARP将MAC地址转换为IP地址。RARP主要用于无盘工作站启动时获取自己的IP地址。虽然RARP在现代网络中已被BOOTP和DHCP取代,但理解RARP有助于理解IP地址分配的历史演进和协议设计的思路。

本章的核心学习目标包括:

  • 理解RARP的基本功能和用途:为什么无盘工作站需要RARP
  • 掌握RARP的报文格式:与ARP的异同
  • 理解RARP的工作流程:请求广播、响应单播
  • 认识RARP的局限性:为什么它被BOOTP/DHCP取代
  • 了解RARP的历史地位:从RARP到BOOTP到DHCP的演进路径
  • 理解现代IP地址分配方案:DHCP如何取代了RARP的所有功能

1.2 为什么本章如此重要

虽然RARP已经过时,但它在协议设计史上占有重要地位。RARP是第一个尝试解决"主机如何获取自己的IP地址"这一问题的协议。这个问题的解决经历了RARP→BOOTP→DHCP三个阶段,每个阶段都在前一个阶段的基础上增加了功能。

理解这个演进过程,有助于你理解为什么DHCP是今天的设计——它不是凭空产生的,而是从简单到复杂、从功能不足到功能完善的渐进演化。同时,RARP的局限性也揭示了网络协议设计中的一些基本原则:可扩展性、跨子网能力、配置灵活性。

1.3 核心问题引导

在阅读本章时,请带着以下问题思考:

无盘工作站启动时面临什么问题?为什么它不能像普通主机一样配置IP地址?

RARP和ARP的报文格式几乎相同,它们的核心区别是什么?

RARP为什么只能在单个物理网络工作?如何让它支持跨路由器?

RARP的静态映射表管理有什么困难?为什么动态分配更好?

BOOTP在RARP的基础上增加了哪些功能?DHCP又在BOOTP的基础上增加了什么?

现代网络中还有哪些场景需要"从MAC地址获取IP地址"的功能?


二、核心概念详解

2.1 RARP的背景:无盘工作站

在1980年代和1990年代初期,许多组织使用无盘工作站(diskless workstation)。这些工作站没有硬盘,甚至没有软盘,它们的操作系统和应用程序存储在远程服务器上。

无盘工作站启动时面临一个基本问题:它不知道自己的IP地址。

普通主机的IP地址通常通过手动配置(静态IP)或配置文件(如 /etc/network/interfaces)获得。但无盘工作站没有本地存储,无法保存配置文件。它唯一知道的是自己的MAC地址(烧录在网卡ROM中)。

RARP就是为解决这个问题而设计的:无盘工作站广播自己的MAC地址,请求网络中的RARP服务器告诉它对应的IP地址。

2.2 RARP的报文格式

RARP的报文格式与ARP几乎完全相同,唯一的区别是操作码:

字段ARPRARP
硬件类型1(以太网)1(以太网)
协议类型0x0800(IPv4)0x0800(IPv4)
硬件地址长度66
协议地址长度44
操作码1=请求, 2=响应3=请求, 4=响应
发送方MAC请求方的MAC请求方的MAC
发送方IP请求方的IP0.0.0.0(未知)
目标MAC00:00:00:00:00:00(请求)/ 目标MAC(响应)00:00:00:00:00:00(请求)/ 目标MAC(响应)
目标IP目标IP目标IP(服务器填写)

RARP报文同样封装在以太网帧中,类型字段为 0x8035。

2.3 RARP的工作流程

2.3.1 基本流程

无盘工作站 (MAC: 00:11:22:33:44:55, IP: 未知)
  │
  │  RARP请求(广播):
  │  "我的MAC是00:11:22:33:44:55,请告诉我我的IP地址"
  │  以太网帧:目的MAC = FF:FF:FF:FF:FF:FF
  │ ──────────────────────────────────────────→ 局域网所有主机
  │
  │  RARP服务器 (192.168.1.1) 收到请求:
  │  查找映射表:00:11:22:33:44:55 → 192.168.1.100
  │
  │  RARP响应(单播):
  │  "你的MAC对应的IP地址是192.168.1.100"
  │ ←────────────────────────────────────────── RARP服务器
  │
  │  无盘工作站获得IP地址:192.168.1.100
  │  接下来可以使用TFTP下载引导程序

2.3.2 RARP服务器的配置

RARP服务器维护一个静态映射表,记录MAC地址到IP地址的对应关系。管理员必须手动配置这个表:

# /etc/ethers 文件示例(Solaris系统)
00:11:22:33:44:55  192.168.1.100
00:11:22:33:44:66  192.168.1.101
00:11:22:33:44:77  192.168.1.102

2.4 RARP的局限性

RARP虽然解决了无盘工作站获取IP地址的问题,但存在严重的局限性:

2.4.1 不支持跨路由器

RARP请求是链路层广播帧,路由器不会转发广播帧。因此,每个物理网络都需要一个RARP服务器。在大型网络中,这意味着需要在每个子网都部署一台RARP服务器,管理成本极高。

2.4.2 只能提供IP地址

RARP只能告诉客户端IP地址,不能提供其他重要的网络配置信息:

  • 子网掩码
  • 默认网关
  • DNS服务器地址
  • 引导文件名(用于TFTP下载)

这些信息对于主机的正常启动和运行至关重要,但RARP无法满足。

2.4.3 静态映射管理困难

RARP服务器使用静态映射表,管理员必须为每台无盘工作站手动配置MAC-IP对应关系。当设备数量增加或设备更换时,维护成本很高。

2.5 从RARP到BOOTP到DHCP的演进

2.5.1 BOOTP(Bootstrap Protocol)

BOOTP(RFC 951, 1985年)在RARP的基础上做了重大改进:

特性RARPBOOTP
传输方式链路层广播UDP数据报(可跨路由器)
提供的信息仅IP地址IP地址、网关、引导文件名等
地址映射静态静态(但支持更丰富的选项)
跨路由器不支持支持(通过BOOTP中继代理)

BOOTP使用UDP传输(客户端端口68,服务器端口67),因此可以跨路由器传播。BOOTP还引入了"选项"(options)字段,可以携带子网掩码、网关、DNS等额外信息。

2.5.2 DHCP(Dynamic Host Configuration Protocol)

DHCP(RFC 2131, 1997年)是BOOTP的超集,增加了动态地址分配能力:

特性BOOTPDHCP
地址分配静态(预配置)动态(租约机制)
地址复用不支持支持(租约到期后回收)
地址续约不支持支持(T1/T2定时器)
兼容BOOTP—完全兼容

DHCP的DORA过程(Discover→Offer→Request→Acknowledge)实现了动态地址分配,是现代网络中IP地址管理的标准方案。


三、实战案例

3.1 案例一:查看现代系统的DHCP配置

虽然RARP已经过时,但我们可以查看现代系统如何使用DHCP获取IP地址:

bash
# 查看DHCP租约信息
cat /var/lib/dhcp/dhclient.leases
# lease {
#   interface "eth0";
#   fixed-address 192.168.1.100;
#   option subnet-mask 255.255.255.0;
#   option routers 192.168.1.1;
#   option domain-name-servers 8.8.8.8, 8.8.4.4;
#   renew 2 2026/10/07 12:00:00;
#   rebind 2 2026/10/07 18:00:00;
#   expire 2 2026/10/08 12:00:00;
# }

# 手动释放和获取DHCP地址
sudo dhclient -r eth0   # 释放
sudo dhclient eth0      # 获取

# 查看DHCP配置文件
cat /etc/dhcp/dhclient.conf

3.2 案例二:使用tcpdump观察DHCP过程

bash
# 在DHCP服务器上抓包
sudo tcpdump -i eth0 -nn 'udp port 67 or udp port 68'

输出示例(DORA过程):

# Discover(客户端广播)
12:34:56.789 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request
# Offer(服务器广播)
12:34:56.790 IP 192.168.1.1.67 > 255.255.255.255.68: BOOTP/DHCP, Offer
# Request(客户端广播)
12:34:56.791 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request
# Acknowledge(服务器广播)
12:34:56.792 IP 192.168.1.1.67 > 255.255.255.255.68: BOOTP/DHCP, ACK

3.3 案例三:搭建简单的DHCP服务器(dnsmasq)

bash
# 安装dnsmasq
sudo apt install dnsmasq

# 配置 /etc/dnsmasq.conf
# interface=eth1
# dhcp-range=192.168.2.100,192.168.2.200,12h
# dhcp-option=3,192.168.2.1
# dhcp-option=6,8.8.8.8

# 启动服务
sudo systemctl start dnsmasq

四、常见误区与难点

4.1 误区一:"RARP还在使用"

RARP早已被DHCP完全取代。现代操作系统不再支持RARP客户端。如果你在教材中看到RARP,它主要是为了讲解协议演进的历史脉络。

4.2 误区二:"RARP和ARP使用相同的以太网类型"

RARP使用以太网类型 0x8035,而ARP使用 0x0806。它们虽然报文格式相似,但在链路层的标识不同。

4.3 难点:理解BOOTP中继代理

BOOTP/DHCP可以跨路由器工作,但需要路由器配置为中继代理(relay agent)。中继代理收到客户端的广播BOOTP请求后,将其封装为单播UDP数据报,发送给指定的BOOTP/DHCP服务器。


五、本章小结

第5章介绍了RARP及其历史演进:

RARP是ARP的反向操作,将MAC地址转换为IP地址,主要用于无盘工作站。

RARP的局限性:不支持跨路由器、只能提供IP地址、静态映射管理困难。

BOOTP在RARP基础上增加了跨路由器支持和丰富的配置选项。

DHCP在BOOTP基础上增加了动态地址分配和租约机制,成为现代标准。

理解RARP→BOOTP→DHCP的演进,有助于理解网络协议设计的渐进式改进思路。


六、思考与练习

思考题

如果让你从零设计一个"主机自动获取IP地址"的协议,你会如何设计?与RARP相比,你会增加哪些功能?

DHCP的租约机制解决了什么问题?如果没有租约机制,地址池耗尽后会发生什么?

为什么DHCP的Discover和Offer使用广播,而Request和Ack也使用广播而不是单播?

练习题

查看本机的DHCP租约信息,分析获得的IP地址、网关、DNS等配置。

使用tcpdump捕获一次完整的DHCP DORA过程,分析每个报文的字段。

研究IPv6的无状态地址自动配置(SLAAC),它与RARP/DHCP有什么区别?

5/13RARP
0%