TCP/IP-16-BOOST

第16章BOOTP:引导程序协议
16.1 引言
一个无盘系统,它在不知道自身IP地址的情况下,在进行系统引导时能够通过RARP来获取它的IP地址。
然而使用RARP有两个问题:
(1)IP地址是返回的唯一结果;
( 2)既然RARP使用链路层广播, RARP请求就不会被路由器转发(迫使每个实际网络设置一个RARP 服务器)。
本章将介绍一种用于无盘系统进行系统引导的替代方法,又称为引导程序协议,或BOOTP。
BOOTP使用UDP,且通常需与TFTP(参见第1 5章)协同工作。
RFC 951 [Croft and Gilmore 1985]是BOOTP的正式规范,RFC 1542 [Wimer 1993]则对它作了说明。

16.2 BOOTP 的分组格式
BOOTP 请求和应答均被封装在UDP数据报中,如图1 6 - 1所示。
图16-1 BOOTP 请求和应答封装在一个UDP数据报内
图16-2显示了长度为3 0 0字节的BOOTP请求和应答的格式。
“操作码”字段为1表示请求,为2表示应答。
硬件类型字段为1表示10 Mb/s的以太网,这和A R P请求或应答中同名字段表示的含义相同。
类似地,对于以太网,硬件地址长度字段为6字节。
“跳数”字段由客户设置为0,但也能被一个代理服务器设置(参见1 6.5节)。
“事务标识”字段是一个由客户设置并由服务器返回的32 bit整数。
客户用它对请求和应答进行匹配。对每个请求,客户应该将该字段设置为一个随机数。
客户开始进行引导时,将“秒数”字段设置为一个时间值。
服务器能够看到这个时间值,备用服务器在等待时间超过这个时间值后才会响应客户的请求,这意味着主服务器没有启动。
如果该客户已经知道自身的IP地址,它将写入“客户IP地址”字段。
否则,它将该字段设置为0。对于后面这种情况,服务器用该客户的IP地址写入“你的IP地址”字段。“服务器
IP地址”字段则由服务器填写。
如果使用了某个代理服务器(见1 6.5节),则该代理服务器就填写“网关IP地址”字段。
客户必须设置它的“客户硬件地址”字段。尽管这个值与以太网数据帧头中的值相同,
UDP数据报中也设置这个字段,但任何接收这个数据报的用户进程能很容易地获得它一个BOOTP 服务器)。
一个进程通过查看UDP数据报来确定以太网帧首部中的该字段通常是很困难的(或者说是不可能的)。
“服务器主机名”字段是一个空值终止串,由服务器填写。
服务器还将在“引导文件名字段”填入包括用于系统引导的文件名及其所在位置的路径全名。
“特定厂商区域”字段用于对BOOTP进行不同的扩展。1 6.6节将介绍这些扩展中的一些。
当一个客户使用BOOTP(操作码为1)进行系统引导时,引导请求通常是采用链路层广播,
IP首部中的目的IP地址为2 5 5.2 5 5.2 5 5.2 5 5(受限的广播, 1 2.2节)。
源IP地址通常是0.0.0.0,因为此时客户还不知道它本身的IP地址。
回顾图3 - 9,在系统进行自引导时, 0.0.0.0是一个有效的IP地址。

端口号BOOTP有两个熟知端口:BOOTP 服务器为6 7,BOOTP 客户为6 8。
这意味着BOOTP 客户不会选择未用的临时端口,而只用端口6 8。
选择两个端口而不是仅选择一个端口为BOOTP服务器用的原因是:服务器的应答可以进行广播(但通常是不用广播的)。
如果服务器的应答是通过广播传送的,同时客户又选择未用的临时端口
那么这些广播IP首部UDP首部BOOTP请求/应答20字节8字节300字节也能被其他的主机中碰巧使用相同临时端口的应用进程接收到。
因此,采用随机端口(即临时端口)对广播来说是一个不好的选择。
如果客户也使用服务器的知名端口( 6 7)作为它的端口,
那么网络内的所有服务器会被唤醒来查看每个广播应答(如果所有的服务器都被唤醒,它们将检查操作码,
如果是一个应答而不是请求,就不作处理)。
因此可以让所有的客户使用与服务器知名端口不同的同一知名端口。
如果多个客户同时进行系统引导,并且服务器广播所有应答,这样每个客户都会收到其他客户的应答。
客户可以通过BOOTP首部中的事务标识字段来确认应答是否与请求匹配,或者可以通过检查返回的客户硬件地址加以区分。

