Wireshark数据抓包分析之动态主机配置协议

本文详细介绍了DHCP动态主机配置协议的工作原理、作用及流程,并通过Wireshark进行实验,展示了如何在Windows和Linux平台上获取DHCP数据包,以及分析DHCP Discover、Offer、Request和Ack四种报文的步骤,旨在帮助读者理解DHCP协议并掌握Wireshark的基本操作。

预备知识

什么是DHCP

DHCP(Dynamic Host Configuration Procotol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作。DHCP的前身是BOOTP,属于TCP/IP的应用层协议。DHCP有3个端口,其中UDP67和UDP68为正常的DHCP服务端口,分别作为DHCP Server和DHCP Client的服务端口;546端口用于GHCP v6 Client,而不用于DHCPv4,是为DHCP failover服务。该服务是需要特别开启的服务,用来做双机热备的。

DHCP的作用

DHCP为互联网上主机提供地址和配置参数。DHCP是基于Client/Server工作模式,DHCP服务为主机分配IP地址和提供主机配置参数。DHCP主要作用如下所示:
(1)保证任何IP地址在同一时刻只能由一台DHCP客户机使用。
(2)DHCP可以给用户分配永久固定的IP地址。
(3)DHCP允许用其他方法获得IP地址的主机共存,如手动配置IP地址的主机。
(4)DHCP服务器向现有的BOOTP客户端提供服务。
DHCP有3种分配IP地址方式,分别是自动分配、动态分配和手工配置。它们的区别如下:
自动分配(Automatic Allocation):DHCP给客户端分配永久性的IP地址。
动态分配(Dynamic Allocation):DHCP给客户端分配的IP地址过一段时间后会过期,或者客户端可以主动释放该地址。
手动配置(Manual Allocation):由用户手动为客户端指定IP地址。

DHCP工作流程

使用DHCP时,网络上首先必须有一台DHCP服务器,而其他计算机则是DHCP客户端。当DHCP客户端程序发出一个消息,要求一个动态IP地址时,DHCP服务器将根据目前配置的IP地址池,从中提供一个可供使用的IP地址和子网掩码给客户端。下面将介绍下DHCP的工作流程。
DHCP工作流程如下图:
在这里插入图片描述
从上图中,可以看出DHCP的工作过程分为4个阶段。分别表示发现阶段(DHCP Discover)、提供阶段(DHCP Offer)、选择阶段(DHCP Request)和确认阶段(DHCP Ack)。下面详细介绍这四个阶段:
(1)发现阶段,即DHCP客户端寻找DHCP服务器的阶段。DHCP客户端以广播方式(因为客户端不知道DHCP服务器的IP地址)发送DHCP Discover包,来寻找DHCP服务器,即向地址255.255.255.255发送特定的广播信息。网络上每一台安装了TCP/IP协议的主机都会接收到该广播信息,但只有DHCP服务器才会做出响应,如下:
在这里插入图片描述
上图表示本局域网中有3台DHCP服务器,都收到了客户端发送的DHCP Discover包。接下来就是服务器响应客户端了,即提供阶段。
(2)提供阶段,即DHCP服务器提供IP地址的阶段。在网络中收到DHCP Discover包的DHCP服务器,都会做出响应。这些DHCP服务器从尚未出租的IP地址中挑选一个给客户端,向客户端发送一个包含IP地址和其他设置的DHCP Offer包,如下图。
下面图中,局域网中的3个DHCP服务器都向客户端发送了DHCP Offer包。但是客户端只能接收一个服务器提供的信息,所以需要选择要接收的数据包信息。
在这里插入图片描述
(3)选择阶段,即DHCP客户机选择某台DHCP服务器提供的IP地址阶段。从上面图中可以看到,3台DHCP服务器都向客户端发送了DHCP Offer包。此时,DHCP客户机只接收第一个收到的DHCP Offer包。然后,以广播方式回答一个DHCP Request请求信息,该信息中包含向它所选定的DHCP服务器请求的IP地址的内容。这里使用广播方式回答,就是通知所有的DHCP服务器,它选择了某台DHCP服务器所提供的IP地址,如下图:
在这里插入图片描述
这时候,局域网中的所有DHCP服务器,都会收到DHCP客户端发送的DHCP Request信息。通过查看包信息,可以确定客户端是否选择了自己提供的IP地址。如果选择的是自己的,则发送一个确认包。否则,不进行响应。
(4)确认阶段,即DHCP服务器确认所提供的IP地址阶段。当DHCP服务器收到客户端发送的DHCP Request请求信息之后,便向DHCP客户端发送一个包含它提供的IP地址和其他设置的DHCP Ack信息,告诉DHCP客户端可以使用它所提供的IP地址,如下图。然后DHCP客户端将其TCP/IP协议与网卡绑定。另外,除了客户端选择的DHCP服务器外,其他的DHCP服务器都将收回曾提供的IP地址。
在这里插入图片描述
从上图中,也可以看出,只有一台DHCP服务器向客户端发送了DHCP Ack包。表示客户端选择了该服务器提供的IP地址及其他配置信息。

实验目的

1)熟悉并掌握Wireshark的基本操作。
2)加深对常用网络协议的理解,提高就业机会。
3)培养学生理论联系实践的研究兴趣。

实验环境

在这里插入图片描述
测试者:windows系统,IP地址:随机。
实验中,我们使用一台PC机器和路由器,即可产生DHCP数据包。现在的路由器都自带了DHCP功能,这样可以通过直接连接路由器来获取DHCP包。

实验步骤一

获取DHCP数据包

