BOOTP
来自站长百科
BOOTP自举协议是一个基于IP/UDP协议的协议,它可以让无盘站从一个中心服务器上获得IP地址,为局域网中的无盘工作站分配动态IP地址并不需要每个用户去设置静态IP地址,使用BOOTP协议的时候,一般包括Bootstrap Protocol Server自举协议服务端和Bootstrap Protocol Client(自举协议客户端)两部分。该协议主要用于有无盘工作站的局域网中,运行BOOTP协议的服务器接收到这个请求,会根据请求中提供的MAC地址找到客户端,并发送一个含有IP地址、服务器IP地址、网关等信息的FOUND帧。最后客户端会根据该FOUND帧来通过专用TFTP服务器下载启动镜像文件,模拟成磁盘启动。
BOOTP协议要点[ ]
- 使用了一个单独的包交换,使用超时机制直到收到应答,双向使用相同的包字段结构。使用最大固定长度的字段来简化结构定义和分析。
- 一个'opcode'字段包含两个值。客户端广播一个'引导请求(bootrequest)'包,服务器应答一个'引导应答(bootreply)'包。'bootrequest'包含客户端的硬件地址,如果知道还包含它的IP地址。
- 请求可以包含客户端指定的响应服务器的名称,这样客户端可以强制从一个指定的主机引导,如果一个相同的引导文件存在多种版本或服务器在一个远距离的网络/域,客户端不必处理名称/域服务,这个功能推到了BOOTP服务器。
- 请求可以包含'通用(generic)'引导文件名,例如'unix'或'ethertip'。但服务器发送 引导应答时,它使用对应的引导文件的确切的路径名称来取代这个字段,服务器查询客户端的地址和请求文件名相关的数据库,以使用客户端自定义的特定引导文件确定这个文件名称。
- 客户端不知道它们的IP地址的情况下,服务器必须有一个硬件地址和IP地址对应的数据库,这个客户端IP地址被放在引导应答的(对应)字段中。
- 某些网络拓朴(如斯坦福的网络)可能在一个物理网上没有一个直接可以访问的TFTP服务器BOOTP允许客户端通过使用相邻的网关从几跳外的服务器上引导,这部分协议不需求客户端部分做特定的动作,实现是可选的,网关和服务器需要一些额外的代码。
BOOTP包格式[ ]
- UDP头包含源和目的端口号。BOOTP协议使用两个保留的端口号,'BOOTP客户端'(68)和'BOOTP服务器'(67),客户使用'BOOTP服务器'作为目的端口发送请求;这通常是广播,服务器使用'BOOTP客户端'做为目的端口发送应答;取决于服务器的核心或驱动设备,这可能是也可能不是广播
- 使用两个保留的端口的原因是当引导应答必须广播到客户端避免'叫醒'并且调度BOOTP服务器进程。因为服务器和其它主机都不会侦听'BOOTP客户端'端口,所有进入的广播报文将在核心级别过滤掉,我们不能简单地允许客户端找一个随机端口号做为UDP源端口字段,因为服务器应答可能是广播,
- UDP长度字段设置成UDP长度加BOOTP部分的包,UDP校验和可以由客户端(或服务器)按照需要设置成0,以避免PROM实现中额外的费用。
BOOTP客户端重传策略[ ]
- 在一长段时间内没有收到应答,客户端应该重传请求,时间间隔必须仔细选择不要引起网络风暴,可以考虑一个包含100台机器的网络在电源故障后发生的情况。 简单的每四秒重传请求将淹没网络。一个可能的策略,你可能考虑指数级的补偿,象以太网在碰撞时那样,例如第一个包在0:00,第二个在:04,接着:08,接着:16,:32,:64。 你应该随机化每个时间;这就象以太网规格那样以一个掩码'与'一个随机数进入第一次补偿。
- 在每次后续的补偿中,掩码增长一个比特,这样在每次补偿中平均延迟加倍,在'平均'补偿到达60秒后,就不再增长了,但仍然随机化,在每次重传前,客户端应该修改'secs'字段。数值可以由通常的'魔术字'过程分配,你挑一个它就成为魔术字,引导应答使用一个与引导请求不同的魔术字以允许客户端按照应答信息进行特殊的动作。
服务器接收BOOTREQUEST[ ]
- 如果UDP目的端口不匹配'BOOTP服务器'端口丢弃这个包,如果服务器名字字段(sname)是空(没有指定特定的服务器),或者sname是指定的并且匹配我们的名字或别名,继续包的处理,如果sname字段是指定的,但不匹配'我们'那么有多种选择:
- 你可以选择简单丢弃这个包。
- 如果查询sname的名称显示它在一个网络中,丢弃这个包。
- 如果sname在不同的网络中你可以选择转发这个包到那个地址。
- 如果这样检查'giaddr'(网关地址)字段,如果'giaddr'是0,填入我的地址或可以用来到达那个网络的网关的地址,然后转发这个包,如果客户端IP地址(ciaddr)是0那么客户端不知道自己的IP地址。尝试在我们的数据库中查找客户端的硬件地址(chaddr,hlen,htype),如果没有匹配,丢弃这个包。否则我们现在对这个客户端有一个IP地址;填入'yiaddr'(你的IP地址)字段,我们现在检查引导文件名字段,如果客户端不关注文件名或想要默认引导文件这个字段是空。
- 如果字段是非空并且没有匹配,那么客户端要一个我们没有的文件丢弃这个包,也许其它BOOTP服务器有这个文件,卖主指定的数据字段'vend'现在应该检查了。如果提供一种可识别类型的数据,应该进行客户端指定的动作,并且回应要填入应答包中的'vend'数据字段,UDP目的端口设置成'BOOTP客户端',如果客户端地址'ciaddr'非0,把包发送到那里;否则如果网关地址'giaddr'非0,设置UDP目的端口为'BOOTP服务器'并把包发送到'giaddr',否则客户端在我们的一个网络中但它还不知道自己的IP地址。