摘要

  • BOOTP 让无盘客户端在尚未具备正常 IP 连通性时,询问自己的 IP 地址、服务器和引导文件名;之后通常由 TFTP 单独传送文件。
  • 响应本身又带来一道难题:没有 IP 地址的客户端无法回应 ARP。RFC 951 提出由服务器临时建立 ARP 缓存项,或把响应广播出去;后来的中继规则则让请求可以跨越子网。

无盘工作站通电时,还没有操作系统替它配置网络。固化在机器里的启动程序可以发出请求,但它得先知道要用哪个地址、加载哪个文件,之后才有办法索取文件。顺序看起来像个圈:机器还没有可用的网络身份,怎样先从网络收到回答?

1985 年 9 月,Bill Croft 和 John Gilmore 在 RFC 951 中写下了这个问题。BOOTP 不负责传送文件,而是处理第一阶段:确定地址并选择引导文件。客户端的 PROM 可以询问 IP 地址、服务器和文件名;收到回复后,第二阶段再通过通常为 TFTP 的协议,把文件读入内存。设计目标还包括无人值守开机。RFC 记录的是一种协议设计,并非实际使用规模的统计。(RFC 951,第 2、7.5 节。)

客户端并不需要先知道自己尚未拥有的 IP 地址。若服务器地址也未知,它可以用源地址 0.0.0.0,把 IP/UDP 请求发往 255.255.255.255,也就是本地电缆上的广播地址。请求还带有客户端的硬件类型、硬件地址和事务编号。服务器可以在自己的记录中查找这个硬件地址对应的 IP 地址,把结果写进回复的 yiaddr 字段,再选定完整的引导文件路径。比如,客户端只请求通用名称 unix,服务器也能根据这台机器的记录,给它匹配专用文件。启动过程因此依赖服务器上的本地映射表。(RFC 951,第 2、3、7.1、7.3 和 9 节。)

首个响应也有“先有鸡还是先有蛋”的问题。服务器通常要靠 ARP 找到 IP 目的地址对应的链路层地址;但客户端还不知道自己的 IP,自然无法回应服务器的 ARP 查询。RFC 951 给出两种办法。若发送方的内核或驱动支持,可以根据客户端的硬件地址和拟分配的 IP 地址,临时造一条 ARP 缓存记录,并设定过期时间。RFC 特别指出 UNIX 4.2 BSD 已有这种能力。若没有相应支持,服务器可以在客户端所在接口广播响应。绕过难题的方式取决于响应发送端的本地系统能力。(RFC 951,第 4 节。)

两个 UDP 端口同样服务于这条返回路径。客户端把请求发往 BOOTP 服务器端口 67,服务器把响应发往客户端端口 68。RFC 951 解释说,分开使用端口后,内核可以过滤发给客户端端口的广播,不必叫醒其他机器上的 BOOTP 服务器进程。倘若客户端随机选择源端口,广播还可能撞上别的主机正在监听的应用。这个端口安排不是无关紧要的格式细节;它避免一台机器的开机答复变成整个网段的应用事件。(RFC 951,第 3 节。)

引导服务器不一定和客户端接在同一段电缆上。RFC 951 把跨网关启动列为可选功能,而且要求网关和服务器配合。网关或其他转发代理可以收到广播,在 giaddr 中填写客户端所在网络的信息,再把请求交给服务器。RFC 作者提醒,不要把请求无限制地全网广播,否则可能形成转发环路。1993 年 10 月的 RFC 1542 进一步划清边界:BOOTP 中继不是透明转发 IP 数据报的普通路由器。中继可以把 BOOTP 请求当作发给自己的消息来接收,再生成一条新的 BOOTP 消息;它可以运行在路由器上,也可以是连接客户端子网的另一台主机。这是一项需要配置并遵循专门规则的服务。(RFC 951,第 8 节;RFC 1542,第 4 至 4.1 节。)

因此,把 BOOTP 简单称作“旧版 DHCP”会抹掉重要差异。RFC 2131 后来把 DHCP 描述为 BOOTP 机制的扩展,并沿用其消息格式和中继行为,以便兼容既有客户端。DHCP 新增的一项关键能力,是把地址分配为有限租约:客户端不再需要地址时,地址可重新分配。BOOTP 的 1985 年模型则在服务器记录中查找客户端地址和引导文件。DHCP 也可以手工分配地址;区别不是后来所有地址都变成临时的,而是协议加入了动态分配方式。(RFC 2131,第 1 至 2 节。)

BOOTP 的历史贡献不大,却很实际。它没有让无盘机器脱离其他设备独立运行,没有验证用户身份,也不负责搬运操作系统镜像。它说明,一台只有硬件地址、尚无可用 IP 身份的机器,怎样向网络询问启动所需的下一步;服务器怎样选择这些参数;以及 ARP 尚不能照常工作时,响应怎样回到客户端。在这个故事里,联网从本地广播、服务器上的一条明确记录,以及一条需要特殊处理的响应开始。

来源与证据边界

RFC 951 是一份征求讨论的协议提案,记录了预期行为,不是普及率调查。它提到 4.2 BSD 可以临时建立 ARP 缓存项,并不意味着所有实现都有该能力。RFC 1542 记录的是后来对中继行为的细化,也不能证明所有网络都遵守了这些要求。BOOTP 负责选出网络参数和文件名,文件传送由另一阶段完成。DHCP 引入了动态租约,但也保留手工分配。