Python的网络编程[4] -> DHCP 协议[0] -> DHCP 的基本理论
DHCP协议 / DHCP Protocol
目录
DHCP (Dynamic Host Configuration Protocol, 动态主机配置协议) 是一种局域网的网络协议,使用UDP协议进行工作,主要有两个用途,在RFC 2131中有详细的描述,
1. 给内部网络或网络服务供应商自动分配IP地址;
2. 给用户或者内部网络管理员作为对所有计算机作中央管理的手段。
DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口,546号端口用于DHCPv6 Client,而不用于DHCPv4,是为DHCP failover服务,这是需要特别开启的服务,DHCP failover是用来做“双机热备”的。
DHCP主要遵循RFC2131协议,可以做到对BOOTP的兼容。
DHCP的基本通信流程类似于BOOTP,根据RFC2131的描述,其主要工作方式如下图所示,
1. 首先Client端会发出一个DHCP的DISCOVER广播请求,给所有正在进行监听的服务器;
2. 收到请求的服务器会对请求报文进行分析,确定这是一个有效的DISCOVER请求,随后返回一个OFFER报文通知客户端可以提供IP地址;
3. 客户端有可能会收到多个OFFER报文,通常会对第一个收到的报文进行应答,发出REQUEST请求;
4. 当服务器收到广播的REQUEST请求后,会对收到的请求进行验证,看是否是自己发出的OFFER被选中,若是则发送ACK建立连接。
5. 直到客户端使用结束后 (使用期间还包括租期等设置信息),会向服务器发送RELEASE报文,从而释放使用的IP。
DHCP的数据报文格式与BOOTP的报文格式基本相同,最大的区别在于236位之后的options信息段。DHCP的options信息段中包含了许多重要的信息。关于前236位的信息可以参考 BOOTP 协议。
Option id |
Length(字节) |
描述 |
1 |
4 |
Subnet Mask |
3 |
n*4 |
Router(网关) |
6 |
n*4 |
DNS Server |
7 |
n*4 |
Log Server |
26 |
2 |
Interface MTU |
33 |
n*8 |
Static route |
35 |
4 |
ARP cache timeout |
42 |
n*4 |
NTP servers |
51 |
4 |
IP address lease time |
53 |
1 |
Message type 1-DHCPDISCOVER 2-DHCPOFFER 3-DHCPREQUEST 4-DHCPDECLINE 5-DHCPACK 6-DHCPNAK 7-DHCPRELEASE 8-DHCPINFORM |
54 |
4 |
DHCP Server Identifier |
更多的Option取值可以参考链接
Note:
此处有一个值得注意的地方,即DHCP用来与BOOTP进行区别的魔术字字段,这个魔术字一般在Options的开头位置,通常为4个字节,取值固定为十进制的99、130、83、99(即十六进制的0x63、0x82、0x53、0x63),这四个字段既是为了区别DHCP与BOOTP也是为了兼容DHCP和BOOTP。
在DHCP中主要有8种类型的报文,分别为DHCP Discover、DHCP Offer、DHCP Request、DHCP ACK、DHCP NAK、DHCP Release、DHCP Decline、DHCP Inform。各报文类型功能如下,
DHCP报文类型 |
描述 |
DHCP Discover |
DHCP客户端请求地址时,并不知道DHCP服务器的位置,因此DHCP客户端会在本地网络内以广播方式发送请求报文,这个报文成为Discover报文,目的是发现网络中的DHCP服务器,所有收到Discover报文的DHCP服务器都会发送回应报文,DHCP客户端据此可以知道网络中存在的DHCP服务器的位置。 |
DHCP Offer |
DHCP服务器收到Discover报文后,就会在所配置的地址池中查找一个合适的IP地址,加上相应的租约期限和其他配置信息(如网关、DNS服务器等),构造一个Offer报文,发送给用户,告知用户本服务器可以为其提供IP地址。< 只是告诉client可以提供,是预分配,还需要client通过ARP检测该IP是否重复> |
DHCP Request |
DHCP客户端可能会收到很多Offer,所以必须在这些回应中选择一个。Client通常选择第一个回应Offer报文的服务器作为自己的目标服务器,并回应一个广播Request报文,通告选择的服务器。DHCP客户端成功获取IP地址后,在地址使用租期过去1/2时,会向DHCP服务器发送单播Request报文续延租期,如果没有收到DHCP ACK报文,在租期过去3/4时,发送广播Request报文续延租期。 |
DHCP ACK |
DHCP服务器收到Request报文后,根据Request报文中携带的用户MAC来查找有没有相应的租约记录,如果有则发送ACK报文作为回应,通知用户可以使用分配的IP地址。 |
DHCP NAK |
如果DHCP服务器收到Request报文后,没有发现有相应的租约记录或者由于某些原因无法正常分配IP地址,则发送NAK报文作为回应,通知用户无法分配合适的IP地址。 |
DHCP Release |
当用户不再需要使用分配IP地址时,就会主动向DHCP服务器发送Release报文,告知服务器用户不再需要分配IP地址,DHCP服务器会释放被绑定的租约。 |
DHCP Decline |
DHCP客户端收到DHCP服务器回应的ACK报文后,通过地址冲突检测发现服务器分配的地址冲突或者由于其他原因导致不能使用,则发送Decline报文,通知服务器所分配的IP地址不可用。 |
DHCP Inform |
DHCP客户端如果需要从DHCP服务器端获取更为详细的配置信息,则发送Inform报文向服务器进行请求,服务器收到该报文后,将根据租约进行查找,找到相应的配置信息后,发送ACK报文回应DHCP客户端。<极少用到> |
相关阅读
1. BOOTP 协议
参考链接
http://blog.csdn.net/one_in_one/article/details/51684551
http://blog.csdn.net/nosodeep/article/details/45971677