tcp/ip学习笔记--第16章 Bootstrap Protocol 引导程序协议

参考:

https://download.****.net/download/qq_31567335/10213200

简介:

同RARP一样,也是为了让无盘系统能够正常启动的协议。但是由于RARP有以下缺点:1)只能得到ip地址。2)路由器不会转发RARP请求,所以每个物理网络需要一个RARP server。bootp是一个替代协议。

BOOTP 请求和应答均被封装在 UDP数据报中。长度固定为300byte,格式如下:
tcp/ip学习笔记--第16章 Bootstrap Protocol 引导程序协议

每个字段的意思书上写得比较清楚,不做重复。


端口:

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的协议。