第16章 BOOTP:引导程序协议
16.4 BOOTP服务器的设计
B O O T P客户通常固化在无盘系统只读存储器中,因此了解 BOOTP 服务器的实现将更有意义。
首先,BOOTP 服务器将从它的熟知端口( 6 7)读取U D P数据报。这没有特别的地方。它不同于RARP 服务器 (5 . 4节),它必须读取类型字段为“ R A R P请求”的以太网帧。 B O O T P协议通过将客户的硬件地址放入 B O O T P分组中,使得服务器很容易获取客户的硬件地址 (图1 6 - 2 )。
这里出现了一个有趣的问题: TFTP 服务器如何能将一个响应直接送回 BOOTP 客户?这个响应是一个 U D P数据报,而服务器知道该客户的 I P地址(可能通过读取服务器上的配置文件)。但如果这个客户向那个 I P地址发送一个 U D P数据报(正常情况下会处理 U D P的输出),BOOTP 服务器的主机就可能向那个 I P地址发送一个A R P请求。但这个客户不能响应这个 A R P请求,因为它还不知道它自己的 I P地址!(这就是在R F C 9 5 1中被称作“鸡和蛋”的问题。)有两种解决办法:第一种,通常被 Unix 服务器采用,是服务器发一个 i o c t l ( 2 )请求给内核,为该客户在A R P高速缓存中设置一个条目(这就是命令 a r p - s所做的工作,见 4 . 8节)。服务器能一直这么做直到它知道客户的硬件地址和 I P地址。这意味着当服务器发送 U D P数据报 (即B O O T P应答)时,服务器的A R P将在ARP 高速缓存中找到该客户的I P地址。
另一种可选的解决办法是服务器广播这个 B O O T P应答而不直接将应答发回该客户。既然通常期望网络广播越少越好,因此这种解决方案应该只在服务器无法在它的 ARP 高速缓存设置一个条目的情况下使用。通常只有拥有超级用户权限才能在 A R P高速缓存设置一个条目,如果没有这种权限就只能广播 B O O T P应答。