DHCP Option 常见取值及含义

本文详细介绍了DHCP协议中各种选项的作用及编号,包括子网掩码、网关地址、DNS服务器地址等关键网络配置参数,有助于理解DHCP如何进行网络自动化配置。

Options号

Options作用

1

设置子网掩码选项。

3

设置网关地址选项。

6

设置DNS服务器地址选项。

12

设置域名选项。

15

设置域名后缀选项。

33

设置静态路由选项。该选项中包含一组有分类静态路由(即目的地址的掩码固定为自然掩码,不能划分子网),客户端收到该选项后,将在路由表中添加这些静态路由。如果存在Option121,则忽略该选项。

44

设置NetBios服务器选项。

46

设置NetBios节点类型选项。

50

设置请求IP选项。

51

设置IP地址租约时间选项。

52

设置Option附加选项。

53

设置DHCP消息类型。

54

设置服务器标识。

55

设置请求参数列表选项。客户端利用该选项指明需要从服务器获取哪些网络配置参数。该选项内容为客户端请求的参数对应的选项值。

58

设置续约T1时间,一般是租期时间的50%。

59

设置续约T2时间。一般是租期时间的87.5%。

60

设置厂商分类信息选项,用于标识DHCP客户端的类型和配置。

61

设置客户端标识选项。

66

设置TFTP服务器名选项,用来指定为客户端分配的TFTP服务器的域名。

67

设置启动文件名选项,用来指定为客户端分配的启动文件名。

77

设置用户类型标识。

121

设置无分类路由选项。该选项中包含一组无分类静态路由(即目的地址的掩码为任意值,可以通过掩码来划分子网),客户端收到该选项后,将在路由表中添加这些静态路由。

148

EasyDeploy中Commander的IP地址。

149

SFTP和FTPS服务器的IP地址。

150

设置TFTP服务器地址选项,指定为客户端分配的TFTP服务器的地址。


