BOOTP 引导协议( 四 )


假如使用了"vend",推荐在"vend"中第一个项目为一个4字节的"魔术字(magicnumber)" 。
这让服务器确定在这个字段中它看到什么类型的信息 。
数值可以由通常的"魔术字"过程分配,你挑一个,它就成为魔术字 。
引导应答使用一个与引导请求不同的魔术字以答应客户端按照应答信息进行非凡的动
作 。
[UDP校验和]
6.2客户端重传策略
在一长段时间内没有收到应答,客户端应该重传请求 。
时间间隔必须仔细选择不要引起网络风暴 。
可以考虑一个包含100台机器的网络在电源故障后发生的情况 。
简单的每四秒重传请求将沉没网络 。
一个可能的策略,你可能考虑指数级的补偿,象以太网在碰撞时那样 。
例如第一个包在0:00,第二个在:04,接着:08,接着:16,:32,:64 。
你应该随机化每个时间;这就象以太网规格那样以一个掩码"与"一个随机数进入第一次补
偿 。
在每次后续的补偿中,掩码增长一个比特 。
这样在每次补偿中平均延迟加倍 。
在"平均"补偿到达60秒后,就不再增长了,但仍然随机化 。
在每次重传前,客户端应该修改"secs"字段 。[UDP校验和]
6.3服务器接收BOOTREQUEST(引导请求)
[UDP校验和]假如UDP目的端口不匹配"BOOTP服务器"端口,丢弃这个包 。
假如服务器名字字段(sname)是空(没有指定特定的服务器),或者sname是指定的并且
匹配我们的名字或别名,
继续包的处理 。
假如sname字段是指定的,但不匹配"我们",那么有多种选择:
1.你可以选择简单丢弃这个包 。
2.假如查询sname的名称显示它在一个网络中,丢弃这个包 。
3.假如sname在不同的网络中,你可以选择转发这个包到那个地址 。
假如这样,检查"giaddr"(网关地址)字段 。假如"giaddr"是0,填入我的地址或可以用来
到达那个网络的网关的地址 。
然后转发这个包 。
假如客户端IP地址(ciaddr)是0,那么客户端不知道自己的IP地址 。
尝试在我们的数据库中查找客户端的硬件地址(chaddr,hlen,htype) 。
假如没有匹配,丢弃这个包 。否则我们现在对这个客户端有一个IP地址;填入"yiaddr"(你
的IP地址)字段 。
我们现在检查引导文件名字段(文件) 。假如客户端不关注文件名或想要默认引导文件,
这个字段是空 。
假如这个字段非空,可以将它和客户端的IP地址做为数据库的查询要害字 。
假如有默认的文件或通用文件(可能由客户端地址做为索引)或一个匹配的指定的路径
名称,
然后在"file"字段中填入选择的引导文件的指定的路径名称 。
假如字段是非空并且没有匹配,那么客户端要一个我们没有的文件,丢弃这个包,也许
其它BOOTP服务器有这个文件 。
卖主指定的数据字段"vend"现在应该检查了 。假如提供一种可识别类型的数据,
应该进行客户端指定的动作,并且回应要填入应答包中的"vend"数据字段 。
例如,一个工作站客户端可能提供一个验证字,并从服务器接收一个访问远端文件的权
限,
或一套配置选项传给马上就要引导入的操作系统 。
我的(服务器)IP地址填入"siaddr"字段 。设置"op"字段为BOOTREPLY(引导应答) 。
UDP目的端口设置成"BOOTP客户端" 。假如客户端地址"ciaddr"非0,把包发送到那里;
否则假如网关地址"giaddr"非0,设置UDP目的端口为"BOOTP服务器"并把包发送到
"giaddr" 。
否则客户端在我们的一个网络中但它还不知道自己的IP地址,使用在上面"蛋"章节中描述