随着网络技术和嵌入式技术的迅速发展,网络中的嵌入式移动设备大量出现。为了将嵌入式设备接入到网络中,每个嵌入式设备都必须进行基本的网络配置。嵌入式移动设备在网络中频繁的接入,需要及时更新所使用的IP地址才能正常通信;在同一个网段上,为出现的大量嵌入式移动设备配置IP地址等参数十分困难,这也导致网络中的IP地址成为稀缺资源,在这样的环境下,每个嵌入式移动设备最好能够自动获取动态IP地址等资源,使用完毕后还能够及时释放。因此,对于存在频繁接入大量嵌入式移动设备的网络,其管理和维护任务相当繁重的,需要一种机制让TCP/IP的配置和管理从用户端转移到网络管理端,实现IP的集中式管理[1-3]。
为了解决网络管理的难题,提出了一种适用于嵌入式环境的DHCP客户端的设计方法,并且在ARM环境下得以实现。这种方法适合分散控制和管理存在较大规模嵌入式设备的网络。DHCP客户端协议移植到嵌入式系统上,可以节省配置IP参数的时间,大大提高嵌入式设备的可管理性,降低了嵌入式设备手工配置IP地址所造成的管理成本和硬件成本。
1 DHCP协议和工作原理
1.1 DHCP协议
DHCP(Dynamic Host Configuration Protocol)即动态主机配置协议,是一个局域网的网络协议。为了减轻TCP/IP网络的规划、管理和维护负担,解决IP地址空间缺乏问题,DHCP为内部网络或网络服务供应商自动分配IP地址,为用户或者内部网络管理员提供对所有计算机进行中央管理的手段[4]。
DHCP是用于给多个客户计算机集中分配IP地址以及相关的配置参数的协议,这样就能将IP地址和TCP/IP的设置统一管理起来,从而避免不必要的地址冲突问题。该协议常常用在网络中对众多计算机的管理,以减少网络管理员手工设置和分配地址的负担。主机使用DHCP协议可以通过DHCP服务器得到IP地址、默认网关和DNS服务器等信息,从而大大减少了用户的手动配置工作量,同时DHCP服务器能够及时回收不用的IP地址,从而提高IP地址的利用率。
1.2 DHCP工作原理
DHCP的工作主要分为以下阶段[5]:
(1)DHCP客户端寻找DHCP服务器阶段;
(2)DHCP服务器提供IP地址阶段;
(3)DHCP客户端选择IP地址阶段;
(4)DHCP服务器确认所提供的IP地址阶段;
(5)租约确认阶段;
(6)DHCP客户端再次登录网络时,直接发送包含前一次所分配的IP地址的DHCP request请求信息。
DHCP客户端使用DHCP获取其IP地址的过程中,共有6种状态。各个状态之间的转换以及引起状态转换的事件和报文如图1所示。DHCP客户端第一次启动时,便进入初始化状态。为了获取一个IP地址,它会向所有服务器广播一个DHCP discover报文,并进入选择状态。处于选择状态时,它从DHCP服务器收集DHCP offer响应,并选择一个服务器向其发送DHCP request报文,进入请求状态。DHCP服务器确认请求后,发出DHCP ack报文,DHCP客户端收到确认消息后转移到已绑定状态。当需要重新续约时,DHCP客户端发送DHCP request报文并转移到更新状态。DHCP客户端可以随时发送DHCP release报文,返回初始化状态。进入更新状态后,DHCP客户端发送DHCP nack报文,返回初始化状态;如果租用期超过阈值,DHCP客户端发送DHCP request报文并转移到重绑定状态。进入重绑定状态后,如果租期到期或发送DHCP nack报文,则返回初始化状态。
2 DHCP客户端的实现
2.1 开发环境
设计DHCP客户端软件的难点是DHCP客户端在嵌入式系统上的移植[6],其中前台技术采用B/S模式。Fedora是一个基于Linux的独立操作系统,具有开放性、创新性和前瞻性。它允许任何人自由地使用、修改和重新发布,可以运行在多种体系结构上。因此,本文选择Fedora操作系统作为开发平台。
为了能够编译、链接、处理和调试跨越平台体系结构的程序代码,使用交叉开发工具链和不同的参数[7]。编译环境为在X86系列的处理器平台上编译出能运行在ARM构架的处理器平台上的程序所需要的编译工具。构建交叉编译环境首先要确定目标平台。在GNU系统中,每个目标平台都有一个明确的格式,这些信息用于在构建过程中识别要使用的不同工具的正确版本。本系统的移植平台是基于ARM9的嵌入式系统,开发板S3C2440所配内核已为最新的Linux-2.6.32.2,交叉编译器统一为arm-linux-gcc-4.3.2。
2.2 DHCP客户端软件设计
DHCP客户端软件主要是用来完成状态跳转以及发送和接收DHCP包的任务,同时记录时间,在未到达指定时刻时,对程序实行有效的阻塞。根据这些需求,可以采用死循环与选择状态函数结合的方法。选择状态函数用来侦听与服务器连接的socket端口的变化情况。当选择状态函数侦听的socket端口发生变化时,处理相应接收报文;当socket端口没有发生变化时,将相应报文作发送处理。DHCP客户端软件中各个函数之间的调用关系如图2所示。
由上面分析可知,DHCP客户端软件主要由相互独立的若干子函数组成,主函数主要用来对子函数进行调用,每次执行完一个函数后,返回一个要执行的函数的地址,继续执行。下面介绍5个主要子函数:
(1)初始化函数的流程图如图3所示,主要用来对DHCP客户端进行初始化,发送discover报文。如果发送成功,返回选择状态函数的地址;否则,停止DHCP。
(2)请求函数的流程图如图4所示。DHCP客户端接收服务器的DHCP ack报文,如果接收失败,返回初始化函数地址;否则,对服务器提供的IP地址进行验证,如果校验失败,发送declient报文并返回初始化函数地址;否则配置DHCP;如果配置成功,客户端转换到绑定状态函数;否则,停止DHCP。
(3)绑定函数的流程图如图5所示。DHCP客户端将从服务器获取到的IP设置成网卡的地址,DHCP客户端进入更新状态,等待服务器超时。
(4)更新函数的流程图如图6所示。DHCP客户端在IP租约定时器超时的时候,向服务器发送DHCP request报文,进行续约。
(5)重绑定函数的流程图如图7所示,当DHCP客户端在IP租约到达80%时,若服务器还没有回应DHCP ack报文,则DHCP客户端广播DHCP request报文。若在原租约期到期时,DHCP客户端收到了DHCP ack报文,则客户端进入绑定状态;否则转换到初始化状态。
3 测试结果与分析
DHCP客户端软件对硬件方面并没有极其严格的要求,为了进行测试,选用的计算机型号为三星R458,ARM9型号为S3C2440。DHCP客户端软件的测试步骤如下:
(1)将编译成功的DHCP客户端软件复制到U盘上,并将DHCP源代码中client目录下的dhclient-script和client.conf下载到U盘中;
(2)启动ARM9,进入系统后,插入U盘,挂载U盘成功后,把U盘中的dhclient-scrip和client.conf下载到/etc目录下并修改权限,把DHCP客户端软件复制到/sbin目录下并修改权限;
(3)在/sbin中,运行DHCP客户端软件,命令为dhc-
lient eth0。
通过以上步骤可以得到DHCP客户端软件的运行结果,如图8所示。
此外,通过对测试数据的分析可以得到以下结论:
(1)为了增加系统配置的灵活性,mac地址、主机名的设置是在系统启动时的配置文件rcs中设置的,配置脚本如下:
ifconfig eth0
ifconfig eth0 hw ether 0A:08:09:17:14:13
ifconfig eth0 up
(2)为了使设备的DHCP客户端正确运行,在编译Linux内核时,还需要在网络设置部分添加以下选项:
Networking——>
[*]Networking support——>
Networking options——>
<*>Packet socket
[*] IP:DHCP support
[*]Network packet filtering(replaces ipchains)
分别添加数据包socket、IP、DHCP支持和网络数据包过滤选项,其中网络数据包过滤后面子选项可不选。
(3)在S3C2440自带的嵌入式系统上,上述第二项,必须进行内核编译,否则DHCP客户端不能直接运行。
(4)在适合S3C2440的Android系统上,DHCP客户端程序能正常运行。