DHCP1:数据包格式1

之前学DHCP的时候比较浮,没有好好深入学习。还是重新从协议以及数据包的格式上重新学习一下DHCP。当前整理首先是整理数据包格式,然后再整理相应的协议规则。

一个DHCP数据包格式若按协议中如下:

RFC 2131          Dynamic Host Configuration Protocol         March 1997


   0                   1                   2                   3
   0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     op (1)    |   htype (1)   |   hlen (1)    |   hops (1)    |
   +---------------+---------------+---------------+---------------+
   |                            xid (4)                            |
   +-------------------------------+-------------------------------+
   |           secs (2)            |           flags (2)           |
   +-------------------------------+-------------------------------+
   |                          ciaddr  (4)                          |
   +---------------------------------------------------------------+
   |                          yiaddr  (4)                          |
   +---------------------------------------------------------------+
   |                          siaddr  (4)                          |
   +---------------------------------------------------------------+
   |                          giaddr  (4)                          |
   +---------------------------------------------------------------+
   |                                                               |
   |                          chaddr  (16)                         |
   |                                                               |
   |                                                               |
   +---------------------------------------------------------------+
   |                                                               |
   |                          sname   (64)                         |
   +---------------------------------------------------------------+
   |                                                               |
   |                          file    (128)                        |
   +---------------------------------------------------------------+
   |                                                               |
   |                          options (variable)                   |
   +---------------------------------------------------------------+

目前还不是很适应RFC这种数据包格式的表示方法,由于不是纯开发人员,所以还是从wireshark这样简单的排序好看些,如下(摘抄一个DHCP Discover的数据包)

DHCP1:数据包格式1_第1张图片

首先第一个字段是Message type(协议中为op,即operation),可以看到type的定义还是来自于Bootstrap Protocol (BOOTP),而且该字段比较单一,只有request和reply两种属性,当为1时,其为request,当为0时,其为reply。

第二第三字段为描述链路属性的,即是ethernet还是其他介质的网络,其中hardware type是用来描述链路属性,若为0x01即为etherent,hardware address length则标识其链路标识符的长度,若二层即为MAC地址的长度,即6个字节。

第四个字段hops标识经过的中继的跳数,即报文经过的DHCP中继的数目,一共8位,(在《深入理解计算机网络》中,所述当DHCP请求经过一个中继时,该字段就会增加1,起始从0开始,不过在协议中,貌似没有强调DHCP请求这个部分,所以反馈的时候会不会增加1,还没做实验确认)。

第五个字段transactions ID,首先该字段所填为随机数,用来作为会话标识的,在协议中标识为xid,该随机数是由client所选择的,用于server和client之间交互报文的匹配。

第六个字段seconds elapsed,其描述为client开始获得地址或地址续借后,所经过的描述,该字段是由client进行填充的。

第七个字段是标识字段,该字段也是从Bootp所继承的,其中只有最高位有作用,第一位为广播应答标识位,用来标识DHCP的应答式用单播还是广播的形式进行反馈,若置0,则是单播,若置1,则为广播。

第八个字段即为client IP address,协议中描述为Ciaddr,对应资料所述,该位指示为DHCP客户端的IP地址,占32位。仅在DHCP服务器发送的ACK报文中显示(另外的资料上写为只有Client是BOUND、RENEW、REBINDING状态,并且能响应ARP requests时,才能被填充。),在其他报文中均显示位0,因为客户端初始是没有地址的。

第九个字段为Your(client) IP address,在协议中描述为yiaddr,为DHCP服务器分给客户端的IP地址,共32位,仅在DHCP server的offer和ack报文中显示,其他显示为0.

第十个字段为Next server IP address,实际上在wireshark下面这个名字有些怪异(不过按协议中的确是这样标识的,有下一个这个含义,不过有关下一个目前理解不深),在omnipeek中,这个就是server IP address,在协议中siaddr指示下一个为DHCP客户端分配IP地址等信息的服务器IP地址,仅在DHCP OFFER,ACK报文中显示,其他报文显示为0。

第十一个字段为Relay agent IP address,在《深入理解计算机网络》,其被定义为DHCP客户端发送request后,经过的第一个DHCP中继的IP地址,占32位,这里有强调了下第一个DHCP中继的地址,这里还不确定。若没有中继,该位为0。

第十二位字为Client Mac address,可以到其下面仅接着的为padding,填充了10位。该字段设计觉得是比较奇怪的,按协议中,这里是描述节点唯一标识的,不过设置为16位的字段,我们所知MAC地址都是6位的,一开始觉得这个是不是按照GUID的思路进行设计的,不过貌似协议中所述不是,如下

“Use of 'chaddr' as the client's unique identifier may cause unexpected results, as that identifier may be associated with a hardware interface that could be moved to a new client.  Some sites may choose to use a manufacturer's serial number as the 'client identifier', to avoid unexpected changes in a clients network address due to transfer of hardware interfaces among computers.  Sites may also choose to use a DNS name as the 'client identifier', causing address leases to be associated with the DNS name rather than a specific hardware box.”,在这段描述中,不仅仅可以用MAC地址,也可以序列号,或者DNS name这些充当这个'client identifier'的角色,所以这里的设置是16位,而不是默认的6位MAC地址长度。

你可能感兴趣的:(DHCP1:数据包格式1)