DHCP
服务
IP
地址自动分配原理
DHCP
在提供服务时,
DHCP
客户端是以
UDP 68
号端口进行数据传输的,而
DHCP
服务器是以
UDP 67
号端口进行数据传输的。
DHCP
服务不仅体现在为
DHCP
客户端提供
IP
地址自动分配过程中,还体现在后面的
IP
地址续约和释放过程中。本节仅介绍
DHCP
客户端初次分配
IP
地址的过程。
在整个
DHCP
服务器为
DHCP
客户端初次提供
IP
地址自动分配过程中,一共经过了以下四个阶段,利用了表
11-10
中的前四个报文:发现阶段(
DHCP
客户端在网络中广播发送
DHCP DISCOVER
请求报文,发现
DHCP
服务器,请求
IP
地址租约)、提供阶段(
DHCP
服务器通过
DHCP OFFER
报文向
DHCP
客户端提供
IP
地址预分配)、选择阶段(
DHCP
客户端通过
DHCP REQUEST
报文确认选择第一个
DHCP
服务器为它提供
IP
地址自动分配服务)和确认阶段(被选择的
DHCP
服务器通过
DHCP ACK
报文把在
DHCP OFFER
报文中准备的
IP
地址租约给对应
DHCP
客户端)。
在
DHCP
客户端在获得了一个
IP
地址以后,就可以发送一个免费
ARP
请求探测网络中是否还有其它主机使用
IP
地址,来避免由于
DHCP
服务器地址池重叠而引发的
IP
冲突。以上四个阶段如图
11-19
所示,相当于
DHCP
客户端与
DHCP
服务器的四次握手过程。具体描述如下:
图
11-19 DHCP
客户端从
DHCP
服务器获取
IP
地址的四个阶段
(
1
)发现阶段:即
DHCP
客户端获取网络中
DHCP
服务器信息的阶段。在客户端配置了
DHCP
客户端程序(如在
Windows
系统中进行了如图
11-16
所示的配置)并启动后,
以广播方式
发送
DHCP DISCOVER
报文寻找网络中的
DHCP
服务器。示例如下。
此广播报文采用传输层的
UDP 68
号端口发送(封装的目的端口为
UDP 68
号端口),经过网络层
IP
协议封装后,源
IP
地址为
0.0.0.0
(因为此时还没有分配
IP
地址),目的
IP
地址为
255.255.255.255
(有限广播
IP
地址)。如下是一个
DHCP DISCOVER
报文封装的
IP
报头示例,可以看到
Destination Address
(目的地址)是
255.255.255.255
,而
Source Address
(源地址)是
0.0.0.0
。
IP:ID = 0x0; Proto = UDP;Len: 328
IP:Version = 4 (0x4)
IP:Header Length = 20 (0x14)
IP:Service Type = 0 (0x0)
IP:Precedence = Routine
IP:…0…. = Normal Delay
IP:….0… = NormalThroughput
IP:…..0.. = NormalReliability
IP:Total Length = 328(0x148)
IP:Identification = 0 (0x0)
IP:Flags Summary = 0 (0x0)
IP:…….0 = Last fragmentin datagram
IP:……0. = May fragmentdatagram ifnecessary
IP:Fragment Offset = 0 (0x0)bytes
IP:Time to Live = 128 (0x80)
IP:Protocol = UDP – User Datagram
!—
使用
UDP
传输层协议
IP:Checksum = 0x39A6
IP:Source Address = 0.0.0.0
!—
源
IP
地址为
0.0.0.0
IP:Destination Address = 255.255.255.255
!—-
目的
IP
地址为
255.255.255.255
IP:Data:Number of data bytesremaining =308 (0x0134)
【经验之谈】在以上
DHCP DISCOVER
报文中
IP
报头中的目的地址(
Destination Address
)是
255.255.255.255
这个有限广播地址。这个有限广播地址就是代表任意一个
IPv4
子网的广播地址,当然是发送报文的主机所在的子网和
DHCP
服务器所在子网的广播地址,但因为此时
DHCP
客户端并不知道
DHCP
服务器所在的是哪个子网。下面所有其它
DHCP
报文中的
255.255.255.255
地址的含义也是一样的。
至于
IP
报头中的源地址(
Source Address
),由于当前
DHCP
客户端主机并未分配具体的
IP
地址,所以只能用具有任意代表功能的
0.0.0.0
地址来表示了。下面所有其它
DHCP
报文中指定的
0.0.0.0
地址的含义也是一样的。
因为此时,
DHCP
客户端没有分配到
IP
地址,也不知道
DHCP
服务器或
DHCP
中继的
IP
地址,所以在
DHCP DISCOVER
报文中
Ciaddr
(客户端
IP
地址)、
Yiaddr
(被分配的
DHCP
客户端
IP
地址)、
Siaddr
(下一个为
DHCP
客户端分配
IP
地址的
DHCP
服务器地址)、
Giaddr
(
DHCP
中继
IP
地址)这四个字段均为
0.0.0.0
,如下所示。另外,从中可以看到,在
CHADDR
字段和
DHCP
选项中
ClientIdentifier
字段中都标识了
DHCP
客户端网卡
MAC
地址。
DHCP:Discover (xid=21274A1D)
DHCP:OpCode (op) = 1 (0x1)
DHCP:HardwareType (htype) = 1 (0x1) 10Mb Ethernet
DHCP:Hardware Address Length(hlen) = 6(0x6)
DHCP:Hops (hops) = 0 (0x0)
DHCP:Transaction ID (xid) = 556223005 (0x21274A1D)
DHCP:Seconds (secs) = 0 (0x0)
DHCP:Flags (flags) = 1 (0x1)
!—
标志位置
1
,代表以广播方式发送
DHCP:1…………… = Broadcast
DHCP:Client IP Address (ciaddr) =0.0.0.0
DHCP:Your IP Address(yiaddr) =0.0.0.0
DHCP:Server IP Address (siaddr) =0.0.0.0
DHCP:Relay IP Address (giaddr)=0.0.0.0
DHCP:Client Ethernet Address (chaddr) =08002B2ED85E
DHCP:Server Host Name (sname) = <Blank>
DHCP:Boot File Name (file) = <Blank>
DHCP:Magic Cookie = [OK]
DHCP:OptionField (options)
DHCP:DHCP MessageType = DHCP Discover !—DHCP
报文类型为
DHCP Discover
DHCP:Client-identifier =(Type:1) 08 00 2b 2e d8 5e
DHCP:HostName = JUMBO-WS !—DHCP
服务器主机名
DHCP:Parameter Request List= (Length:7)01 0f 03 2c 2e 2f 06
DHCP:End of this optionfield
(
2
)提供阶段:即
DHCP
服务器向
DHCP
客户端提供预分配
IP
地址的阶段。网络中的所有
DHCP
服务器接收到客户端的
DHCP DISCOVER
报文后,都会根据自己地址池中
IP
地址分配的优先次序选出一个
IP
地址,然后与其它参数一起通过传输层的
UDP 67
号端口,在
DHCP OFFER
报文中
以广播方式
发送给客户端(目的端口是
DHCP
客户端的
UDP 68
号端口)。客户端通过封装在帧中的目的
MAC
地址(也就在
DHCP DISCOVER
报文中的
CHADDR
字段值)的比对来确定是否接收该帧。但这样一来,理论上
DHCP
客户端可能会收到多个
DHCP OFFER
报文(当网络中存在多个
DHCP
服务器时),但
DHCP
客户端只接受第一个到来的
DHCP OFFER
报文。
DHCP OFFER
报文经过
IP
协议封装后的源
IP
地址
DHCP
服务器自己的
IP
地址,目的地址仍是
255.255.255.255
广播地址,使用的协议仍为
UDP
。下面是一个
DHCP OFFER
报文的
IP
报头示例。
IP:ID = 0x3C30; Proto = UDP;Len: 328
IP:Version = 4 (0x4)
IP:Header Length = 20 (0x14)
IP:Service Type = 0 (0x0)
IP:Precedence = Routine
IP:…0…. = Normal Delay
IP:….0… = NormalThroughput
IP:…..0.. = NormalReliability
IP:Total Length = 328(0x148)
IP:Identification = 15408(0x3C30)
IP:Flags Summary = 0 (0x0)
IP:…….0 = Last fragmentin datagram
IP:……0. = May fragmentdatagram ifnecessary
IP:Fragment Offset = 0 (0x0)bytes
IP:Time to Live = 128 (0x80)
IP:Protocol = UDP – User Datagram
IP:Checksum = 0x2FA8
IP:Source Address = 157.54.48.151
IP:Destination Address = 255.255.255.255
IP:Data:Number of data bytesremaining =308 (0x0134)
在
DHCP OFFER
报文中,
Ciaddr
字段值仍为
0.0.0.0
,因为客户端仍没有分配到
IP
地址;
Yiaddr
字段已有值了,这是
DHCP
服务器为该客户端预分配的
IP
地址;因为此时仍没有得到客户端确认,所以
Siaddr
字段值仍为
0.0.0.0
;因为没有经过
DHCP
中继服务器,所以
Giaddr
字段值仍为
0.0.0.0
。另外,在
DHCP
可选项部分,可以看到由服务器随
IP
地址一起发送的各种选项。在这种情况下,服务器发送的是子网掩码、默认网关(路由器)、租约时间、
WINS
服务器地址(
NetBIOS
名称服务)和
NetBIOS
节点类型。下面是一个
DHCP OFFER
报文示例。
DHCP:Offer (xid=21274A1D)
DHCP:OpCode (op) = 2 (0x2)
DHCP:HardwareType (htype) = 1 (0x1) 10Mb Ethernet
DHCP:Hardware Address Length(hlen) = 6(0x6)
DHCP:Hops (hops) = 0 (0x0)
DHCP:Transaction ID (xid) = 556223005 (0x21274A1D)
DHCP:Seconds (secs) = 0 (0x0)
DHCP:Flags (flags) = 1 (0x1)
DHCP:1…………… = Broadcast
DHCP:Client IP Address (ciaddr) =0.0.0.0
DHCP:Your IP Address(yiaddr) =157.54.50.5
DHCP:Server IP Address (siaddr) =0.0.0.0
DHCP:Relay IP Address (giaddr)=0.0.0.0
DHCP:Client Ethernet Address(chaddr) =08002B2ED85E
DHCP:Server Host Name (sname) = <Blank>
DHCP:Boot File Name (file) = <Blank>
DHCP:Magic Cookie = [OK]
DHCP:OptionField (options)
DHCP:DHCP MessageType = DHCPOffer
!—DHCP
报文类型为
DHCP Offer
DHCP:SubnetMask =255.255.240.0
!—
所分配
IP
地址的子网掩码为
255.255.240.0
DHCP:Renewal Time Value (T1) = 8Days, 0:00:00
!—
想要继续租约原来分配的
IP
地址,则提出续约申请的期限为
8
天
DHCP:Rebinding Time Value (T2) = 14Days, 0:00:00
!—
如果上次申请续约失败,再次申请绑定原来分配到的
IP
地址的期限为
14
天
DHCP:IP Address Lease Time =16Days, 0:00:00
!—
租约期限为
16
天,也就是
DHCP
客户端可使用此
IP
地址的最长时间为
16
天
DHCP:ServerIdentifier =157.54.48.151
!—DHCP
服务器的
IP
地址为
157.54.48.151
DHCP:Router =157.54.48.1
!—
默认网关
IP
地址为
157.54.48.1
DHCP:NetBIOS Name Service =157.54.16.154
!—DNS
服务器
IP
地址为
157.54.16.154
DHCP:NetBIOS Node Type =(Length: 1) 04
DHCP:End of this optionfield
(
3
)选择阶段:即
DHCP
客户端选择
IP
地址的阶段。如果有多台
DHCP
服务器向该客户端发来
DHCP OFFER
报文,客户端只接受第一个收到的
DHCP OFFER
报文,然后以广播方式发送
DHCP REQUEST
报文。在该报文的
“
RequestedAddress
”
选项中包含
DHCP
服务器在
DHCP OFFER
报文中预分配的
IP
地址,对应的
DHCP
服务器
IP
地址等。这样也就相当于同时告诉得其他
DHCP
服务器,它们可以释放已提供的地址,并将这些地址返回到可用地址池中。
在
DHCP OFFER
报文封装的
IP
协议头部中,客户端的
Source Address
仍然是
0.0.0.0
,数据包的
Destination
仍然是
255.255.255.255
。但在
DHCP OFFER
报文中
Ciaddr
、
Yiaddr
、
Siaddr
、
Giaddr
字段的地址均
0.0.0.0
,大家自己分析一下为什么,很简单的。下面是一个
DHCP OFEER
报文头部和
DHCP OFFER
报文示例。
IP:ID = 0x100; Proto = UDP;Len: 328
IP:Version = 4 (0x4)
IP:Header Length = 20 (0x14)
IP:Service Type = 0 (0x0)
IP:Precedence = Routine
IP:…0…. = Normal Delay
IP:….0… = NormalThroughput
IP:…..0.. = NormalReliability
IP:Total Length = 328(0x148)
IP:Identification = 256(0x100)
IP:Flags Summary = 0 (0x0)
IP:…….0 = Last fragmentin datagram
IP:……0. = May fragmentdatagram ifnecessary
IP:Fragment Offset = 0 (0x0)bytes
IP:Time to Live = 128 (0x80)
IP:Protocol = UDP – UserDatagram
IP:Checksum = 0x38A6
IP:Source Address = 0.0.0.0
IP:Destination Address = 255.255.255.255
IP:Data:Number of data bytesremaining =308 (0x0134)
DHCP:Request (xid=21274A1D)
DHCP:OpCode (op) = 1 (0x1)
DHCP:HardwareType (htype) = 1 (0x1) 10Mb Ethernet
DHCP:Hardware Address Length(hlen) = 6(0x6)
DHCP:Hops (hops) = 0 (0x0)
DHCP:Transaction ID (xid) = 556223005 (0x21274A1D)
DHCP:Seconds (secs) = 0 (0x0)
DHCP:Flags (flags) = 1 (0x1)
DHCP:1…………… = Broadcast
DHCP:Client IP Address (ciaddr) =0.0.0.0
DHCP:Your IP Address(yiaddr) =0.0.0.0
DHCP:Server IP Address (siaddr) =0.0.0.0
DHCP:Relay IP Address (giaddr)=0.0.0.0
DHCP:Client Ethernet Address(chaddr) =08002B2ED85E
DHCP:Server Host Name (sname) = <Blank>
DHCP:Boot File Name (file) = <Blank>
DHCP:Magic Cookie = [OK]
DHCP:OptionField (options)
DHCP:DHCP MessageType = DHCP Request
DHCP:Client-identifier = (Type:1) 08 00 2b 2e d8 5e
DHCP:RequestedAddress =157.54.50.5
DHCP:ServerIdentifier =157.54.48.151
DHCP:HostName =JUMBO-WS
DHCP:Parameter Request List= (Length:7)01 0f 03 2c 2e 2f 06
DHCP:End of this optionfield
(
4
)确认阶段:即
DHCP
服务器确认分配级
DHCP
客户端
IP
地址的阶段。某个
DHCP
服务器在收到
DHCP
客户端发来的
DHCP REQUEST
报文后,只有
DHCP
客户端选择的服务器会进行如下操作:如果确认将地址分配给该客户端,则
以广播方式
返回
DHCP ACK
报文;否则返回
DHCP NAK
报文,表明地址不能分配给该客户端。
在
DHCP
服务器发送的
DHCP ACK
报文的
IP
协议头部,
Source Address
是
DHCP
服务器
IP
地址,
DestinationAddress
仍然是广播地址
255.255.255.255
。在
DHCP ACK
报文中的
Yiaddr
字段包含要分配给客户端的
IP
地址,而
Chaddr
和
DHCP:ClientIdentifier
字段是发出请求的客户端中网卡的
MAC
地址。同时在选项部分也会在
DHCP OFFER
报文中把所分配的
IP
地址的子网掩码、默认网关、
DNS
服务器、租约期、续约时间等信息加上。
IP:ID = 0x3D30; Proto = UDP;Len: 328
IP:Version = 4 (0x4)
IP:Header Length = 20 (0x14)
IP:Service Type = 0 (0x0)
IP:Precedence = Routine
IP:…0…. = Normal Delay
IP:….0… = NormalThroughput
IP:…..0.. = NormalReliability
IP:Total Length = 328(0x148)
IP:Identification = 15664(0x3D30)
IP:Flags Summary = 0 (0x0)
IP:…….0 = Last fragmentin datagram
IP:……0. = May fragmentdatagram ifnecessary
IP:Fragment Offset = 0 (0x0)bytes
IP:Time to Live = 128 (0x80)
IP:Protocol = UDP – UserDatagram
IP:Checksum = 0x2EA8
IP:Source Address = 157.54.48.151
IP:Destination Address = 255.255.255.255
IP:Data:Number of data bytesremaining =308 (0x0134)
DHCP:ACK (xid=21274A1D)
DHCP:OpCode (op) = 2 (0x2)
DHCP:HardwareType (htype) = 1 (0x1) 10Mb Ethernet
DHCP:Hardware Address Length(hlen) = 6(0x6)
DHCP:Hops (hops) = 0 (0x0)
DHCP:Transaction ID (xid) = 556223005 (0x21274A1D)
DHCP:Seconds (secs) = 0 (0x0)
DHCP:Flags (flags) = 1 (0x1)
DHCP:1…………… =Broadcast
DHCP:Client IP Address (ciaddr) =0.0.0.0
DHCP:Your IP Address(yiaddr) =157.54.50.5
DHCP:Server IP Address (siaddr) =0.0.0.0
DHCP:Relay IP Address (giaddr)=0.0.0.0
DHCP:Client Ethernet Address(chaddr) =08002B2ED85E
DHCP:Server Host Name (sname) = <Blank>
DHCP:Boot File Name (file) = <Blank>
DHCP:Magic Cookie = [OK]
DHCP:OptionField (options)
DHCP:DHCP MessageType = DHCP ACK
DHCP:Renewal Time Value (T1)= 8Days, 0:00:00
DHCP:Rebinding Time Value(T2) = 14Days, 0:00:00
DHCP:IP Address LeaseTime = 16Days, 0:00:00
DHCP:ServerIdentifier =157.54.48.151
DHCP:SubnetMask =255.255.240.0
DHCP:Router =157.54.48.1
DHCP:NetBIOS Name Service =157.54.16.154
DHCP:NetBIOS NodeType = (Length: 1) 04
DHCP:End of this optionfield
【说明】客户端在收到服务器返回的
DHCP-ACK
确认报文后,会以广播的方式发送免费
ARP
报文(该报文中,源
IP
地址和目标
IP
地址都是本机
IP
地址,源
MAC
地址是本机
MAC
地址,目的
MAC
地址是广播
MAC
地址),探测是否有主机使用服务器分配的
IP
地址,如果在规定的时间内没有收到回应,客户端才使用此地址。否则,客户端会发送
DHCP DECLINE
报文给
DHCP
服务器,并重新申请
IP
地址。
如果网络中存在多个
DHCP
服务器,除
DHCP
客户端选中的服务器外,其它
DHCP
服务器中本次未分配出的
IP
地址仍可分配给其他客户端。
PS::::
说一下
dhcp
的客户机的
ip
选择的问题:
首先会申请上次接入网络的ip地址,如果这个ip地址未被占用而且是处于改dhcp的网段里面的ip地址,就会优先选择这一个ip地址,如果没有,那么我们就会在范围内从小到大的选择。
PS2::::DHCP
客户机的
ip
地址的租期问题:
当客户机的租约期到%50的时候,会向DHCP服务器发送DHCP REQUEST消息包。
如果客户机接收到该服务器回应的DHCP ACK消息包,客户机就根据包中所提供的新的租期以及其它已经更新的TCP/IP参数,更新自己的配置,IP租用更新完成。
如果没有收到该服务器的回复,则客户机继续使用现有的IP地址,因为当前租期还有50%。
如果在租期过去50%的时候没有更新,则客户机将在租期过去87.5%的时候再次向为其提供IP地址的DHCP联系。
如果还不成功,到租约的100%时候,客户机必须放弃这个IP地址,重新申请。
如果此时无DHCP可用,客户机会使用111.111.0.0/16(你的dhcp服务器)中随机的一个地址,并且每隔5分钟再进行尝试