收藏 分销(赏)

嵌入式系统DHCP客户端协议实现及改进.doc

上传人:仙人****88 文档编号:7455315 上传时间:2025-01-05 格式:DOC 页数:6 大小:55.50KB 下载积分:10 金币
下载 相关 举报
嵌入式系统DHCP客户端协议实现及改进.doc_第1页
第1页 / 共6页
嵌入式系统DHCP客户端协议实现及改进.doc_第2页
第2页 / 共6页


点击查看更多>>
资源描述
嵌入式系统DHCP客户端协议的实现和改进 [日期:2006-05-21] 来源:  作者: [字体:大 中 小] 于巍波  刘尚麟  蒋朝根   摘要:本文详细分析了嵌入式系统DHCP客户端协议的实现原理,给出了详细的协议状态变迁图,对Rabbit2000嵌入式系统DHCP客户端协议进行了改进,引入了新的服务器DHCPOFFER响应选择策略,并给出了实现代码。 关键词: DHCP协议 改进 1  引言 动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)是在TCP/IP网络上使客户机获得配置信息的协议,它是基于BOOTP协议,并在BOOTP协议的基础上添加了自动分配可用网络地址等功能。DHCP建立在client-server模型上。其中指定的DHCP server分配网络地址并向动态配置的客户机传送配置参数。DHCP的消息格式是建立在BOOTP消息格式上的,这样可以利用BOOTP的中继代理功能来避免在每个物理网络都建立一个DHCP server,同时还允许现有的BOOTP client使用DHCP server。 DHCP客户端协议已广泛移植到嵌入式系统中,大大提高了嵌入式设备的可管理性,降低了嵌入式设备手工配置IP地址所造成的管理成本和硬件成本。   2  嵌入式系统动态IP地址分配协议原理 嵌入式系统动态地址分配不是一对一的映射,服务器不需要预先知道客户机的身份。DHCP服务器可以为任意一个嵌入式设备提供IP地址。嵌入式设备上网后,它使用DHCP协议获取一个IP地址,然后配置其TCP/IP软件进行数据通讯。     网络管理员预先指定了DHCP服务器IP地址范围。DHCP客户机通过与服务器交换信息协商地址的使用。服务器为客户机提供地址,客户机确认它已接受此地址,动态地址分配是临时的。DHCP服务器将一个地址在有限时期内租给一个客户机。服务器在地址分配时指定租用期。在租用期间,服务器不会将同一个地址租给其他客户机。但在租用期结束时,客户机必须更新租期或停止使用地址。 嵌入式DHCP客户机取得分配地址和服务器进行信息交换的过程如下: (1) 客户机在其子网内广播一个DHCPDISCOVER报文,此报文中包含关于网络地址和租用期选项的值,如果客户机和服务器不在一个子网内,则BOOTP中继代理会把这个报文传给服务器。 (2) 每个收到这个报文的服务器广播一个包含可提供的网络地址和其他选项配置信息的DHCPOFFER报文。 (3) 客户机收到一个或多个服务器的DHCPOFFER报文后,根据一定的选择策略从中选出一个,并向选定的服务器发送DHCPREQUEST报文。在这个请求报文中必须包含一个服务器标识以指明被选中的服务器。如果客户机在定时器超时之前没有收到DHCPOFFER报文,则重发DHCPDISCOVER报文。 (4) 服务器在收到DHCPREQUEST报文后,如果可以满足请求报文中的请求则发回一个DHCPACK报文作为响应,如果不能满足请求则发回DHCPNAK报文作为响应。服务器在DHCPOFFER中提供给客户机的地址不能提供给另外一个客户机,但如果服务器没有收到客户机的DHCPREQUEST报文则可以把在DHCPOFFER中提供给客户机的地址提供给另外的客户机。 (5) 客户机在收到包含配置参数的DHCPACK报文后,对报文中提供的配置参数进行检查,同时进行配置,如果发现报文中有错误则客户机发送一个DHCPDECLINE报文并重新开始整个过程。如果客户机收到DHCPNAK报文则重新开始整个过程。 (6) 客户机可以通过向服务器发送DHCPRELEASE报文来释放地址。 3  嵌入式DHCP客户机状态变迁图 当客户机第一次启动时,它进入INITIALIZE(初始化)状态。为了开始获取一个IP地址,客户机先与本地网络上所有DHCP服务器联系,为此,客户机广播一个dhcpdiscover报文,并转移到SELECT(选择)状态。本地网上所有DHCP服务器接收报文,如果能够提供服务则发送一个DHCPOFFER报文。因此,客户机可能收到零个或多个响应。     处于SELECT状态时,客户机从DHCP服务器收集DHCPOFFER响应。每个响应提供了用于客户机的配置信息,还有服务器可提供租用给客户机的一个IP地址。客户机选择其中一个做出响应,并与发送给选定服务器一个DHCPREQUEST报文,并进入REQUEST状态。服务器为确认已接受请求并开始租用,服务器响应发出一个DHCPACK报文。客户机收到确认后转移到BOUND(已绑定)状态,此时客户机可开始使用此地址。                                          图1  DHCP客户机的状态变迁图 4 Rabbit2000嵌入式系统DHCP客户端协议的改进 Rabbit2000是ZWORLD公司的一种高性能8位芯片。它的开发环境Dynamic C 提供了μcOS-II操作系统软件包和全套的TCP/IP协议栈。其中DHCP客户端协议中对来自DHCP服务器提供的DHCPOFFER响应选择策略的是:只回应最快反应服务器。在局域网环境中我们发现,当多个DHCP服务器共存的时候,Rabbit2000嵌入式设备的这种选择是随机的,嵌入式设备常常会分配到错误的IP地址,发生IP地址混乱,无法完成正常的TCP/IP通讯。 为了解决这个问题,我们对DHCP客户端协议回应服务器DHCPOFFER响应选择策略进行了修改。客户端只回应特定的DHCP服务器提供的DHCPOFFER。服务器的识别我们是利用DHCP服务器15选项-DNS域名(本例中采用DHCP服务器15选项(DNS域名)内容为:)。修改后的DHCP客户端协议流程图如下图2所示: 图2 对特定DHCP服务器做出回应的DHCP客户端流程   Dynamic C DHCP协议栈文件为boottp.lib。其中函数_bootp_nodebug char dhcp_getopts()用来解析服务器选项参数,函数_bootp_nodebug char dhcp_send_rcv()完成数据包的收发,对这两个关键的函数做如下修改就可以实现上述功能。关键代码如下(代码的功能请参考注解): //申明使用到的变量具体用法见后面的程序 char _mydomainname[64]; char saftyDHCPserver;   _bootp_nodebug char dhcp_getopts(struct bootp * bp, boot_parms * parms) {//解析服务器选项参数 _mydomainname[0]= '/0';  // 保存DNS域名的变量清0 …… case DHCP_VN_HOST: // 如果DHCP服务器使用了15选项DNS域名,解析其内容          len = p[1];          // Look for '.' separating host and domain extension          u = p+2+len;          for (t = p+2; t < u; t++)          if (*t == '.') break;          if (t < u)           len = t-p-2;          else          t = NULL;          if (len > sizeof(parms->hostname)-1)             len = sizeof(parms->hostname)-1;          memcpy(parms->hostname, p+2, len);          parms->hostname[len] = 0;          if (t && !parms->domain[0]) {          len = p[1] - (t - p - 1);          if (len > 0) {                    if (len > sizeof(parms->domain)-1)                        len = sizeof(parms->domain)-1;                    memcpy(parms->domain, t+1, len);                    parms->domain[len] = 0;                    strcpy(_mydomainname,parms->domain); //将DNS域名保存到变量 //_mydomainname便于比较               }          }          break; ……   } _bootp_nodebug char dhcp_send_rcv(struct bootp * sendbootp, struct bootp * _bootp,                           char * do_send, char nonblock, boot_parms * parms,                           longword * bootptimeout, longword * sendtimeout,                           word * magictimeout, longword * starttime,                           word rand) {//完成数据包的收发 …… saftyDHCPserver=0; //安全标记清0 if (!memcmp(_mydomainname,"",strlen()) //如果收到了特定DHCP服务器的15 //选项为的DHCPOFFER包 saftyDHCPserver=1;                           //置安全标记为1,完成选择,程序进入下一步 if (!saftyDHCPserver) continue; //收到的回应不是特定DHCP服务器的回应,放弃,检查下一个//DHCPOFFER包 return dhcp_getopts(_bootp, parms); …… } 5.结束语 IP嵌入式系统采用DHCP策略可以降低系统使用时的管理成本。根据自己的需要对 Dynamic C DHCP协议栈做适当的修改,可以使用特定的DHCP服务器对所有的嵌入式系统设备进行统一管理,当DHCP服务器端和BIND软件系统协同使用时,还可以实现嵌入式系统设备名称到IP地址动态映射,提高整个系统的使用性
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 小学其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服