用户操作
[留言]  [发消息]  [加为好友] 
订阅我的博客
XML聚合    FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
hust_wh的公告
<div class="leftmenu"> <b>个人资料</b><br> 城市:武汉<br> QQ :5383574<br> Email:hust_wh@163.com<br> <!-- Blog日历表开始 --> <script language="javascript"> var diarydays=""; </script> <meta http-equiv="Content-Type" content="text/html; charset=gb2312"> <style> .calendarBigBorder { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; text-decoration: none; width: 170; background-color: #FFFFFF; font-size: 9pt;border:1px dotted #999; } .calendarTd { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #000000; background-color: #eeeeee; height: 18px; width: 11%; text-align: center;} .calendarMInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; text-decoration: none; background-color: #FFFFFF; height: 15px; border: 1px solid #666666; width: 19px; color: #0099FF;} .calendarYInput { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #0099FF; text-decoration: none; background-color: #FFFFFF; height: 15px; width: 34px; border: 1px solid #666666;} .calendarMonthTitle { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; height: 24px; text-align: center; color: #333333; text-decoration: none; background-color: #eeeeee; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-bottom-style: none; border-top-color: #999999; border-right-color: #999999; border-bottom-color: #999999; border-left-color: #999999;} .calendarNow { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: bold; color: #000000; background-color: #C0C9D3; height: 18px; text-align: center;} .calendarDaySat { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarDaySun { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; color: #333333; text-decoration: none; background-color: #eeeeee; text-align: center; height: 18px; width: 12%;} .calendarLink { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; font-weight: normal; color: #333333; text-decoration: none; background-color: #E7E7F6; text-align: center; height: 18px;} .categoryTxt { font-family: "Arial", "Helvetica", "sans-serif", "宋体"; font-size: 9pt; line-height: 23px; color: #333333; text-decoration: none;} .categoryTable { border-right-width: 1px; border-bottom-width: 1px; border-right-style: solid; border-bottom-style: solid; border-left-style: none; border-right-color: #000000; border-bottom-color: #000000; border-top-width: 1px; border-top-style: solid; border-top-color: #71b99c;} </style> <SCRIPT LANGUAGE="JavaScript"> var months = new Array("一", "二", "三","四", "五", "六", "七", "八", "九","十", "十一", "十二"); var daysInMonth = new Array(31, 28, 31, 30, 31, 30, 31, 31,30, 31, 30, 31); var days = new Array("日","一", "二", "三","四", "五", "六"); var classTemp; var calendarHover="calendarHover"; var today=new getToday(); var year=today.year; var month=today.month; var newCal; //得到某月天数 function getDays(month, year) { if (1 == month) return ((0 == year % 4) && (0 != (year % 100))) ||(0 == year % 400) ? 29 : 28; else return daysInMonth[month]; } //得到当天时间信息 function getToday() { this.now = new Date(); this.year = this.now.getFullYear(); this.month = this.now.getMonth(); this.day = this.now.getDate(); } //生成日历 function Calendar() { newCal = new Date(year,month,1); //当前月的第一天 today = new getToday(); var day = -1; //用来判断日历中是否为当天 var startDay = newCal.getDay(); //当月开始时间 var endDay=getDays(newCal.getMonth(), newCal.getFullYear());//当月结束时间 var daily = 0; //用来生成日历中的天数值 if ((today.year == newCal.getFullYear()) &&(today.month == newCal.getMonth())) day = today.day; var caltable = document.all.caltable.tBodies.calendar; //得到日历表格的集合 var intDaysInMonth =getDays(newCal.getMonth(), newCal.getFullYear()); //得到当月天数 //生成日历 for (var intWeek = 0; intWeek < caltable.rows.length;intWeek++) for (var intDay = 0;intDay < caltable.rows[intWeek].cells.length;intDay++) { var cell = caltable.rows[intWeek].cells[intDay]; //得到单元袼 //生成字符串用于判断当天是否有日志 var montemp=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); if ((intDay == startDay) && (0 == daily)){ daily = 1;} var daytemp=daily<10?("0"+daily):(daily); var d="<"+newCal.getFullYear()+"-"+montemp+"-"+daytemp+">"; //选择样式 if(day==daily) cell.className="calendarNow"; else if(diarydays.indexOf(d)!=-1) cell.className="calendarLink"; else if(intDay==6) cell.className = "calendarDaySat"; else if (intDay==0) cell.className ="calendarDaySun"; else cell.className="calendarTd"; //生成值 if ((daily > 0) && (daily <= intDaysInMonth)) { cell.innerText = daily; daily++; } else cell.innerText = ""; } document.all.year.value=year; document.all.month.value=month+1; } function subMonth() { if ((month-1)<0) { month=11; year=year-1; } else { month=month-1; } Calendar(); } function addMonth() { if((month+1)>11) { month=0; year=year+1; } else { month=month+1; } Calendar(); } //得到响应事件 function getDiary() { var mon=(newCal.getMonth()+1)<10?("0"+(newCal.getMonth()+1)):(newCal.getMonth()+1); var day=event.srcElement.innerText<10?("0"+event.srcElement.innerText):(event.srcElement.innerText); var d="<"+newCal.getFullYear()+"-"+mon+"-"+day+">"; if ("TD" == event.srcElement.tagName) if (("" != event.srcElement.innerText)&&(diarydays.indexOf(d)!=-1)) { diary.location="/chensheng913/archive/"+newCal.getFullYear()+"/"+mon+"/"+day+".aspx"; window.location.href = diary.location; } } function setDate() { if (document.all.month.value<1||document.all.month.value>12) { alert("月的有效范围在1-12之间!"); return; } year=Math.ceil(document.all.year.value); month=Math.ceil(document.all.month.value-1); Calendar(); } </SCRIPT> <table border="0" cellpadding="0" cellspacing="1" class="calendarBigBorder" id="caltable" width="180"> <thead> <tr align="center" valign="middle"> <td colspan="7" class="calendarMonthTitle"> <input name="year" type="text" class="calendarYInput" size="3" maxlength="4" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">年 <input name="month" type="text" class="calendarMInput" size="1" maxlength="2" onkeydown="if (event.keyCode==13){setDate()}" onkeyup="this.value=this.value.replace(/[^0-9]/g,'')" onpaste="this.value=this.value.replace(/[^0-9]/g,'')">月 [<a onClick="addMonth()" href="javascript:;">下月</a>] [<a onClick="subMonth()" href="javascript:;">上月</a>]</td> </tr> <tr align="center" valign="middle"> <SCRIPT LANGUAGE="JavaScript"> document.write("<TD class=calendarDaySun id=diary>" + days[0] + "</TD>"); for (var intLoop = 1; intLoop < days.length-1; intLoop++) document.write("<TD class=calendarTd id=diary>" + days[intLoop] + "</TD>"); document.write("<TD class=calendarDaySat id=diary>" + days[intLoop] + "</TD>"); </SCRIPT> </TR> </thead> <TBODY border=1 cellspacing="0" cellpadding="0" ID="calendar" ALIGN=CENTER ONCLICK="getDiary()" onmouseup=document.selection.empty() oncontextmenu="return false" onselectstart="return false" ondragstart="return false" onbeforecopy="return false" oncopy=document.selection.empty() onselect=document.selection.empty()> <SCRIPT LANGUAGE="JavaScript"> for (var intWeeks = 0; intWeeks < 6; intWeeks++) { document.write("<TR style='cursor:hand'>"); for (var intDays = 0; intDays < days.length;intDays++) document.write("<TD class=calendarTd onMouseover='{classTemp=this.className;this.className=calendarHover}' onMouseOut='this.className=classTemp'></TD>"); document.write("</TR>"); } </SCRIPT> </tbody> </table> <script LANGUAGE="JavaScript"> Calendar(); </script> <!-- Blog日历表结束 --> <center><script language=JavaScript src="http://laoan.com/counters/count.php?jierry"></script></center><br> <table border="0" bordercolor="#000000" bgcolor="#F7F7F7" cellpadding="5" cellspacing="0" width="150"> <tr> <td style="border:1px dotted #999; "> </td> </tr> </table> </div>
文章分类
    友情blog
    !java
    火凤凰
    翱翔.Net Blog
    键者天行
    阿赖的个性空间
    站点收藏
    CSDN程序员网
    ITPUB论坛
    net130.com
    中国IT认证实验室
    中国UNIX技术社区
    中国互联网协会
    中国交换机网
    中国协议分析网
    中国教育产业联盟网
    中国电信技术
    中国系统分析员
    中国软考联盟
    中国通信网
    中国通信联盟论坛
    互联网在线
    天极网
    慧聪网
    拓普电子技术学习网
    术语详解
    李开复中国网
    系统分析员之窗
    网管员世界
    网络大典
    网络工程师联盟
    菊花论坛
    视频教学下载网
    赛迪网
    软件工程专家网
    存档

    原创  DHCP协议说明书 收藏

    一DHCP协议介绍 动态主机配置协议(Dynamic Host Configuration Protocol)属于应用层是基于BOOTP(BOOTstrap Protocol)的BOOTP和RARP类似是用于相对静态的环境其中每个主机都有一个永久的网络连接管理人 员创建一个BOOTP配置文件来定义每个主机的BOOTP参数在计算机经常移动和实际计算机数目超过了可获 得的IP主机地址时这种只提供从主机标识到主机参数的静态映射就不适用了为此制订了DHCP 它加入了 自动分配可再利用的地址和附加的配置选项的能力DHCP从两个方式上扩充了BOOTP 第一DHCP可使计 算机用一个消息获取它所需要的所有配置信息即传送配置信息的协议第二DHCP允许计算机快速动态 的获取IP地址即动态分配IP地址的机制 DHCP建立在client-server模型上其中指定的DHCP server分配网络地址并向动态配置的主机传送配置参 数只有当系统管理员明确的配置主机作为DHCP服务器时主机才能作为服务器来工作 DHCP支持三种类型的地址分配自动分配方式中DHCP给主机指定一个永久的IP地址动态分配方式中 DHCP给主机指定一个有时间限制的IP地址到时间或主机明确表示放弃这个地址时这个地址可以被其他的 主机使用手工分配方式中主机的IP地址是由网络管理员指定的DHCP只是把指定的IP地址告诉主机在这 三种方式中只有动态分配的方式可以对已经分配给主机但现在此主机已经不用的IP地址重新加以利用这 样在给一台临时连入网络的主机分配地址或者在一组不需要永久的IP地址的主机中共享一组有限的IP地址 时动态分配显得特别有用当一台新主机要永久的接入一个网络时而网络的IP地址非常有限为了将来这 台主机被淘汰时能回收IP地址这种情况下动态分配也是一个很好的选择 DHCP的消息格式是建立在BOOTP消息格式上的这样可以利用BOOTP的中继代理功能来避免在每个物理 网络都建立一个DHCP server 同时还允许现有的BOOTP client使用DHCP server 二DHCP的实现 一客户机和服务器的报文交换 1 动态分配地址 动态地址分配是DHCP的最重要和新颖的功能不像BOOTP所用的静态地址分配动态地址分配不是一 对一的映射而且服务器不需要预先知道客户机的身份特别的可配置DHCP服务器使得任意一个机器都可 获取IP地址并开始通信因此DHCP使得设计自动配置的系统成为可能一台计算机上网后它使用 DHCP获取一个IP地址然后配置其TCP/IP软件使用此地址当然自动配置受到管理员的限制由管理员 决定是否允许每个DHCP服务器自动配置 为是自动配置成为可能DHCP服务器一开始就拥有网络管理员交给它管理的一组IP地址管理员定义服 务器操作的规则DHCP客户机通过与服务器交换信息协商地址的使用在交换中服务器为客户机提供地 址客户机确认它已接受此地址一旦客户机接收了一个地址它就开始使用此地址用于通信 不像静态地址分配为每个特定主机分配一个永久地址动态地址分配是临时的DHCP服务器将一个地址 在有限时期内租给一个客户机服务器在地址分配时指定租用期在租用期间服务器不会将同一个地址租给 其他客户机但在租用期结束时客户机必须更新租期或停止使用地址 一个租用期的最优时间与特定网络和特定主机的需求有关对于一个变动很快的网络为了保证地址能 尽快的被再利用租用期必须短相反对一个相对固定的网络租用期应该长些为了适应各种可能的环 境DHCP不指定租用期的固定长度而是由协议让客户机申请某一个租用期并由服务器通知客户机它认可 的租用期因此管理员可决定应该给一个客户机分配地址多长时间特别的DHCP服务器保留一个不定 值允许像BOOTP分配的永久地址一样任意延长租用期 客户机为了分配地址和服务器进行报文交换的过程如下 1 客户机在其子网内广播一个DHCPDISCOVER报文此报文中包含关于网络地址和租用期选项的值如果客 户机和服务器不在一个子网内则BOOTP中继代理会把这个报文传给服务器 2 每个收到这个报文的服务器广播一个包含可提供的网络地址和其他配置信息的DHCPOFFER报文 3 客户机收到一个或多个服务器的DHCPOFFER报文后根据一定的条件从中选出一个并向选定的服务器 发送DHCPREQUEST报文在这个请求报文中必须包含一个服务器标识以指明被选中的服务器如果客户机在 定时器超时之前没有收到DHCPOFFER报文则重发DHCPDISCOVER报文 4 服务器在收到DHCPREQUEST报文后如果可以满足请求报文中的请求则发回一个DHCPACK报文作为响 应如果不能满足请求则发回DHCPNAK报文作为响应服务器在DHCPOFFER中提供给客户机的地址不能提 供给另外一个客户机但如果服务器没有收到客户机的DHCPREQUEST报文则可以把在DHCPOFFER中提供给 客户机的地址提供给另外的客户机 5 客户机在收到包含配置参数的DHCPACK报文后对报文中提供的配置参数进行检查同时进行配置如 果发现报文中有错误则客户机发送一个DHCPDECLINE报文并重新开始整个过程如果客户机收到 DHCPNAK报文则重新开始整个过程 6 客户机可以通过向服务器发送DHCPRELEASE报文来释放地址 2 地址获取状态 当客户机使用DHCP获取其IP地址时它处于六个状态之一如图所示 初始化 选择 请求已绑定 重绑定 更新 主机启动 /DHCPDISCOVER DHCPOFFER 选择提供/ DHCPREQUEST DHCPACK 取消租用/DHCPRELEASE 租用到期50% DHCPREQUEST DHCPACK DHCPACK 租用到期87.5% DHCPREQUEST DHCPNCK DHCPNCK 或租用到期 当客户机第一次启动时它进入INITIALIZE 初始化状态为了开始获取一个IP地址客户机先与本 地网络上所有DHCP服务器联系为此客户机广播一个dhcpdiscover报文并转移到SELECT 选择状态 由于协议是对BOOTP的扩充客户机在一个UDP数据报中发送DHCPDISCOVER报文UDP数据报中目的端口 设为BOOTP端口即端口67 本地网上所有DHCP服务器接收报文那些被设计成能响应特定客户机的服务 器发送一个DHCPOFFER报文因此客户机可能收到零个或多个响应 处于SELECT状态时客户机从DHCP服务器收集DHCPOFFER响应每个响应提供了用于客户机的配置 信息还有服务器可提供租用给客户机的一个IP地址客户机必须选择其中一个响应如第一个到达的响应 并与服务器协商租用为此客户机发送给服务器一个DHCPREQUEST报文并进入REQUEST状态服 务器为确认已接受请求并开始租用服务器响应发出一个DHCPACK报文客户机收到确认后转移到 BOUND 已绑定状态此时客户机可开始使用此地址 1 早期租用终止 当客户机使用一个分配的地址时它保持处于绑定状态如果客户机有辅助存储器客户机可以存储分配 给它的IP地址并在再次重启动时申请同一个地址但在某些情况下处于绑定状态的客户机可能发现它不再 需要一个IP地址了此时DHCP允许客户机终止租用不再等待租用期过期这在服务器可以提供的IP地址 比连到网络的计算机数少时显得特别重要如果客户机不再需要IP地址时及时终止租用服务器就可以将此地 址分配给其他客户机为了提早终止租用客户机发送一个DHCPRELEASE报文到服务器释放地址是阻止客 户机继续使用地址所以发送释放报文后客户机必须不再使用此地址发送其他数据报根据状态转移图所 示的发出DHCPRELEASE报文的主机离开绑定状态并且在使用IP地址前必须重新从初始化状态开始 2 租用更新状态 当一个DHCP客户机获取地址时它就转移到绑定状态进入绑定状态以后客户机设置三个定时器控 制租用更新重新绑定和到期一个DHCP服务器给客户机分配地址时可为定时器指定确定的值如果服务 器未指定定时器值客户机就使用默认值第一个定时器的默认值通常是总租用期的一半当第一个定时器到 期客户机必须尝试更新租用期为请求更新客户机发送一个DHCPREQUEST报文到获得租用处的服务器 转移到更新状态等待响应DHCPREQUEST包含一个客户机正使用的IP地址并请求服务机延长对此地址的租 用服务器可以用两种方式之一响应客户机的更新请求指示客户机停止使用该地址或同意客户机继续使用此 地址如果服务器同意就发送DHCPACK 在DHCPACK中也可含有客户机定时器的新的数值如果服务器不 同意继续使用它就发送一个DHCPNAK 使客户机立即停止地址的使用客户机收到DHCPACK报文则返回 到绑定状态继续使用地址如果收到DHCPNAK就立即停止使用地址并返回初始化状态 第二个定时器在客户机进入绑定状态后开始设置默认值为总租用期的87.5% 客户机发送请求报文后保 持在更新状态等待服务器的响应如果在第二个定时器到期之前还没有收到服务器的响应则第二个定时器 到期时使客户机从更新状态转移到重新绑定状态在转移时客户机假定原来的服务器不可用开始广播 DHCPREQUEST报文到本地网上的任意服务器可为客户机提供服务的任意服务器可能响应肯定即延长租 用或否定即拒绝继续使用地址如果客户机收到一个肯定响应它就返回到绑定状态并重置两个定时 器如果客户机收到否定响应它就转移到初始化状态并且停止使用IP地址在继续使用IP地址前必须重新 获取一个新地址 如果客户机在重新绑定状态广播请求报文后在第三个定时器超时前还没有从任何 一个服务器收到响应则客户机必须停止使用IP地址返回到初始化状态并开始申 请一个新地址 3 获取多重地址 一个多地址的机器连接到多个网络当这种机器启动时它可能需要为它的每个接口获取配置信息 DHCP报文只提供一个接口的有关信息因此有多个接口的计算机必须分开处理每个接口在向服务器发送请 求报文时多地址客户机应该在报文中包含一个识别特定接口的值如一个唯一的硬件地址以便服务器能区 分一个多地址主机发出的多个请求这一点在通过中继代理请求配置信息时显得尤其重要 二客户机和服务器的动作 1 服务器的动作 DHCP服务器根据和客户机绑定的状态来处理收到的报文服务器可以处理以下几种报文 DHCPDISCOVER DHCPREQUEST DHCPDECLINE和DHCPRELEASE 当服务器收到一个DHCPDISCOVER报文它要为请求的客户机分配一个网络地址如果没有可以分配的第 这则发回一个DHCPNAK报文如果有可以分配的地址则这个地址可能是客户机原来绑定的地址这个地 址必须在服务器可以分配的地址中客户机申请的地址服务器从可以分配的地址中选择的新地址同时服 务器还必须为客户机指定一个租用期如果客户机在DHCPDISCOVER中没有指定租用期并且客户机已经分配 了地址服务器选择分配此地址时指定的租用期如果客户机没有指定租用期并且客户机没有已经分配的地 址服务器选择一个缺省的租用期如果客户机在DHCPDISCOVER中指定了租用期则服务器选择这个租用期 或另外指定一个租用期一旦地址和租用期确定了服务器组建一个包含这些配置信息的DHCPOFFER报文发 回 当服务器收到一个DHCPREQUEST报文时这个报文可能是客户机对DHCPOFFER的响应也可能是客户 机在地址的租用期快满时发送的来请求延长租用期的如果报文里包含一个Server Identifier 选项则是客户 机对DHCPOFFER的响应否则就是请求延长对已有地址的租用 先考虑第一种情况如果服务器是报文中Server Identifier 选项指定的服务器则服务器检查请求的参 数是否能接受如果请求可以接受则服务器纪录新的客户机绑定并发送一个DHCPACK报文给客户机如果 请求不能接收则发送一个DHCPNAK报文如果这个DHCPREQUEST报文是发送给另外的服务器的客户机选 择了另外的服务器来获得配置信息则此服务器丢弃保留的此客户机的配置信息并释放分配给此客户机的地 址 对于第二种情况如果请求的参数和分配此地址时协商的参数一致或者现在请求的参数可以接受服务 器发送一个DHCPACK报文否则发送一个DHCPNAK报文如果在客户机IP地址字段中的地址和服务器 纪录中的IP地址不符则服务器发送一个DHCPNAK报文 当服务器收到一个DHCPDECLINE报文时说明客户机通过其他的方法发现服务器推荐的地址已经被使用 了此时服务器必须标记这个地址为已分配的应该通知本地的系统管理员可能配置上有些错误 当服务器收到一个DHCPRELEASE报文时服务器标志此地址为未分配同时服务器应该保留此客户机的 初始化参数以便以后用来响应此客户机的请求 2 客户机的动作 客户机可以处理从服务器收到的以下几种报文DHCPOFFER DHCPACK和DHCPNAK 在初始化状态客户机组建一个DHCPDISCOVER报文把其中的客户机IP地址字段设为0x00000000 客 户机还可以通过在此报文中加入参数请求选向来请求一些配置参数在此报文中还包含客户机产生的一个随机 数放到xid字段用来识别从服务器广播的响应同时客户机纪录此时的本地时间以便以后计算租用期是否到 期如果客户机收到一个响应xid和发送的请求的xid不一致客户机会不做任何处理丢弃这个报文 客户机收集一段时间内的DHCPOFFER报文根据一定的依据从中选一个提取服务器标识选项字段中的 服务器的IP地址然后检查其中提供的地址是否已经被使用如果是则向服务器发送DHCPDECLINE报文 在重绑定状态客户机发送一个DHCPREQUEST报文给服务器其中客户机IP地址字段填上本机的地 址客户机可以通过在报文中加入请求参数标来请求其他具体的配置参数客户机要产生一个随机数加入到 xid字段以匹配请求和响应同时要纪录此时本地的时间用来计算租用期是否到期在报文中不能有Server Identifier选项客户机以广播的方式发送这个报文当客户机收到一个从服务器发回的匹配的DHCPACK报 文客户机就配置好了并转移到绑定状态客户机用发送请求时纪录的时间和响应中指定的租用期的长度的和 的方式来表示租用期到期的时间 如果客户机知道DHCP服务器的地址则无论是在初始化状态还是在重绑定状态客户机都用这个地址发 送DHCPDISCOVER或DHCPREQUEST报文而不用广播地址如果没用收到响应客户机就再利用广播地址发 送请求 三DHCP的报文类型 DHCP使用BOOTP的报文格式但修改了一些字段的内容和含义DHCP报文格式如图所示 0 8 16 24 31 启动文件名128个字节 . 服务器的主机名64个字节 . . . 客户机硬件地址16个字节 .. . 中继代理IP地址 服务器IP地址 你的IP地址 客户机IP地址 标志秒数 事务ID 跳数(HOPS) HLEN HTYPE OP 选项可变长 . . . .. 其中自断OP指明报文是请求(1)还是响应(2) 字段HTYPE和HLEN指明网络硬件类型和硬件地址的长度 如10MB以太网类型为1 地址长度为6 跳数(HOPS)项被客户机置为0 当通过中继代理启动时被中继代 理使用事务ID(XID)是客户机选择的随机数被客户机和服务器用来联系客户机和服务器之间的请求报文和 响应报文秒数字段报告客户机开始启动后消耗的时间秒数客户机IP地址字段和其后的各字段包含了最重要 的信息未获得最大程度的灵活性客户机尽量填写它所知道的信息并将剩余部分设为0 例如客户机若知 道它要获取信息的某个服务器的名字或地址它可能填写服务器IP地址或服务器主机名字段若这些字段非 零只有与名字或地址字段匹配的服务器才响应请求若它们为零接收请求并能够提供服务的的任意服务器 都将响应已经知道自己IP地址的客户机也可使用DHCP来获取启动文件信息知道IP地址的客户机将地址置 于客户机IP地址字段中不知道的置0 如果客户机的IP地址为0 服务器在你的IP地址字段返回客户机的IP地 址服务器的IP地址字段时服务器在DHCPOFFER DHCPACK和DHCPNAK中返回的下一步将用到的DHCP服 务器的地址中继代理IP地址用在通过中继代理启动时指定中继代理的IP地址启动文件名指定启动的文件 在DHCPDISCOVER报文中为NULL或generic 在DHCPOFFER中为有效的带有完整路径的文件名 一标志字段 报文中的标志字段的格式如下 0 15 B 必须为0 整个字段占16比特其中最左边比特被解释为广播请求所有其它比特保留作将来用必须被客户机 设置为0 服务器和中继代理忽略这些比特客户机在协议软件配置IP地址之前是不能收到单播的报文的它 通过在DHCPDISCOVER和DHCPREQUEST报文里把标志字段里的广播请求位置位来向服务器或中继代理请求 广播报文服务器或中继代理收到这样的请求报文就会用广播的方式发回回应当客户机的协议软件配置了 IP地址之后它就可以收到单播的报文了此时它必须把广播请求位清零 二选项字段 报文中的选项字段是可变长的除了选项0和选项255 最小长度是312个字节这样DHCP报文的最 小长度是576个字节主机准备接收的最小的IP数据报的长度DHCP客户机可以通过最大DHCP报文大小 来协商使用更大的DHCP报文选项字段格式如下 0 8 16 23 代码长度数据 DHCP的选项字段和BOOTP的厂商特定区域字段的格式相同并且DHCP理解所有为BOOTP定义的厂商 特定信息其中代码字段唯一的标识一个选项长度字段指定数据字段的长度不包括代码字段和长度字 段 下图所示的是DHCP的报文类型选项 0 8 16 23 代码长度数据(53) (1) (类型1-7) 其中数据字段指定报文的类型,其含义如下 DHCPRELEASE 7 DHCPNAK 6 DHCPACK 5 DHCPDECLINE 4 DHCPREQUEST 3 DHCPOFFER 2 DHCPDISCOVER 1 对应DHCP报文类型类型字段 三选项过载 在DHCP报文头中服务器主机名和启动文件名都占用较多的字节如果一个报文中的这两个字段有一 个或两个不含信息空间就浪费了为了使DHCP服务器将这两个字段用作其他选项DHCP定义了一个选项 过载Option Overload)的选项如果出现过载选项该选项就告诉接收者忽略服务器主机名和启动文件字段 的通常含义转而察看字段中的选项

    发表于 @ 2005年05月19日 19:06:00 | 评论( loading... ) | 编辑| 举报| 收藏

    旧一篇:利用802.3ad实现链路聚合 | 新一篇:OSPF路由协议中的邻居与邻接

    • 发表评论
    • 评论内容:
    •  
    Copyright © hust_wh
    Powered by CSDN Blog