最近公司设备增加了个添加静态arp的新功能,测试的时候发现了DHCP和arp的有趣的现象。简单的测试环境,用H3C5500作为DHCP server,笔记本作为客户端。H3C做server时DHCP OFFER和ACK报文都是单播回复的,如果用tftpd32那个软件做server则回复报文是广播。交换机配置如下:
[H3C]int vlan 38
[H3C-Vlan-interface38]ip add 192.168.50.1 255.255.255.0
[H3C-Vlan-interface38]un sh
Interface Vlan-interface 38 is not shut down
[H3C]dhcpserver ip-pool lab
[H3C-dhcp-pool-lab]network 192.168.50.0 24
[H3C-dhcp-pool-lab]dns-list 202.102.24.35
[H3C-dhcp-pool-lab]gateway-list 192.168.50.1
[H3C-dhcp-pool-lab]expired day 0 hour 0 minute 1
[H3C-dhcp-pool-lab]qu
[H3C]dhcp server forbidden-ip 192.168.50.1
[H3C]intvlan 38
[H3C-Vlan-interface38]dhcp select server global-pool
配置完成后笔记本获取到地址192.168.50.2,查看交换机的arp表
[H3C]dis arp
Type: S-Static D-Dynamic
IPAddress MAC Address VLAN ID Interface Aging Type
172.0.37.254 000f-e2d4-9dc0 70 GE1/0/5 20 D
192.168.50.2 0025-b363-1735 38 GE1/0/8 18 D
可以看到交换机学习到了笔记本的mac和ip的对应关系。笔记本无线网卡mac为0025-b363-1735
此时添加一条静态arp,IP地址设置为192.168.50.2,mac为0025-b363-1736
[H3C]arp static 192.168.50.2 0025-b363-1736 38 gig 1/0/8
[H3C]dis arp
Type: S-Static D-Dynamic
IPAddress MAC Address VLAN ID Interface Aging Type
192.168.50.2 0025-b363-1736 38 GE1/0/8 N/A S
添加成功后,笔记本执行ipconfig /release ipconfig/renew 重新获取地址,通过wireshark抓包发现如下现象:
1client广播发送dhcp discovery
2 DHCP server单播回复offer,server给client分的地址是192.168.50.2
3 client广播发request
4 server单播回ACK
发现上面4个步骤中,server给client回报文的目的mac地址都是根据client发过来报文的源mac地址,在client发续租报文时发现以下现象
5 client单播发dhcp request续租报文
6 server回复,此时发现server回复的时候会查arp表,根据IP地址来选择mac地址,组包。所以目的mac变成了0025-b363-1736
7 client当然收不到此报文,所以继续发续租包,直到租约到期,重新开始DHCP获取地址的过程
发现此现象后想了想,为什么2个阶段,server回复报文的mac地址不一样,为什么第一阶段不会查询arp表。发现开始阶段的request报文没有源IP地址(0.0.0.0)而续租阶段确定了源地址(192.168.50.2),没有源地址的话就直接按照上个报文的源mac作为目的mac组包回复,有地址的话就查询arp表,找对应的mac组包回过去。
这只是个人理解,大家有什么不同意见请一起讨论。