DHCP协议

本文介绍了DHCP协议的基本原理及其前身BOOTP的区别。DHCP作为BOOTP的增强版本,解决了IP地址分配的动态性和效率问题。文章详细阐述了DHCP的工作流程,包括客户端如何通过广播方式请求IP地址,服务器如何响应及最终的地址分配过程。

传输层UDP,服务器端口67, 客户端口68

 

DHCP 是 Dynamic Host Configuration Protocol(动态主机分配协议)缩写,它的前身是 BOOTP。BOOTP 原本是用于无磁盘主机连接的网络上面的:网络主机使用 BOOT ROM 而不是磁盘起动并连接上网络,BOOTP 则可以自动地为那些主机设定 TCP/IP 环境。但 BOOTP 有一个缺点:您在设定前须事先获得客户端的硬件地址,而且,与 IP 的对应是静态的。换而言之,BOOTP 非常缺乏 "动态性" ,若在有限的 IP 资源环境中,BOOTP 的一对一对应会造成非常可观的浪费。 DHCP 可以说是 BOOTP 的增强版本,它分为两个部份:一个是服务器端,而另一个是客户端。所有的 IP 网络设定数据都由 DHCP 服务器集中管理,并负责处理客户端的 DHCP 要求;而客户端则会使用从服务器分配下来的IP环境数据。

 

基本流程

 

客户端发送->DHCP DISCOVER
DHCP客户机初始化TCP/IP,通过UDP端口67向网络中发送一个DHCPDISCOVER广播包,请求租用IP地址。该 广播包中的源IP地址为0.0.0.0,目标IP地址为255.255.255.255;包中还包含客户机的MAC地址和计算机名目的MAC地址为FFFFFFFFFFFF

服务器发送->DHCP OFFER (可以单波,也可以是广播)
任何接收到DHCPDISCOVER广播包并且能够提供IP地址的DHCP服务器,都会通过UDP端口68给客户机回应一个DHCPOFFER广播包,提供一个IP地址。该广播包的源IP地址为DCHP服务器IP,目标IP地址为255.255.255.255;包中还包含提供的IP地址、子网掩码及租期等信息客户端发送->DHCP request
客户端收到网络上多台 DHCP 服务器的响应,只会挑选其中一个 DHCP offer 而已(通常是最先抵达的那个),并且会向网络发送一个DHCP request广播封包,告诉所有 DHCP 服务器它将指定接受哪一台服务器提供的 IP 地址

服务器发送->DHCPACK
服务器发送广播DHCPACK确认客户机的请求,表示分配成功

 

详细文档可以参考网页

http://www.cnpaf.net/Class/DHCP/200408/129.html

关于DHCP服务器的offer与ack阶段是单播还是广播的研究

 

 

服务器发送->DHCP OFFER (可以单波,也可以是广播)
可以广播包,也可以单波包,因为第一步服务器肯定知道了客户端MAC,知道MAC就可以只发个单波就可以(交换机MAC-端口表,这样就可以单波传送特定端口了)

 

 

### DHCP协议详解 #### 协议概述 DHCP(Dynamic Host Configuration Protocol),即动态主机配置协议,用于简化网络设备的IP地址管理。该协议允许服务器自动向网络上的客户端提供并分配TCP/IP配置参数,包括但不限于IP地址、子网掩码以及默认网关等信息[^1]。 #### IP地址分配模式 支持多种类型的IP地址分配机制,其中最为常见的两种分别是静态分配与动态分配。前者指定了特定MAC地址对应的固定IP;后者则是从预设池子里随机选取可用地址给予请求者,在租约到期前有效。这种灵活性使得DHCP可以适应不同的应用场景需求[^2]。 #### 工作机制 对于复杂多变的大规模企业级网络环境而言,单一子网内的通信不足以满足实际需要。因此引入了DHCP中继代理的概念——一种特殊的路由器或交换机端口角色,用来帮助跨过传统广播域限制,让远距离之外甚至不同物理位置下的计算机也能顺利接收到必要的初始化设定数据流[^3]。 #### 配置要求 值得注意的是,作为Windows Server操作系统的一部分,为了启用这项服务,系统管理员需按照官方指南完成相应的软件安装流程,并根据具体业务情况调整各项设置选项以确保最佳性能表现[^4]。 #### 发现阶段详情 当一台新加入局域网的新机器启动时会发出一个名为`DHCP Discover`的数据包,其目的就是寻找周围存在的任何一台能为自己提供所需资源的信息源。这个过程中使用的特殊IPv4寻址方案表明发送方目前还没有被赋予正式的身份标识符[^5]。 ```python import socket def dhcp_discover(): sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) message = b'\x01' + ... # 构造DHCP DISCOVER报文 sock.sendto(message, ('255.255.255.255', 67)) dhcp_discover() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值