DHCP消息的格式如下:
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | op (1) | htype (1) | hlen (1) | hops (1) | +---------------+---------------+---------------+---------------+ | xid (4) | +-------------------------------+-------------------------------+ | secs (2) | flags (2) | +-------------------------------+-------------------------------+ | ciaddr (4) | +---------------------------------------------------------------+ | yiaddr (4) | +---------------------------------------------------------------+ | siaddr (4) | +---------------------------------------------------------------+ | giaddr (4) | +---------------------------------------------------------------+ | | | chaddr (16) | | | | | +---------------------------------------------------------------+ | | | sname (64) | +---------------------------------------------------------------+ | | | file (128) | +---------------------------------------------------------------+ | | | options (variable) | +---------------------------------------------------------------+
op 1字节,消息类型。1 = BOOTREQUEST,2=BOOTREPLY。dhcp的类型在option里面
htype 硬件地址类型
hlen 硬件地址长度
hops client设置成0,relay agents可以使用。
xid 随机数,transcation id
secs client设置,开始请求到renew的秒数
ciaddr client ip address
yiaddr your(client)ip address
siaddr ip address of next server to use in bootstrap
giaddr relay agent ip address
chaddr client hardware address
sname optional server host name
file boot file name
options的前4个字节为magic cookie,它们为99, 130, 83, 99;和RFC 1497定义的magic cookie相同。options剩余的field由tagged parameters列表组成,被称作选项。RC1497规定的vendor extensions全是DHCP选项,RFC1533给出DHCP使用的所有选项。
0和255是固定长度option,只有一个字节,0表示pad option,255表示end option,其他option的格式
1个字节的code + 1个字节的len + len个字节的data
9.6. DHCP Message Type This option is used to convey the type of the DHCP message. The code for this option is 53, and its length is 1. Legal values for this option are: Value Message Type ----- ------------ 1 DHCPDISCOVER 2 DHCPOFFER 3 DHCPREQUEST 4 DHCPDECLINE 5 DHCPACK 6 DHCPNAK 7 DHCPRELEASE 8 DHCPINFORM Code Len Type +-----+-----+-----+ | 53 | 1 | 1-9 |
server identifier
这个表示是dhcp server的地址
Code Len Address +-----+-----+-----+-----+-----+-----+ | 54 | 4 | a1 | a2 | a3 | a4 | +-----+-----+-----+-----+-----+-----+
routers
表示子网内的路由器的地址(网关)
Code Len Address 1 Address 2 +-----+-----+-----+-----+-----+-----+-----+-----+-- | 3 | n | a1 | a2 | a3 | a4 | a1 | a2 | ... +-----+-----+-----+-----+-----+-----+-----+-----+--
subnet mask
Code Len Subnet Mask +-----+-----+-----+-----+-----+-----+ | 1 | 4 | m1 | m2 | m3 | m4 | +-----+-----+-----+-----+-----+-----+
domain name server
Code Len Address 1 Address 2 +-----+-----+-----+-----+-----+-----+-----+-----+-- | 6 | n | a1 | a2 | a3 | a4 | a1 | a2 | ... +-----+-----+-----+-----+-----+-----+-----+-----+--
V-I Vendor Class option
用来定义厂商
1 1 1 1 1 1 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | option-code | option-len | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | enterprise-number1 | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data-len1 | | +-+-+-+-+-+-+-+-+ | / vendor-class-data1 / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---- | enterprise-number2 | ^ | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | data-len2 | | optional +-+-+-+-+-+-+-+-+ | | / vendor-class-data2 / | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ~ ... ~ V +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ----
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | option-code | option-len | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | enterprise-number1 | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | data-len1 | | +-+-+-+-+-+-+-+-+ option-data1 | / / +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---- | enterprise-number2 | ^ | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | data-len2 | | optional +-+-+-+-+-+-+-+-+ option-data2 | | / / | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | ~ ... ~ V +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ---- option-code OPTION_V-I_VENDOR_OPTS (125) option-len total length of all following option data in octets enterprise-numberN The vendor's registered 32-bit Enterprise Number as registered with IANA [3] data-lenN Length of option-data field option-dataN Vendor-specific options, described below
每个DHCP消息都必须有一个特定的选项 - DHCP message type
客户端服务器交互 - 分配一个网络地址
客户端广播一个DHCPDISCOVER消息到本地子网,客户端可以包含建议的网络地址和过期时间值。
每个服务器响应一个DHCPOFFER消息,yiaddr包含一个可用的网络地址
客户端可能收到多个DHCPOFFER消息,客户端可以选择等待多个响应。客户端选择一个服务器,广播一个DHCPREQUEST消息,server identifier选项必须为选择的服务器的标识。也可以包含其他想要的配置选项,但是requested IP address必须为DHCPOFFER中的yiaddr提供的值。DHCPREQUEST中的secs域必须使用DHCPDISCOVER中相同的值。当客户端超时没有收到DHCPOFFER,客户端重传DHCPDISCOVER消息。
服务器接收DHCPREQUEST广播消息,这些没被选中的server,接收到该消息后,被告知客户端婉拒了该服务器的OFFER。被选中的服务器收到消息后,响应一个DHCPACK消息,该消息包含分配给客户端的配置参数。client identifier和chaddr的组合标识了一个客户端。如果选中的客户端不能满足DHCPREQUEST,它将返回一个DHCPNAK消息。
客户端收到DHCPACK消息后,执行一些检查操作,完成网络配置。如果客户端收到DHCPNAK消息,客户端重启配置过程。客户端重传DHCPREQUEST,如果超时没有收到DHCPACK或DHCPNAK。
客户端可以选择放弃租约,通过发送一个DHCPRELEASE消息。
客户端服务器交互 - 重用之前分配的网络地址
如果客户端记住并且希望重用之前分配的网络地址,客户端可以选择去掉一些步骤:
客户端广播DHCPREQUEST消息,并将网络地址包含在requested IP address选项中。
服务端返回DHCPACK消息,如果客户端的请求是非法的,服务端返回一个DHCPNAK消息。如果服务器不能保证信息是正确的,则服务器不要返回DHCPNAK消息。
后续消息类似。
续约
时间单位为秒,0xffffffff表示无限时间。
从外部获取网络地址
如果客户端通过其它方式获得网络地址,如手动配置,可以通过DHCPINFORM请求消息来获得其它配置参数。
Client parameters in DHCP
客户端可以通知服务端它感兴趣的配置参数,通过parameter request list选项。此外,客户端也可以建议网络地址和租约期限。
When clients should use DHCP
当网络参数变化时,应当使用DHCP获取或验证IP地址,如重启,断线。
相关标准
RFC 951 BOOTSTRAP PROTOCOL (BOOTP)
RFC 1542 Clarifications and Extensions for the Bootstrap Protocol
RFC 2131 Dynamic Host Configuration Protocol
https://datatracker.ietf.org/doc/html/rfc2131
https://datatracker.ietf.org/doc/html/rfc2132
https://www.rfc-editor.org/rfc/rfc3925.html