张奎
【摘要】DHCP是为了实现TCP/IP网络参数的自动分配而设计的,本文深入分析DHCP工作原理,在以太网板卡的基础上,设计了一个DHCP客户端,从而实现了板卡端口的地址自动配置。
【关键词】DHCP客户端;以太网板卡;设计
1.引言
随着网络技术的发展,TCP/IP网络与人们的工作与生活越来越紧密的联系在一起。为确保网络通信的正常进行,需要配置IP地址等网络参数。目前,IP地址分配主要采用手动分配和自动分配的方式。其中,手动分配的地址将被长期占用,导致地址利用率低。而自动分配则是由处于网络中的服务器分配地址,这种方式将手工配置IP地址所导致的错误减少到最低程度[1]。
IETF设计的动态主机配置协议(DHCP)正是这样一种动态分配机制。本文将阐述利用以太网板卡的现有功能,设计一个DHCP客户端,从而使板卡的每个端口可以动态获取IP地址等网络参数。
2.DHCP原理
DHCP(Dynamic Host Configuration Protocol),是一种动态向网络终端提供配置参数的协议。DHCP使用客户端/服务器模式,请求配置信息的终端被称为DHCP客户端,而提供配置信息的被称为DHCP服务器。
DHCP客户端和服务器之间的交互通过以下8种类型的报文来实现:
①DISCOVER:由客户端广播,寻找可达的服务器;
②OFFER:由服务器响应客户端的DISCOVER报文,携带了相关配置参数;
③REQUEST:客户端发往服务器,请求配置参数或确认原来的配置是否可用;
④ACK:服务器发往客户端,该报文包含了所提交的配置参数;
⑤NAK:服务器发往客户端,提示客户端参数错误或租期已满;
⑥DECLINE:客户端发往服务器,告诉服务器IP地址已被使用;
⑦RELEASE:客户端发往服务器,告诉服务器放弃IP地址并终止剩余租期;
⑧INFORM:客户端发往服务器,告诉服务器已配置了网络,仅向服务器请求本地配置参数[2];
客户端从服务器动态获取IP地址,主要通过四个阶段进行:
①发现阶段:客户端寻找服务器的阶段。客户端以广播方式发送DISCOVER报文。
②提供阶段:服务器提供IP地址的阶段。服务器接收到客户端的DISCOVER报文后,根据IP地址分配的规则选出一个IP地址,与其他参数一起通过OFFER报文发送给客户端。
③选择阶段:客户端选择IP地址的阶段。如果有多台服务器向该客户端发来OFFER报文,客户端只接受第一个,然后以广播方式发送REQUEST报文,该报文中包含服务器在OFFER报文中分配的IP地址。
④确认阶段:服务器确认IP地址的阶段。服务器收到REQUEST报文后,只有被选择的服务器会进行如下操作:如果确认将该地址分配给该客户端,则返回ACK報文;否则返回NAK报文,表明该地址不能分配给该客户端[3]。
3.系统设计
软件部分采用VC++6.0开发工具设计和编译,程序运行在WindowsXP环境下,程序设计的流程如图2所示。客户端程序的具体实现过程主要包括:
(1)定义一个数据结构,保存程序运行中的配置参数,描述如下:
struct dhcp_frm_params
unsigned char op; // 操作类型.
unsigned char htype; // client网络硬件协议类型.
unsigned char hlen; // client网络硬件地址长度.
unsigned char hops; // 当前的DHCP报文经过的DHCP中继的数量.
unsigned int tx_id; // 匹配Server的响应报文是对哪个请求报文的响应.
unsigned short seconds; // client开始DHCP请求后到现在经历的时间.
unsigned short flags;
unsigned char ciaddr[4]; // 表示client的IP地址.
unsigned char yiaddr[4]; // server分配给client的IP地址.
unsigned char siaddr[4]; // client获取配置信息的服务器的IP地址.
unsigned char giaddr[4]; // 记录第一个DHCP中继的IP地址.
unsigned char chaddr[16]; // 记录client的实际硬件地址内容.
signed char sname[64]; // client获取配置信息的服务器的名称.
signed char file[128]; // client的配置文件的名称.
unsigned char* options; // 包含大量可选的终端初始配置信息.
unsigned int options_len; // options的长度.
}
(2)为了产生特定的交互报文,定义了一系列函数,主要函数描述如下:
根据配置参数,生成一个dhcp报文:
make_up_dhcp_frm(dhcp_frm_params& dhcp_frm, char* buf);
①发送一个dhcp-discover报文;
tx_one_dhcp_disscover_frm();
②判断收到报文是否是dhcp-discover报文的响应报文;
chk_dhcp_discover_response_frm(char*buf, unsigned int dataLen );
③发送一个dhcp-request报文;
tx_one_dhcp_request_frm();
④判断收到报文是否是dhcp-request报文的响应报文;
chk_dhcp_request_response_frm(char *buf, unsigned int dataLen );
⑤查找dhcp-discover的响应报文;
get_dhcp_discover_response_msg();
⑥查找dhcp-request的响应报文;
get_dhcp_request_response_msg();
⑦發送免费的ARP报文,进行地址冲突检测;
tx_one_gratis_arp_frm();
⑧检测对免费ARP的响应报文;
chk_gratis_arp_response_frm();
⑨查找免费ARP的响应报文。
get_gratis_arp_response_msg()。
(3)报文的收发:
当由软件生成交互报文后,通过板卡的协议仿真通道,将数据发送出去。同时,通过检测通道接收到的数据,获取服务器或者其他网络节点发送的报文。
在设计过程中,硬件部分实现创建一个协议仿真通道,执行数据的收发。软件部分实现初始化系统数据,产生交互过程中需要的报文,保存获取的网络参数。
测试中使用了某国产路由器作为DHCP服务器,将板卡的一个测试端口直接与路由器相连,通过超级终端以console方式登陆路由器,配置地址池,使能路由器端口的DHCP服务器功能。启动配置过程后,在超级终端中可以看到服务器成功为客户端分配了IP地址,并设置了地址的过期时间。
4.结语
本文详细介绍了DHCP客户端如何动态获取IP地址的过程,并基于以太网板卡的功能,实现了一个DHCP客户端,可以用来测试从网络中获取地址的能力,对现有板卡的功能是一个很好的补充。
参考文献
[1]邢国稳.工业以太网中DHCP协议应用技术分析[J].微计算机信息,2005,5:30-31.
[2]RFC 2132,DHCP Options and BOOTP Vendor Extensions.
[3]Dynamic Host Configuration Protocol,RFC 2131,1997.