DHCP详解

  • Post author:
  • Post category:其他




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分钟再进行尝试







版权声明:本文为Perfectao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。