参考:
https://download.csdn.net/download/qq_31567335/10213200
简介:同RARP一样,也是为了让无盘系统能够正常启动的协议。但是由于RARP有以下缺点:1)只能得到ip地址。2)路由器不会转发RARP请求,所以每个物理网络需要一个RARP server。bootp是一个替代协议。
BOOTP 请求和应答均被封装在 UDP数据报中。长度固定为300byte,格式如下:
每个字段的意思书上写得比较清楚,不做重复。
端口:
bootp使用了两个熟知的端口:服务端使用67,客户端使用68。为什么客户端也要使用一个熟知的端口而不使用一个临时的端口呢?
服务器对客户端的回复必须采用广播的方式,因为客户端还不知道自己ip,所以无法通过普通的发送udp数据的方式回复客户端。因为发送之前要进行arp查询,但是由于客户端不知道自己的ip,所以永远不会回复。一个方法是操作内核的arp缓存表,往其中加入一个客户端的记录。但是这种操作一般来说是需要超级用户权限的,如果没有这个权限,那么就只能使用广播的方式了。
如使用广播,又使用临时端口,那么如果刚好这个子网中还有其他人在使用这个端口,那么这个消息也就会被其他人接收到,对其他人造成干扰。
那么为什么不使用服务器使用的67呢?因为如果一个子网中有多个server,那么一个server的回复就会唤醒所有其他的srever,影响其他的server的正常休眠。
BOOTP穿越路由器
bootp的广播请求要穿越路由器,这种情况一般发生在路由器也是无盘系统的情况下,如果路由器有存储盘,那么路由器自己就可以运行一个bootp server程序而不需要进行转发。
因为bootp发送的是广播请求,路由器不能简单的转发这个广播消息。采用的工作方式是类似代理,监听熟知的57端口,对于接收的数据填入自己的网关信息,然后转发到指定路由器,收到指定路由器的回复后再回得请求的主机。
特定厂商信息
格式比较有意思:
开始4个字节必须为99.130.83.99表明后面有提供其他信息,就是一个flag的作用(不知道为什么要设置成这样一个奇怪的数值)
后面的每个item都必须有一个从0递增的tag,而且第0个tag只有tag域而没有其他域,起填充的作用。
其他item的tag后面必须跟一个表示长度的字节
最一个tag的值为255表示结束。之后一直到结束的所有的字节都应填充为255
DHCP是在bootp的基础上发展起来的一个替代bootp的协议。