《TCP/IP协议详解 卷1》--- BOOTP:引导程序协议

无盘系统使用RARP有两个问题:
(1)IP地址是返回的唯一结果;
(2)既然RARP使用链路层广播, RARP请求就不会被路由器转发(迫使每个实际网络设置一个RARP 服务器)。
作为替代,BOOTP使用UDP,且通常需与TFTP协同工作。BOOTP还能返回其他的信息,如路由器的IP地址、客户的子网掩码和名字服务器的IP地址。

BOOTP 的分组格式
《TCP/IP协议详解 卷1》--- BOOTP:引导程序协议_第1张图片
《TCP/IP协议详解 卷1》--- BOOTP:引导程序协议_第2张图片
如果该客户已经知道自身的IP地址,它将写入“客户IP地址”字段。否则,它将该字段设置为0。对于后面这种情况,服务器用该客户的 I P地址写入“你的IP地址”字段。“服务器IP地址”字段则由服务器填写。如果使用了某个代理服务器,则该代理服务器就填写“网关IP地址”字段。

当一个客户使用BOOTP(操作码为1)进行系统引导时,引导请求通常是采用链路层广播,IP首部中的目的IP地址为255.255.255.255(受限的广播)。源IP地址通常是0.0.0.0,因为此时客户还不知道它本身的IP地址。在系统进行自引时,0.0.0.0是一个有效的IP地址。

BOOTP有两个熟知端口:BOOTP服务器为67,BOOTP客户为68。选择两个端口而不是仅选择一个端口为BOOTP服务器用的原因是:服务器的应答可以进行广播(但通常是不用广播的)。如果服务器的应答是通过广播传送的,同时客户又选择未用的临时端口,那么这些广播也能被其他的主机中碰巧使用相同临时端口的应用进程接收到。因此,采用随机端口(即临时端口)对广播来说是一个不好的选择。如果客户也使用服务器的知名端口( 67)作为它的端口,那么网络内的所有服务器会被唤醒来查看每个广播应答。

BOOTP服务器的设计

首先,BOOTP服务器将从它的熟知端口(67)读取UDP数据报。通过将客户的硬件地址放入BOOTP分组中,使得服务器很容易获取客户的硬件地址 。

TFTP服务器如何能将一个响应直接送回BOOTP客户?有两种解决办法:第一种,通常被Unix服务器采用,服务器发一个ioctl(2)请求给内核,为该客户在ARP高速缓存中设置一个条目(arp -s命令)。另一种可选的解决办法是服务器广播这个BOOTP应答而不直接将应答发回该客户,这种解决方案应该只在服务器无法在它的 ARP高速缓存设置一个条目的情况下使用。

BOOTP穿越路由器
如果路由器支持BOOTP协议,那么BOOTP能够由路由器转发(绝大多数路由器厂商的产品都支持这个功能)。

当物理网络内运行一个BOOTP服务器,通常没有必要将BOOTP请求转发到在另外网络中的另一个服务器。

当路由器(也称作“ BOOTP中继代理”)在服务器的熟知端口(67)接收到BOOTP请求时,中继代理将它的IP地址填入收到BOOTP请求中的“网关IP地址字段”,然后将该请求发送到真正的BOOTP服务器,该代理中继还将跳数字段值加1(RFC 951认为如果跳数值到达3就可以丢弃该请求)。真正的BOOTP服务器收到这个请求后,产生BOOTP应答,并将它发回中继代理,而不是请求的客户。中继代理收到应答后将它发给请求的客户。

你可能感兴趣的:(TCP/IP协议详解)