实现lwip的DHCP⾃动获取ip地址
实现lwip的DHCP⾃动获取ip地址 [转载]
上个星期,在LM3S系列移植的lwip上,实现了⾃动获取ip的功能。
实现过程是:1)在opt.h上使能#define LWIP_ARP 1和#define LWIP_DHCP 1;2)在lwipopts.h上使能#define空调内机漏水出来是怎么回事
LWIP_DHCP 1 和 #define DHCP_DOES_ARP_CHECK 1;3)在lwiplib.c上增加#include "lwip/dhcp.h";4)最后在lwiplib.c上修改static unsigned long g_ulIPMode = IPADDR_USE_DHCP和InitNic函数中的“ lwIPInit(MACAddress,xIpAddr, xNetMask, xGateway,IPADDR_USE_DHCP);”。
演讲的方法与技巧调试过程: ⼀开始⽤⽹络数据包分析软件看,发现每隔⼏秒实验板会发DHCP⼴播给255.255.255.255,我不知道出现什么问题,后来看DHCP原理才知道,路由器没回应数据包,就觉得路由器不能⾃动分配ip。我尝试⽤pc机改成⾃动获取ip,原来真的不成功。后来发现之前修改路由器使能DHCP功能后没重启路由。重启后,实验板也是先⽤DHCP⼴播,接着路由器回应⼀个ARP数据包给实验板,数据包⾥有给实验板分配的ip地址。接着实验板发出3次请问有谁是会占⽤⾃⼰将要获得的ip,避免ip地址重复。之后什么数据都没,我还以为没成功获得ip呢,因为在路由器上看不见实验板已经连上,
后还我⽤ping,居然是通的,关闭实验板就ping不通,说明已经获得ip地址了,只是不明⽩在路由器上为什么不显⽰连接成功。
附上DHCP⼯作原理:
根据客户端是否第⼀次登录⽹络,DHCP 的⼯作形式会有所不同。
第⼀次登录的时候:
寻 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 秒。如果都没有得到 DHCP 服务器的响应,客户端则会显⽰错误信息,宣告 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 offer ⽽已(通常是最先抵达的那个),并且会向⽹络发送⼀个DHCP request⼴播封包,告诉所有 DHCP 服务器它将指定接受哪⼀台服务器提供的 IP 地址。 同时,客户端还会向⽹络发送⼀个ARP 封包,查询⽹络上⾯有没有其它机器使⽤该 IP 地址;如果发现该 IP 已经被占⽤,客户端则会送出⼀个 DHCPDECLIENT 封包给DHCP 服务器,拒绝接受其 DHCP offer ,并重新发送 DHCP discover 信息。 事实上,并不是所有 DHCP 客户端都会⽆条件接受DHCP 服务器的 offer ,尤其这些主机安装有其它 TCP/IP 相关的客户。客户端也可以⽤ DHCP request 向服务器提出 DHCP 选择,⽽这些选择会以不同的号码填写在 DHCP Option Field ⾥⾯。
法定代表人 换⼀句话说,在 DHCP 服务器上⾯的设定,未必是客户端全都接受。客户端可以保留⾃⼰的⼀些 TCP/IP 设定,并且主动权永远在客户端这边。
租约确认
当 DHCP 服务器接收到客户端的 DHCP request 之后,会向客户端发出⼀个 DHCPACK 响应,以确认 IP 租约的正式⽣效,也就结束了⼀个完整的 DHCP ⼯作过程。
无法获取ip地址 DHCP 发放流程第⼀次登录之后: ⼀旦 DHCP 客户端成功地从服务器哪⾥取得 DHCP 租约之后,除⾮其租约已经失效并且 IP 地址也重新设定回 0.0.0.0 ,否则就⽆需再发送 DHCP discover 信息了,⽽会直接使⽤已经租⽤到的 IP 地址向之前之 DHCP 服务器发出DHCP request 信息,DHCP 服务器会尽量让客户端使⽤原来的 IP 地址,如果没问题的话,直接响应 DHCPack 来确认则可。如果该地址已经失效或已经被其它机器使⽤了,服务器则会响应⼀个 DHCPNACK 封包给客户端,要求其重新执⾏ DHCP discover。 ⾄于 IP 的租约期限却是⾮常考究的,并⾮如我们租房⼦那样简单, 以 NT 为例⼦:DHCP 客户端除了在开机的时候发出 DHCP request 请求之外,在租约期限⼀半的时候也会发出 DHCP request ,如果此时得不到 DHCP 服务器的确认的话,客户端还可以继续使⽤该 IP ;当租约期过了87.5%时,如果客户端仍然⽆法与当初的联系上,它将与其它DHCP服务器通信。如果⽹络上再没有任何DHCP服务器在运⾏时,该客户端必须停⽌使⽤该IP地址,并从发送⼀个Dhcpdiscover开始,
夸女孩子漂亮的话再⼀次重复整个过程。要是您想退租,可以随时送出 DHCPRELEASE 命令解约,就算您的租约在前⼀秒钟才获得的。大象英语
跨⽹络的 DHCP 运作 从前⾯描述的过程中,我们不难发现:DHCP DISCOVER 是以⼴播⽅式进⾏的,其情形只能在同⼀⽹络之内进⾏,因为 router 是不会将⼴播传送出去的。但如果 DHCP 服务器安设在其它的⽹络上⾯呢?由于 DHCP 客户端还没有 IP 环境设定,所以也不知道 Router 地址,⽽且有些 Router 也不会将 DHCP ⼴播封包传递出去,因此这情形下 DHCP DISCOVER 是永远没办法抵达DHCP 服务器那端的,当然也不会发⽣ OFFER 及其它动作了。要解决这个问题,我们可以⽤ DHCP Agent (或 DHCP Proxy )主机来接管客户的 DHCP 请求,然后将此请求传递给真正的 DHCP 服务器,然后将服务器的回复传给客户。这⾥,Proxy 主机必须⾃⼰具有能⼒,且能将双⽅的封包互传对⽅。 若不使⽤ Proxy,您也可以在每⼀个⽹络之中安装 DHCP 服务器,但这样的话,⼀来设备成本会增加,⽽且,管理上⾯也⽐较分散。当然喽,如果在⼀个⼗分⼤型的⽹络中,这样的均衡式架构还是可取的。视您的实际情况⽽定了。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论