一是很多时候IP都是设置成通过dhcp动态获取的,但一直不太清楚dhcp的具体交互过程;二是加上前几天有同事问知不知道DHCP具体交互过程;三是这两天正好在分析协议。所以就顺道来看一下。
如果对wireshark不太熟悉,可参考"wireshark捕获/显示过滤器表达式书写规律说明"。
【客户端小C(RELEASE):S1老哥,你给我的x.x.x.x这个IP我不用了哦。】
客户端小C(DISCOVERY):谁给我个IP啊?
服务器S1(OFFER):y.y.y.y,拿去用吧。
【服务器S2(OFFER):z.z.z.z,拿去用吧。】
客户端小C(REQUEST):y.y.y.y,那我就用这个了哦。
服务器S1(ACKNOWLEDGE):用吧,不过x小时后我就自就回收了,如果你要继续用在剩y小时的时候你要跟我说一声。
客户端小C(INFORM):ok,那我就用了。你我只要注意你刚才说的就行了对吧。
服务器S1(ACKNOWLEDGE):对滴。
dhcp使用udp进行通信,一般来说客户端通过68端口发出,服务端在67端口监听。
整个dhcp获取ip的过程包括以下六步:DISCOVERY、OFFER、REQUEST、ACKNOWLEDGE、INFORM、再次ACKNOWLEDGE。具体实现时可能没有后两步。
在数据包格式上各请求和响应都大同小异,主要是Option字段多些少些的区别。
以windows操作为例。
第一步,打开控制面板--网络和 Internet--网络和共享中心-xx连接x--属性--Internet 协议版本4(TCP/IP 4)--属性,把自己网卡设置成自动获得IP地址。
第二步,打开wireshark对网卡进行抓包。
第三步,使用以下命令释放已获取到的IP地址,然后重新申请IP地址。
# 释放当前已获取IP地址。执行此命令主机会向之前分配IP的DHCP服务器发送RELEASE请求
ipconfig /release
# 获取IP地址。执行此命令会完成dhcp申请过程
ipconfig /renew
第四步,在wireshark过滤器中输入bootp即可过滤出dhcp过程。如下图所示可见整个过程与上两小节描述的一致
不同操作系统对dhcp客户端的实现可能有些差别,比如下边是海思一块板子的dhcp过程。请求会发三遍,然后没有INFORM。