DHCP(Dynamic Host Configuration Protocol)是一种基于UDP的协议,用于在局域网中动态分配IP地址和相关的网络配置信息。通过DHCP,客户端可以自动获取IP地址、子网掩码、默认网关、DNS服务器等信息,从而简化了网络配置管理,提高了IP地址的利用率。 ### DHCP的工作原理 DHCP的工作流程主要分为以下几个步骤: 1. **发现阶段 (DHCP DISCOVER)** 当客户端首次接入网络时,它并不知道DHCP服务器的IP地址。因此,客户端会发送一个**DHCP DISCOVER**广播报文,以寻找网络中的DHCP服务器。该报文的源IP地址为`0.0.0.0`,目的IP地址为`255.255.255.255`,并且包含了客户端的MAC地址(在`flags`字段中)[^4]。 2. **提供阶段 (DHCP OFFER)** DHCP服务器收到**DHCP DISCOVER**后,会向客户端发送一个**DHCP OFFER**报文,提供一个可用的IP地址和其他网络配置信息(如子网掩码、网关、DNS等)。由于此时客户端还没有IP地址,因此**DHCP OFFER**通常也是以广播形式发送的[^2]。 3. **请求阶段 (DHCP REQUEST)** 客户端收到一个或多个**DHCP OFFER**后,会选择其中一个服务器,并发送**DHCP REQUEST**报文以确认接受该配置。这个报文仍然以广播形式发送,以通知所有DHCP服务器哪个服务器被选中。未被选中的服务器会收回它们的IP地址分配[^2]。 4. **确认阶段 (DHCP ACK)** 被选中的DHCP服务器收到**DHCP REQUEST**后,会发送**DHCP ACK**报文,正式确认IP地址和其他配置信息的分配。此时,客户端就可以使用分配的IP地址进行通信了[^2]。 此外,DHCP还支持**续租**、**释放**和**信息请求**等操作: - **DHCP REQUEST**也可以用于客户端重启后重新确认之前的IP地址。 - **DHCP RELEASE**用于客户端主动释放IP地址[^5]。 - **DHCP INFORM**用于客户端在获取IP地址后请求更详细的配置信息(如网关、DNS等)[^2]。 ### DHCP报文格式 DHCP报文是基于UDP协议的,客户端使用端口68,服务器使用端口67。DHCP报文的格式如下: | 字段名 | 长度(字节) | 描述 | |----------------|--------------|----------------------------------------------------------------------| | op | 1 | 操作类型:1表示请求,2表示响应 | | htype | 1 | 硬件地址类型:如以太网(值为1) | | hlen | 1 | 硬件地址长度:如以太网MAC地址长度为6 | | hops | 1 | 跳数:通常为0,若通过中继代理则递增 | | xid | 4 | 事务ID:由客户端生成的随机数,用于匹配请求与响应 | | secs | 2 | 客户端获取IP地址所经过的时间(秒) | | flags | 2 | 标志位:用于指示是否以广播方式发送 | | ciaddr | 4 | 客户端IP地址:若客户端已有IP地址,则在此字段填入 | | yiaddr | 4 | 服务器分配的IP地址 | | siaddr | 4 | 下一跳服务器的IP地址 | | giaddr | 4 | 网关IP地址:若客户端和服务器不在同一子网,此字段填入中继代理的地址 | | chaddr | 16 | 客户端硬件地址(MAC地址) | | sname | 64 | 服务器主机名(可选) | | file | 128 | 启动文件名(可选) | | options | 可变长度 | 可选参数字段,包含DHCP报文类型、IP地址租期、网关、DNS等信息 | DHCP报文类型通过`options`字段中的**Type=53**来表示,其`Value`取值从01到08分别表示不同的报文类型[^2]。 ### DHCP的功能流程 DHCP服务器的主要功能包括: - 接收并处理DHCP客户端的**DHCP Discover**和**DHCP Request**报文。 - 向客户端提供IP地址、子网掩码、网关、DNS服务器等网络配置参数。 - 对IP地址资源进行管理,确保同一IP地址只分配给一个客户端。 - 对客户端的租期进行管理,定期更新租期。 - 执行客户端的认证和授权操作[^3]。 ### 示例代码:DHCP客户端模拟 以下是一个简单的Python示例,模拟DHCP客户端发送**DHCP DISCOVER**报文的过程: ```python import socket import struct # 构造DHCP DISCOVER报文 def build_dhcp_discover(mac_address): # op: 1 for request op = 1 htype = 1 # Ethernet hlen = 6 # MAC address length hops = 0 xid = b'\x12\x34\x56\x78' # Transaction ID secs = 0 flags = 0x8000 # Broadcast flag ciaddr = b'\x00' * 4 # Client IP address yiaddr = b'\x00' * 4 # Your IP address siaddr = b'\x00' * 4 # Server IP address giaddr = b'\x00' * 4 # Gateway IP address chaddr = mac_address + b'\x00' * 10 # Client hardware address sname = b'\x00' * 64 # Server name file = b'\x00' * 128 # Boot file name magic_cookie = b'\x63\x82\x53\x63' # DHCP magic cookie options = b'\x35\x01\x01' + b'\xff' # Option 53: DHCP DISCOVER, end option # Pack the DHCP header dhcp_header = struct.pack('!4B 2H 4I 4I 4I 4I 16s 64s 128s 4s', op, htype, hlen, hops, struct.unpack('!H', xid[:2])[0], struct.unpack('!H', xid[2:])[0], secs, flags, struct.unpack('!I', ciaddr)[0], struct.unpack('!I', yiaddr)[0], struct.unpack('!I', siaddr)[0], struct.unpack('!I', giaddr)[0], chaddr, sname, file, magic_cookie) return dhcp_header + options # 发送DHCP DISCOVER def send_dhcp_discover(): # MAC地址(示例) mac_address = b'\x00\x11\x22\x33\x44\x55' dhcp_packet = build_dhcp_discover(mac_address) # 创建原始套接字 sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.sendto(dhcp_packet, ('255.255.255.255', 67)) if __name__ == '__main__': send_dhcp_discover() ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值