16.3 一个例子
让我们看一个用BOOTP引导一个X终端的例子。
图1 6 - 3显示了t c p d u m p的输出结果(例中客户名为p r o t e u s,服务器名为m e r c u r y。
这个t c p d u m p的输出是在不同的网络上获得的,这个应用程序是其他例子中一直使用的)。
数据速率大约为140 000 bps。
这比大多数以F T P文件传送形式访问一个以太网要慢,但对于一个简单的停止等待协议如TFTP来说已经很好了。
X终端系统引导后,还需使用TFTP传送终端的字体文件、某些D N S名字服务器查询,然后进行X协议的初始化。
图1 6 - 3中的所有步骤大概需要1 5秒钟,其余的步骤需要6秒钟,这样无盘X终端系统引导的总时间是2 1秒。

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

16.5 BOOTP穿越路由器
我们在5.4节中提到RARP的一个缺点就是它使用链路层广播,这种广播通常不会由路由器转发。
这就需要在每个物理网络内设置一个RARP 服务器。如果路由器支持BOOTP协议,
那么BOOTP能够由路由器转发(绝大多数路由器厂商的产品都支持这个功能)。
这个功能主要用于无盘路由器,因为如果在磁盘的多用户系统被用作路由器,它就能够自己运行BOOTP 服务器。
此外,常用的Unix BOOTP服务器(附录F)支持这种中继模式(relay mode)。
但如果在这个物理网络内运行一个BOOTP 服务器,通常没有必要将BOOTP请求转发到在另外网络中的另一个服务器。
研究一下当路由器在服务器的熟知端口( 6 7)接收到BOOTP请求时将会发生什么。
当收到一个BOOTP请求时,中继代理将它的IP地址填入收到BOOTP请求中的“网关IP地址字段”,
然后将该请求发送到真正的BOOTP服务器(由中继代理填入网关字段的地址是收到的BOOTP请求接口的IP地址)。
该代理中继还将跳数字段值加1(这是为防止请求被无限地在网络内转发。
RFC 951认为如果跳数值到达3就可以丢弃该请求)。
既然发出的请求是一个单播的数据报(与发起的客户的请求是广播的相反),
它能按照一定的路由通过其他的路由器到达真正的BOOTP服务器。
真正的BOOTP服务器收到这个请求后,产生BOOTP应答,并将它发回中继代理,而不是请求的客户。
既然请求网关字段不为零,真正的BOOTP服务器知道这个请求是经过转发的。
中继代理收到应答后将它发给请求的客户。

16.6 特定厂商信息
在图1 6 - 2中我们看到了6 4字节的“特定厂商区域”。
RFC 1533 [Alexander and Droms1993] 定义了这个区域的格式。
这个区域含有服务器返回客户的可选信息。
如果有信息要提供,这个区域的前4个字节被设置为IP地址9 9.1 3 0.8 3.9 9。
这可称作魔术甜饼(magic cookie),表示该区域内包含信息。

16.7 小结
BOOTP使用UDP,它为引导无盘系统获得它的IP地址提供了除RARP外的另外一种选择。
BOOTP还能返回其他的信息,如路由器的IP地址、客户的子网掩码和名字服务器的IP地址。
既然BOOTP用于系统引导过程,一个无盘系统需要下列协议才能在只读存储器中完成:
BOOTP、TFTP、UDP、IP和一个局域网的驱动程序。
BOOTP服务器比RARP服务器更易于实现,因为BOOTP请求和应答是在UDP数据报中,而不是特殊的数据链路层帧。
一个路由器还能作为真正BOOTP服务器的代理,向位于不同网络的真正BOOTP服务器转发客户的BOOTP请求。

习题
16.1 我们说BOOTP优于RARP的一个方面是BOOTP能穿越路由器,而RARP由于使用链路层广播则不能。
在1 6.5节为使BOOTP穿越路由器,我们必须定义特殊的方式。如果在路由器中增加允许转发RARP请求的功能会发生什么?
16.2 我们说过,当有多个客户程序同时向一个服务器发出引导请求时,因为服务器要广播多个BOOTP应答,
BOOTP 客户就必须使用事务标识来使响应与请求相匹配。但在图1 6 - 3中,事务标识为0,表示这个客户不考虑事务标识。
你认为这个客户将如何将这些响应与其请求匹配。

你可能感兴趣的:(unix,网络,服务器,扩展,终端,路由器)