主机通常使用DHCP获得IP地址、子网掩码、路由器的IP地址、DNS服务器的IP地址以及其他配置信息,这些信息也是 一个系统能够在互联网上运行并提供常用服务的基本要素。
Wireshark抓包:
当前网络状态:联网
由于DHCP在主机连接网络,请求分配配置信息时才会使用,所以要先断开网络,在连接网络时抓包可以看见DHCP请求分配信息的数据包。
cmd下:ipconfg /realse 断开连接
此时也可以看到DHCP的数据包。
过滤协议是:bootp(Wireshark过滤dhcpv4时要使用dhcp), bootp(Internet 引导程序协议)是DHCPv4的前身。
由包可以看出来,这个数据包是由本机发给DHCP服务器的, DHCP Relase表示在租约到期前释放这个IP地址,确实是没有到期,就手动释放了。
下面看详细数据包信息:
可以看出:
1、DHCP是基于UDP的应用层协议。
2、客户端使用端口68,DHCP服务器使用端口67
3、Bootp flags:0x0000(unicast) 表示这是一个单播消息
4、Release 表示在租约到期前就释放了IP
(DHCP是对BOOTP的扩展,所以在DHCP字段中嵌入了BOOTP的字段)
数据包的详细信息在下面讲:
现在还是断网的,开启Wireshark抓包,然后连接网络。因为DHCP是在连接网络时传输的数据包。
查看数据包:
DHCP 四次数据交换:
先看第一个包:
Discover包:
源地址:0.0.0.0 , 因为我们就是要使用DHCP获取IP等配置信息,此时我们的主机是没有IP地址的。
目的地址:255.255.255.255 广播地址,因为Discover包的作用就是在广播域中找DHCP服务器,他并不知道谁是DHCP服务器,所以发送广播,让可以提供IP等信息的DHCP作应答。
黑框中信息,由于主机此时没有IP等相关信息(正在请求),所以全部为0。
Offer包:
其中一台DHCP服务器响应Discover包,发送了一个Offer包,可以看到Your IP address字段是这个服务器为主机提供的IP地址。
但是这个包好像是个单播包,而不是广播包(红箭头),按理说服务器发这个包的时候,客户机还没有IP,更不能直接在目的地址字段填上(还没有使用的)这个分配IP,原因不知道还。。。
DHCP除了IP外,还提供了其他配置信息:
后面两个包的各字段跟上面是一样的,就不说了。
Request包:向选择的服务器确认配置(广播:意味着其他DHCP服务器也会接收到这个消息,但只有Request包中标识的服务器同意将分配的IP进行绑定)
Ack包:
服务器完成绑定后,回复一个Ack,通知客户机现在可以使用这个IP
如果服务器无法分配这个IP,比如已经通过其他方式分配了或无法使用,这时会回复DHCPNAK消息。
当客户机接收到ACK后,可以执行ACD(ipv4重复地址检测),以检测该地址是否已被使用,如果被使用,就发送DHCPDECLINE消息给服务器,通知这个地址不能使用。
如果在租约到期前放弃该地址,发送Release(见文章开头)
如果客户机已有一个IP地址,仅希望更新租约,可以路过Discover/Offer消息,而且使用DHCPINFORM代替Request消息,表示自己使用现有的地址但是要获得额外信息(DNS,路由器....)
有时发现只有两个数据包:Request和Ack, 这是正常的。
如果客户机知道他想获得的地址,DHCP的协议可以简化为仅使用Request和Ack消息。
比如刚刚断开连接,就连接到网络。
Request IP Address为想要的IP地址,此时主机知道自己想要请求的IP,所以可以直接广播发送Request包。
如果网络前缀发生变化会产生NAK消息(从家到学校),比如客户机想要请求自己的原地址192.168.1.5,但是此时的网络前缀为10.x.x.x。
那么直接在发送Request包时,就会收到NAK消息,因为在10.x.x.x这个子网中无法分配192.168.1.5这个IP。