恩,dhcp 那些不为人知的秘密?

各位同学,老师昨天给大家介绍了DHCP 协议的报文格式和DHCP的 工作流程。 想必大家对这个协议应该有一个清楚的认识了。
那么今天我们通过数据抓包,再次详细分析下DHCP协议在地址分配过程中协议报文的封装过程。
在正式开始这个过程之前,我们还是有必要对昨天的的内容做一个回忆。
好的,我们先看下DHCP 报文的格式,请看下图:
OP:操作码 (1=bootrequest ,2=bootreply)
Htype: 硬件地址类型 (1=10mb ethernet)
Hlen: 硬件地址长度 (ethernet 为10)
Hops:表示当前的DHCP报文经过的DHCP Relay的数目。该字段由客户端设置为0,每经过一个DHCP Relay时,该字段加1。此字段的作用是限制DHCP报文所经过的DHCP中继数目。服务器和客户端之间的DHCP中继不能超过4次,也就是Hops值不能大于4,否则DHCP报文将被丢弃。
Xid: 传输ID,在同服务器的交互中,由客户机所选择
Secs: 客户机所使用的地址,在最近一次地址获取/地址更新后所经过的时间
Flags:此字段在BOOTP中保留未用,在DHCP中表示标志字段。只有标志字段的最高位才有意义,其余的位均被置为0。最左边的字段被解释为广播响应标志位,内容如下所示:
0:客户端请求服务器以单播形式发送响应报文
1:客户端请求服务器以广播形式发送响应报文
Client IP address: 客户机在BOUND,RENEW或REBINDING状态所使用,可以用来回应ARP请求报文
Client IP Address :该字段表示客户端的IP地址。可以是服务器分配给客户端的IP地址或者客户端已有的IP地址。客户端在初始化状态时没有IP地址,此字段为0.0.0.0。IP地址0.0.0.0仅在采用DHCP方式的系统启动时允许本主机利用它进行临时的通信,并且永远不是有效目的地址。
Your IP address: 服务器给客户机分配的IP地址。
Server IP address:该字段表示服务器IP地址。
Gateway IP address:该字段表示第一个DHCP中继的IP地址。当客户端发出DHCP请求时,如果服务器和客户端不在同一个网络中,那么第一个DHCP中继在转发这个DHCP请求报文时会把自己的IP地址填入此字段。服务器会根据此字段来判断出网段地址,从而选择为用户分配地址的地址池。服务器还会根据此地址将响应报文发送给此DHCP中继,再由DHCP中继将此报文转发给客户端。若在到达DHCP服务器前经过了不止一个DHCP中继,那么第一个DHCP中继后的中继不会改变此字段,只是把Hops的数目加1。
Client hardware address: 该字段表示客户端的MAC地址,此字段与前面的“Hardware Type”和“Hardware Length”保持一致。当客户端发出DHCP请求时,将自己的硬件地址填入此字段。对于以太网,当“Hardware Type”和“Hardware Length”分别为“1”和“6”时,此字段必须填入6字节的以太网MAC地址。
Server name:该字段表示客户端获取配置信息的服务器名字。此字段由DHCP Server填写,是可选的。如果填写,必须是一个以0结尾的字符串。 缺省为空。
File: 启动文件的名字,在DHCPOFFER报文中给出全名。
Options:该字段表示DHCP的选项字段,至少为312字节。DHCP通过此字段包含了服务器分配给终端的配置信息,如网关IP地址,DNS服务器的IP地址,客户端可以使用IP地址的有效租期等信息。
Ok,下来呢,老师通过搭建一个小的拓扑,来给大家分析下,DHCP 报文在交互过程中具体的封装方式。 下图就是本次试验的拓扑,大家可以参考。
这个配置呢比较简单,老师在这里就不去详细说了。 为了得到完整的报文交互过程,设备启动后,我们在DHCP-SERVER 的接口GE0/0/0 上打开wireshark。 然后对DHCP-SERVER 进行配置。
配置完成后,主机地址获取方式我们设置为DHCP,然后在CMD 窗口我们键入ipconfig。这个时候我们就可以在wireshark 上看到DHCP 报文的交互过程了。
我们可以看到,刚开始的主机没有地址,也不知道网络中DHCP 服务器是谁,所以主机发送了一个DHCP DISCOVER 报文,这个DISCOVER 报文源地址是0.0.0.0(我没有地址),目的地址是一个广播地址(共享网络内的所有设备),它是用来寻找网络中的DHCP服务器的。
下图就是discover的封装格式大家可以清楚看到各种地址的填充内容。
当网络中的DHCP服务器收到DISCOVER 的时候,他就按耐不住了,就会进行响应,怎么响应呢? 给主机发个OFFER(好,你被录用了)。
下图是OFFER报文的格式,我们可以看到 DHCP server 给主机 分配的一个地址并且在your ip address 字段进行了填充。

并在option 字段里包含了 掩码信息,网关地址和自身的地址信息。
当主机收到OFFER 后,主机一看,这个适合我啊,好了,就是这个地址了,主机就会发送REQUEST 去请求这个地址,请看request 的格式

通过这四种报文的交互,主机就获取到了一个地址。(我有地址了,想上网上网,想玩游戏玩游戏,有地址就是任性)
来。我们在看下报文的交互流程图。 看见了没有,在下面:

Ok,老师就是抛砖引玉,想告诉大家,在学习过程中。要去详细,清楚的理解报文交互过程,我们可以设计一个简单的网络,通过数据抓包就能够做到,对大家学习会很有帮助,对大家理解这些协议会有好处。 有点啰嗦了,好了今天的分享就这么结束了,欢迎大家,拍砖。 对了想到一个问题,我们刚抓包的时候抓到了一个叫做gratuitous arp 的报文,它有什么作用呢? 哈哈,仔细想想啊,你肯定知道。
