http://baike.baidu.com/link?url=7vPB8oHmGKABFdECjx-B1xwkuw-aVzJh-1LP9EQg6eHAzptFIKyN2XyfQNCSMLIucpfW9y_yB9TEcIZSJpq42q
寻找 Server
当 DHCP
客户端第一次登录网络的时候,也就是客户发现本机上没有任何 IP 数据设定,它会向网络发出一个
DHCP DISCOVER封包(
广播包)。因为
客户端还不知道自己属于哪一个网络,
所以封包的来源地址会为 0.0.0.0 ,而目的地址则为 255.255.255.255 ,然后再附上 DHCP discover 的信息,向网络进行广播。在 Windows 的预设情形下,DHCP discover 的等待时间预设为 1 秒,也就是当
客户端将第一个 DHCP discover
封包送出去之后,在 1 秒之内没有得到响应的话,就会进行第二次 DHCP discover 广播。若一直得不到响应的情况下,
客户端一共会有四次 DHCP discover 广播(包括第一次在内),除了第一次会等待 1 秒之外,其余三次的等待时间分别是 9、13、16 秒。如果都没有得到 D
HCP
服务器的响应,
客户端则会显示
错误信息,宣告 DHCP discover 的失败。之后,基于使用者的选择,系统会继续在 5 分钟之后再重复一次 DHCP discover 的过程。
相关图片
提供 IP 租用地址
当 DHCP
服务器监听到
客户端发出的 DHCP discover 广播后,它会从那些还没有租出的地址范围内,选择最前面的空置 IP ,连同其它 TCP/IP 设定,响应给
客户端一个 DHCP OFFER
封包。由于
客户端在开始的时候还没有 IP 地址,所以在其 DHCP discover
封包内会带有其 MAC 地址信息,并且有一个 XID 编号来辨别该封包,DHCP
服务器响应的
DHCP offer 封包则会根据这些资料传递给要求租约的客户。根据
服务器端的设定,DHCP offer
封包会包含一个租约期限的信息。
接受 IP 租约
如果客户端收到网络上多台 DHCP 服务器的响应,只会挑选其中一个 DHCP>封包,告诉所有 DHCP 服务器它将指定接受哪一台服务器提供的 IP 地址。
同时,
客户端还会向网络发送一个 ARP封包,查询网络上面有没有其它机器使用该 IP 地址;如果发现该 IP 已经被占用,客户端则会送出一个 DHCPDECLINE 封包给 DHCP服务器,拒绝接受其 DHCP offer ,并重新发送 DHCP discover 信息。事实上,并不是所有 DHCP
客户端都会无条件接受 DHCP
服务器的>主机安装有其它 TCP/IP 相关的客户
软件。
客户端也可以用
DHCP request 向
服务器提出 DHCP 选择,而这些选择会以不同的号码填写在 DHCP Option Field 里面。
换一句话说,在 DHCP
服务器上面的设定,未必是
客户端全都接受。
客户端可以保留自己的一些 TCP/IP 设定,并且主动权永远在客户端这边。
租约确认
当 DHCP
服务器接收到
客户端的 DHCP request 之后,会向客户端发出一个DHCPACK 响应,以确认 IP 租约的正式生效,也就结束了一个完整的 DHCP 工作过程。
DHCP 发放流程第一次登录之后:一旦 DHCP
客户端成功地从
服务器那里取得 DHCP 租约之后,除非其租约已经失效并且 IP 地址也重新设定回 0.0.0.0 ,否则就无需再发送 DHCP discover 信息了,而会直接使用已经租用到的 IP 地址向之前的 DHCP服务器发出 DHCP request 信息,DHCP 服务器会尽量让客户端使用原来的 IP 地址,如果没问题的话,直接
响应 DHCP ack来确认则可。如果该地址已经失效或已经被其它机器使用了,
服务器则会响应一个
DHCP NACK封包给
客户端,要求其重新执行 DHCP discover。至于 IP 的租约期限却是非常考究的,并非如我们租房子那样简单, 以 NT 为例子:DHCP
客户端除了在开机的时候发出 DHCP request 请求之外,在租约期限一半的时候也会发出 DHCP request ,如果此时得不到 DHCP
服务器的确认的话,客户端还可以继续使用该 IP ;当租约期过了87.5%时,如果客户端仍然无法与当初的
DHCP服务器联系上,它将与其它DHCP服务器通信。如果网络上再没有任何DHCP
服务器在运行时,该
客户端必须停止使用该IP地址,并从发送一个Dhcpdiscover
数据包开始,再一次重复整个过程。要是您想退租,可以随时送出
DHCP RELEASE 命令解约,就算您的租约在前一秒钟才获得的。
跨网络的 DHCP 运作 从前面描述的过程中,我们不难发现:如果 DHCP
服务器安设在其它的网络上面呢?由于 DHCP 客户端还没有 IP 环境设定,所以也不知道 Router 地址,而且有些 Router 也不会将 DHCP 广播
封包传递出去,因此这情形下 DHCP DISCOVER 是永远没办法抵达 DHCP
服务器那端的,当然也不会发生 OFFER 及其它动作了。要解决这个问题,我们可以用 DHCP Agent (或 DHCP Proxy )
主机来接管客户的 DHCP 请求,然后将此请求传递给真正的 DHCP
服务器,然后将
服务器的回复传给客户。这里,Proxy
主机必须自己具有
路由能力,且能将双方的
封包互传对方。若不使用 Proxy,您也可以在每一个网络之中安装 DHCP
服务器,但这样的话,一来设备成本会增加,而且,管理上面也比较分散。当然喽,如果在一个十分大型的网络中,这样的均衡式架构还是可取的。视您的实际情况而定了。
见过的例子:
- DHCP Discover
- DHCP OFFER
- DHCP REQUEST
- DHCP ACK
- ARP 查分配的IP是否被占用
- 三次查询没有回复,则ARP查询网关IP的MAC。后续所有的报文,如果目的MAC为此网关的MAC,则通过此网关发送出去。
不涉及网络地址转换NAT之类的话,源IP和目的IP不能变,变了就不知道去哪了,也没法知道返回给谁。至于MAC地址是变的,但是还要看下一跳的数据链路层协议是什么,是否用MAC地址,若是Ethernet这种用MAC的,那么源MAC改成路由自己的,目的MAC改成下一跳的。
DHCPv4端口,67、68
DHCPv6端口,546、547
DHCPv6端口,546、547
DHCPv4端口,67、68