1.在windows平台上获取DHCP数据包

在windows平台上,可以使用两种简单的方法实现,其原理一样。
(1)在cmd上,使用ipconfig命令来获取。
在这里插入图片描述
执行完上述命令后,将释放当前使用的地址信息。重新获取地址信息,执行命令如下:
在这里插入图片描述
执行完上面的命令后,将重新获取地址信息。在获取地址时,将会经过上面讲述的DHCP的4个阶段。这样,我们就能获取到DHCP数据包了。
(2)通过禁用和启用网卡获取DHCP数据包:
在windows平台上,也可以通过禁用和启用网卡获取DHCP数据包。其中,禁用网卡,相当于上面的“ipconfig /release”命令,启用网卡相当于上面的“ipconfig /renew”命令。禁用和启动网卡属于操作系统基本操作,这里就不解释了。

2.在Linux平台上获取DHCP数据包

在linux下,可以通过使用ifdown和ifup命令来重新启动网卡。命令如下:

ifdown eth0          #禁用网卡
ifup eth0            #启用网卡

实验环境,没有涉及linux系统,这里就简单介绍下了。

实验步骤二

分析DHCP数据包

分析之前,我们先来学习下DHCP报文格式:

1.DHCP报文格式

在DHCP获取IP地址及其他网络配置参数的过程中,DHCP客户端和服务器之间要交换很多的消息报文,这些DHCP报文共有8种类型。每种报文的格式相同,只是某些字段的取值不同。DHCP报文格式如下:
DHCP报文格式:
在这里插入图片描述
各字段解释如下:
op:报文的操作类型。分为请求报文和响应报文,1是请求报文,2是响应报文。具体的报文类型在option字段中标识。
htype:DHCP客户端的硬件地址类型。1表示ethernet地址。
hlen:DHCP客户端的硬件地址长度。ethernet为6。
hops:DHCP报文经过的DHCP中继的数据。初始化为0,报文每经过一个DHCP中继,该字段就会增加1。
xid:客户端发起一次请求时选择的随机数,用来标识一次地址请求过程。
secs:DHCP客户端开始DHCP请求后所经过的时间,目前尚未使用,固定其0。
flags:DHCP服务器响应报文是采用单播还是广播方式发送。只使用第0比特位,0表示采用单播方式,1表示使用广播方式,其他比特保留不用。
ciaddr:DHCP客户端的IP地址。
yiaddr:DHCP服务器分配给客户端的IP地址。
siaddr:DHCP客户端获取IP地址等信息的服务器IP地址。
giaddr:DHCP客户端发出请求报文后经过的第一个DHCP中继的IP地址。
chaddr:DHCP客户端的硬件地址。
sname:DHCP客户端获取IP地址等信息的服务器名称。
file:DHCP服务器为DHCP客户端指定的启动配置文件名称及路径信息。
option:可选变长选项字段,包括报文的类型、有效租期、DNS服务器的IP地址和WINS服务器的IP地址等配置信息。
需要注意的是,上表DHCP报文格式中,每一个字段后的数字表示该字段在报文中占用的字节数。其中,option字段的长度要根据服务器所提供参数的多少而定,是可变的。

### 使用 Wireshark 进行 UDP 协议的数据抓包分析 #### 工具准备 Wireshark 是一款功能强大的网络协议分析工具,能够捕获并显示网络中的数据包详情。为了进行 UDP 数据抓包分析,需确保已安装最新版本的 Wireshark 并具备管理员权限以启动抓包操作。 #### 配置环境 在配置环境中,需要指定目标 IP 地址以及端口号来过滤特定流量。例如,在案例中提到的场景里,客户端地址为 `10.1.1.142`,服务器地址为 `10.1.1.33`[^1]。通过设置过滤器可以专注于观察这些设备之间的通信过程。 #### 设置捕捉条件 打开 Wireshark 后选择对应的网络接口开始捕捉数据流。对于上述例子中的情况,可以在界面底部输入栏键入如下表达式作为初始筛选条件: ```bash ip.addr==10.1.1.142 || ip.addr==10.1.1.33 && udp ``` 此命令会限定仅展示涉及两个IP间基于UDP协议交互的信息条目[^2]。 #### 查看具体信息 当成功获取到相关联的数据帧之后(如文中提及的第190号及51号),可以通过双击每一条记录深入探究其内部结构。重点注意以下几个方面: - **源/目的端口**: 显示当前连接所使用的实际端点编号; - **长度字段**: 表明该消息的实际大小; - **校验和验证状态**: 判断是否存在潜在错误发生可能; 另外值得注意的是DNS查询响应通常也会利用UDP来进行快速交换,并且一般情况下请求方会选择临时分配的一个高数值范围内的端口号发起呼叫而回应则固定采用标准定义下的53端口完成回复动作[^3]。 #### 分析常见问题 由于缺乏内在机制保障每次尝试都能顺利完成整个事务流程,所以在运用UDP执行任务期间难免遇到诸如丢包率过高或者顺序错乱等情况的发生。此时就需要依赖上层应用层面额外设计补偿策略加以弥补不足之处。 ```python import socket def send_udp_message(message, server_address): client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) try: sent_bytes = client_socket.sendto(message.encode(), server_address) data, _ = client_socket.recvfrom(4096) return data.decode() finally: client_socket.close() if __name__ == "__main__": result = send_udp_message("hello", ("10.1.1.33", 80)) print(result) ``` 以上脚本演示了怎样构建简单的Python程序向远程主机发送一段字符串并通过监听返回值得知对方反馈状况。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值