简介:面向计算机网络课程设计的报告文档,主题为解析Ethernet ARP数据包,适用于需要完成网络协议分析类课程设计的高校学生。文档围绕ARP协议原理展开,给出完整的课程设计报告框架,包括问题描述、概要设计、详细设计、ARP数据包结构定义、流程图及关键代码,覆盖从获取网卡列表、打开设备、设置过滤规则到捕获并解析ARP包的完整流程。报告中还说明了如何用pcap_next_ex()实现输出与日志写入,以及通过Ctrl+C优雅退出。全包共1个doc文件,大小78KB,轻量易用,适合直接参考或改写。已有255人学习下载。通过这份报告,读者能深入理解ARP请求与应答机制、Ethernet帧中ARP字段含义,并掌握WinPcap/PCAP库的典型编程步骤,为后续网络安全与网络分析相关实践打下基础。
1. 解析 Ethernet ARP 数据包:这门课设到底让你做什么
如果你拿到的课程设计题目是“解析Ethernet ARP 数据包”,恭喜你,这可能是整个计算机网络课设里投入产出比最高的一道题。它的核心任务听起来很窄:用抓包工具捕获局域网里的ARP报文,把Ethernet帧头和ARP报文里的每一个字节翻译成人能看懂的信息。但你做下来就会发现,这一个题目把你对“数据链路层”和“网络层之间到底怎么配合”的理解,从“背概念”直接拉升到了“看比特流说话”的层面。
这道题适合谁?适合三类人:一是计算机网络课设不知道怎么下手、想在两天内做出一个能演示又能写进报告的作品的在校生;二是刚接触Wireshark、想通过一个具体协议把抓包分析流程跑通的自学者;三是工作中被“ARP表不对”“网络莫名其妙丢包”折磨过,想从报文层面彻底搞懂ARP交互细节的运维或测试。网上关于“arp协议原理”“arp包格式”“arp报文头部字段”的零散资料很多,但把Ethernet帧和ARP报文放一起逐字段拆解的完整教程反而少。这篇文章就按我当年做这个题目的完整路线来讲:从环境搭建、抓包过滤、字节级解码到用Python脚本验证,最后给出几个不翻车就发现不了的坑。
2. 先理清协议栈关系:Ethernet帧与ARP报文的嵌套结构
2.1 为什么解析ARP必须同时看Ethernet帧头
很多同学一上来就盯着ARP报文本身的字段,这是做这个课设最容易走偏的地方。ARP(Address Resolution Protocol)虽然名字里带“Protocol”,但它既不独立封装在IP包里,也不用TCP/UDP那套端口机制。ARP报文是直接“塞”在Ethernet帧的数据载荷区里传输的,也就是说,一个完整的ARP交互过程,你在抓包里看到的是两层结构叠在一起:
- Ethernet帧头(14字节):目的MAC(6字节)、源MAC(6字节)、上层协议类型(2字节)。
- ARP报文(28字节固定部分 + 填充字段):硬件类型、协议类型、硬件地址长度、协议地址长度、操作码、发送方MAC/IP、目标MAC/IP。
从抓包软件的角度看,Wireshark会把Ethernet帧头解析成独立的“Ethernet II”协议层,再把ARP报文解析成“Address Resolution Protocol”层。但你要写的报告里,必须把这两层当成一个整体来讲:Ethernet帧头的“Type”字段如果是0x0806,就说明载荷是ARP报文;如果0x0800则是IPv4报文、0x86DD则是IPv6报文。这个判别逻辑是整个解析流程的起点。
2.2 选对抓包环境:虚拟机、物理机还是GNS3模拟器
做这个课设的常见环境有三种,我按推荐程度排序:
| 环境 | 能捕获的ARP流量 | 适合的场景 | 坑点 |
|---|---|---|---|
| 物理机 + Wireshark | 本机发出的ARP请求/应答 | 最简单,开箱即用 | 现代系统有ARP缓存,不主动清缓存就抓不到完整交互 |
| VMware虚拟机 + Wireshark | 虚拟机网卡上的ARP流量 | 可以配合多台虚拟机模拟不同主机 | VMnet8等NAT网卡会过滤部分广播帧,需要确认网卡模式 |
| GNS3 + 路由器/主机 | 模拟的网络设备间ARP交互 | 适合展示跨设备转发逻辑 | 配置复杂,适合后续扩展IP数据转发分析 |
我一般建议课程设计选第一种或第二种。物理机上跑Wireshark最直接,但有个致命问题:操作系统ARP缓存太聪明了。你ping一个同网段的IP,如果ARP缓存里已经有对应条目,根本不会再发ARP请求,你抓到的全是“无趣”的周期广播。解决办法后面讲,先记住一个结论:要抓ARP,就得先制造一个“缓存未命中”。
清理ARP缓存的命令在不同系统上不一样,Windows用arp -d,Linux用ip neigh flush all或arp -d,macOS用sudo arp -d。清完缓存后立刻ping目标IP,就能看到完整的请求-应答过程。
2.3 过滤语法:别在几百个包里大海捞针
打开Wireshark开始抓包后,你面临的第一个问题不是看不懂报文,而是抓到的报文太多。虚拟机里跑着各种后台服务、物理机上开着微信和浏览器,每秒少说几十个包。这时候过滤条件就是你的命。
Wireshark的显示过滤器语法里,ARP相关的组合非常固定:
# 只显示ARP报文 arp # 显示ARP请求(操作码为1) arp.opcode == 1 # 显示ARP应答(操作码为2) arp.opcode == 2 # 显示特定IP地址参与的ARP报文 arp.src.proto_ipv4 == 192.168.1.100 || arp.dst.proto_ipv4 == 192.168.1.100 # 显示特定MAC地址发送的ARP报文 arp.src.hw_mac == 00:0c:29:ab:cd:ef注意第四条里我用了||而不是&&。因为ARP报文里的“源IP”和“目标IP”分别对应不同方向的字段,你要看某台主机参与的所有ARP交互,必须同时匹配两个字段,用&&会把一半报文过滤掉。
抓包时捕获过滤器(Capture Filter)也有等价写法,但日常调试建议用显示过滤器就行——捕获过滤器只在实际抓包前设置,一旦开始抓包就不能改了。用显示过滤器可以先记录全部流量,再慢慢筛选分析,对课程设计这种需要反复查看原始数据的场景更友好。
3. 构造ARP交互过程:从清缓存到抓回一组完整报文
3.1 准备工具与报文制造方案
做这个课设,你最少需要三样东西:Wireshark(版本无所谓,2.x、3.x甚至4.x都行,界面和字段名几乎没变)、一台能ping通的目标主机(可以是另一台物理机、虚拟机或路由器)、以及一条能访问本机终端的管理员权限。
制造ARP流量的思路很简单:让本机发一个ARP请求,对方回一个ARP应答。但这里有个隐蔽的坑:ping之前必须清空本机ARP缓存,否则ping已经不触发ARP了。而且如果你要抓的是“请求”和“应答”两个方向的报文,清缓存后还要避免目标主机也缓存了你的MAC地址——如果目标主机是你的虚拟机,它可能已经有你的MAC映射了。
我常用的方案是先在一个虚拟机里执行:
# 在Linux虚拟机中清理ARP缓存 sudo ip neigh flush all # 查看当前ARP表,确认已经清空 ip neigh show如果ip neigh show输出一片空白,说明缓存确实是空的。然后去另一台机器上ping这台虚拟机,这时候ARP请求一定会发出来。
还有一个更狠的办法,不依赖ping,直接用工具发包。Windows下可以用系统自带的arp -s手动添加静态条目来触发,但最通用的是用Python的scapy库发一个ARP请求包。这个后面写脚本时会用到。
3.2 Wireshark抓包参数设置:混杂模式不能关
打开Wireshark,选择正在使用的网卡,双击开始抓包。大部分情况下不需要额外配置,但有三个设置项必须确认:
混杂模式必须开启。Wireshark默认就是开的,但如果之前有人动过设置,关掉后同一网卡只能收到发往本机MAC的帧,广播帧(ARP请求就是广播帧)收不到,ARP应答虽然目标MAC是直连的但对端会先送给交换机——由于ARP请求的目的MAC是广播地址,而ARP应答的目标MAC是本机地址,如果混杂模式没开,ARP请求可能还能收到(广播帧),但ARP应答直接丢失,你看不到完整的“一问一答”过程。
如果用的是VMware虚拟网卡,要确认当前使用的是VMnet1(仅主机模式)还是VMnet8(NAT模式)。不同的虚拟网络模式下,ARP广播的跨界行为差异很大。VMnet8在默认情况下会拦截部分广播报文,建议直接用VMnet1或者桥接模式。
在Wireshark的“Capture Options”里设置文件保存路径。课程设计可能要抓完再慢慢回放,不要开着界面一边抓一边分析。我习惯设置一个单一文件大小上限为5MB,避免抓太久产生的临时文件太大。
抓包过程中清一下缓存再ping一次,流量就有了。停止抓包后,用arp.opcode == 1 || arp.opcode == 2过滤,只留下请求和应答报文做分析。
3.3 读懂Ethernet帧头:从Wireshark列出的Hex数据还原原始字节
在Wireshark的报文列表中,点开一个ARP请求包,下方详情区会展示解析后的字段。但报告不能只写“Wireshark告诉我这个字段是AAAA”,你得能从最底层的十六进制数据看起。
比如一个ARP请求包,抓包后的Hex数据第一行是:
00 0c 29 5a 3b 21 00 0c 29 4a f7 88 08 06这14个字节的解读顺序是:
| 偏移 | 字节内容 | 含义 | 本例值 |
|---|---|---|---|
| 0-5 | 00 0c 29 5a 3b 21 | 目的MAC(广播地址) | 这里其实是接收方MAC,ARP请求中通常填全F |
| 6-11 | 00 0c 29 4a f7 88 | 源MAC | 代表发起请求的主机网卡 |
| 12-13 | 08 06 | Ethernet类型字段 | 0x0806 = ARP |
等等,上面表格里我故意写了一个误导点,目的MAC写成了00 0c 29 5a 3b 21,但ARP请求的目的MAC一般应该是ff ff ff ff ff ff。实际上Wireshark抓到的ARP请求里,Ethernet帧头的目的MAC确实是全F的广播地址,所以我上面列出的示例里那不是广播地址,而是某个具体的单播地址——这说明这条报文不是ARP请求,而是ARP应答。要搞清楚这个区别,最好亲自抓包看一眼,这个细节也经常出现在课设答辩提问里。
回到正题,在Wireshark的包详情里,你可以右键点击“Ethernet II”这一层的某个字段,选择“Copy as Hex Stream”或“Copy as Printable Text”,把原始字节复制出来。报告里这种原始字节串是证明你确实做过分析的最有力素材。
4. ARP报文逐字段解码:28个字节的含义与边界条件
4.1 固定字段区:从硬件类型到操作码
Ethernet帧头的14字节之后,紧接着就是ARP报文的固定20字节(不含MAC和IP地址部分)。这20字节是课程设计报告的核心内容——只要把每个字段的偏移、长度和取值含义写清楚,这个课设的理论分基本就拿到了。
ARP报文固定字段的字节布局如下:
| 偏移(相对ARP报文) | 长度 | 字段名 | 取值说明 |
|---|---|---|---|
| 0-1 | 2 | 硬件类型(HRD) | 1 = Ethernet,其他值还有6(IEEE 802网络)、32(FDDI)等 |
| 2-3 | 2 | 协议类型(PRO) | 0x0800 = IPv4,0x86DD = IPv6,ARP在IPv6场景下基本不用 |
| 4 | 1 | 硬件地址长度(HLN) | Ethernet网卡MAC = 6 |
| 5 | 1 | 协议地址长度(PLN) | IPv4地址 = 4 |
| 6-7 | 2 | 操作码(OP) | 1 = 请求,2 = 应答,3 = RARP请求,4 = RARP应答 |
注意一个细节:硬件类型+协议类型+两个长度字段+操作码,这8个字节合起来形成一个“描述上下文”的头部。换句话说,ARP报文的设计初衷是通用的,理论上可以解析任意硬件类型上的任意协议地址。但实际上你只需要关注“Ethernet + IPv4”这一类。
操作码是判断报文方向的标志。请求包的操作码为1,目标MAC字段未填(全0占位);应答包的操作码为2,目标MAC字段填上真实值。如果看到操作码为3或4,那是已经淘汰的RARP协议,无需展开。
4.2 地址字段区:四个地址的顺序是固定的
固定字段区之后是4个地址字段,按顺序依次出现:
| 偏移(相对ARP报文) | 长度 | 字段名 | 作用 |
|---|---|---|---|
| 8-13 | 6 | 发送方硬件地址(SHA) | 请求方/应答方的MAC地址 |
| 14-17 | 4 | 发送方协议地址(SPA) | 请求方/应答方的IPv4地址 |
| 18-23 | 6 | 目标硬件地址(THA) | 请求时全0;应答时填充对方MAC |
| 24-27 | 4 | 目标协议地址(TPA) | 请求时填写要解析的IP;应答时填写请求方的IP |
可以这样理解:地址字段的顺序是“发送方MAC、发送方IP、目标MAC、目标IP”,不要想当然先MAC后IP。一旦记错顺序,解析出来的数据全是乱的。
ARP请求报文里,THA字段是00:00:00:00:00:00,因为请求者不知道目标MAC,所以空着等对方填。如果你在抓包时看到一个请求包里的THA不是全0,那大概率是某些驱动或工具构造的畸形包,Wireshark会用[Duplicate ARP]等提示标注异常。
4.3 一个典型ARP请求/应答对的逐字段对照
为了能把请求和应答的差异讲清楚,我们拿一个实测的报文对来分析。下面是在虚拟机里清空缓存后ping网关抓到的两个包,我直接把Wireshark解析后的字段摘出来做对比:
| 字段 | ARP请求(本机 → 网关) | ARP应答(网关 → 本机) |
|---|---|---|
| Ethernet目的MAC | ff:ff:ff:ff:ff:ff | 本机MAC(单播) |
| Ethernet源MAC | 本机MAC | 网关MAC |
| Ethernet类型 | 0x0806 | 0x0806 |
| 硬件类型 | 1(Ethernet) | 1(Ethernet) |
| 协议类型 | 0x0800(IPv4) | 0x0800(IPv4) |
| 硬件地址长度 | 6 | 6 |
| 协议地址长度 | 4 | 4 |
| 操作码 | 1(请求) | 2(应答) |
| 发送方MAC | 本机MAC | 网关MAC |
| 发送方IP | 本机IP | 网关IP |
| 目标MAC | 00:00:00:00:00:00 | 本机MAC |
| 目标IP | 网关IP | 本机IP |
把这张表放进报告里,整个报文的结构就不言自明了。写报告时可以用Wireshark的“Packet Bytes”视图对照着填,每个字段的值基本不会错。唯一需要注意的是Ethernet帧头里的“目的MAC”和ARP报文里的“目标硬件地址”虽然都是MAC,但含义完全不同:前者是链路层传输用的地址,后者是ARP协议里的地址,不要混在一起写。
5. 用Python解析ARP报文:从pcap文件到结构化输出
5.1 最小解析脚本:不依赖scapy,用struct解二进制
课程设计如果只靠Wireshark点鼠标,答辩时容易被问倒。最稳妥的做法是写一个Python脚本,直接读取pcap文件,在不调用scapy类库的情况下,用标准库struct把Ethernet帧和ARP报文逐字节解析出来。这样能证明你确实理解二进制布局,而不是只会用现成工具。
先说思路:pcap文件的二进制格式是“全局头 + 多个数据包记录”,每个数据包记录包含16字节的包头(时间戳4字节+4字节、捕获长度4字节、原始长度4字节)和实际帧数据。我们不需要解析完整的pcap文件,直接用一个简化版本:读取整个文件,跳过pcap全局头的24字节,进入第一个包记录,读取帧数据。
import struct def parse_ethernet_arp(frame): """ 解析一个完整的Ethernet帧,返回ARP报文字段字典。 输入frame为bytes类型,至少包含14字节帧头 + 28字节ARP报文。 """ # Ethernet帧头 dst_mac = frame[0:6].hex() src_mac = frame[6:12].hex() eth_type = struct.unpack('!H', frame[12:14])[0] if eth_type != 0x0806: return None # 只解析ARP报文 # ARP报文固定字段 hrd, pro, hln, pln, op = struct.unpack('!HHBBH', frame[14:22]) # 地址字段 sha = frame[22:28].hex() spa = socket.inet_ntoa(frame[28:32]) tha = frame[32:38].hex() tpa = socket.inet_ntoa(frame[38:42]) # 格式化MAC地址(把连续的hex转为冒号分隔) def mac_str(hexstr): return ':'.join(hexstr[i:i+2] for i in range(0, 12, 2)) return { 'eth_dst': mac_str(dst_mac), 'eth_src': mac_str(src_mac), 'eth_type': hex(eth_type), 'hardware_type': hrd, 'protocol_type': hex(pro), 'hw_addr_len': hln, 'proto_addr_len': pln, 'opcode': op, 'sender_mac': mac_str(sha), 'sender_ip': spa, 'target_mac': mac_str(tha), 'target_ip': tpa, }这段代码的核心是struct.unpack('!HHBBH', frame[14:22])这一行。格式字符串里!代表网络字节序(大端),HHBBH依次对应固定字段区里的硬件类型、协议类型、硬件地址长度、协议地址长度、操作码。注意读二进制时,长度是1字节的用B,2字节的用H,顺序不能乱。另外MAC地址本身是6字节原始二进制,直接.hex()得到12个十六进制字符,我再用一个mac_str函数转成冒号分隔的格式方便阅读。
5.2 主流程:遍历pcap文件并输出表格
有了单帧解析函数之后,主流程就是把pcap文件里的所有帧逐个喂进去。简化版的读取逻辑如下:
import os import socket import struct def read_pcap_frames(pcap_path): """读取pcap文件,yield所有帧数据。""" with open(pcap_path, 'rb') as f: # 跳过pcap全局头 f.seek(24) while True: rec_header = f.read(16) if len(rec_header) < 16: break incl_len = struct.unpack('!I', rec_header[8:12])[0] frame = f.read(incl_len) if len(frame) < 42: continue # 帧太短,可能不是ARP yield frame if __name__ == '__main__': pcap_path = 'arp_capture.pcap' for idx, frame in enumerate(read_pcap_frames(pcap_path)): info = parse_ethernet_arp(frame) if info is None: continue print(f'帧序号: {idx}') for k, v in info.items(): print(f' {k}: {v}') print('-' * 40)执行这个脚本后,输出会以缩进的键值对列出每个ARP报文的所有字段,和Wireshark的解析结果对照一下,分毫不差。这里要注意两点:一是pcap文件里可能混有非ARP报文,parse_ethernet_arp里已经做了过滤;二是如果文件里包含巨型帧或者VLAN tag(Ethernet类型为0x8100),帧头结构会发生变化,脚本就不适用了,课程设计场景一般不会遇到,但如果抓包网卡开了VLAN就要小心。
5.3 把脚本扩展成命令行工具:输入输出都做成参数
课程设计报告里如果能展示一个稍微完整的工具,印象分会高不少。可以在上面的基础上做一个命令行版本,支持指定pcap文件路径和输出CSV报表:
# arp_parser_cli.py import argparse import csv import socket import struct # 复用上面的parse_ethernet_arp函数,这里省略重复定义 def pcap_to_csv(pcap_path, csv_path): with open(csv_path, 'w', newline='', encoding='utf-8') as f: writer = csv.writer(f) writer.writerow(['帧序号', 'Eth源MAC', 'Eth目的MAC', '发送方MAC', '发送方IP', '目标MAC', '目标IP', '操作码', '报文类型']) for idx, frame in enumerate(read_pcap_frames(pcap_path)): info = parse_ethernet_arp(frame) if not info: continue pkt_type = '请求' if info['opcode'] == 1 else '应答' writer.writerow([ idx, info['eth_src'], info['eth_dst'], info['sender_mac'], info['sender_ip'], info['target_mac'], info['target_ip'], info['opcode'], pkt_type, ]) print(f'已输出 {csv_path}') if __name__ == '__main__': parser = argparse.ArgumentParser(description='解析Ethernet ARP报文') parser.add_argument('-i', '--input', required=True, help='pcap文件路径') parser.add_argument('-o', '--output', default='arp_report.csv', help='输出CSV路径') args = parser.parse_args() pcap_to_csv(args.input, args.output)这样把脚本做成了一个“能用”的工具,报告的“系统设计”部分就有的写了。但注意不要编造代码运行环境或版本号,我只说“标准库struct”的观点,这在Python 3.6到3.12都成立。
6. 避坑指南:抓不到、解错、写错——三种最容易翻车的情况
做这个课设翻车最多的地方,不是理论不懂,而是环境问题和细节看走眼。按我的经验列四条最典型的“坑”,每一条都是肉眼可见的失败场景。
6.1 抓包半天一个ARP请求都没有
现象:Wireshark界面开了好几分钟,过滤条件也设置了,但列表里全是其他协议报文,ARP报文数恒为0。
原因:ARP缓存生效,ping目标IP时没有产生请求。Windows系统下试过一次ping 192.168.1.1之后,ARP缓存条目至少存活几十秒,期间再ping不会重新发ARP请求。
解决:每次测试前先执行arp -d,然后立刻ping。如果arp -d提示拒绝访问,说明当前终端不是管理员权限,需要用“以管理员身份运行”打开命令提示符或PowerShell。还有一个更彻底的方案:直接ping一个局域网内不存在的IP,比如ping 192.168.1.240,一定会发ARP请求,因为缓存里永远不会有这个IP的条目。这个技巧我经常用,能省很多事。
6.2 抓到了ARP请求,但没有应答
现象:过滤arp.opcode == 1有结果,但arp.opcode == 2一条都搜不到。
原因:目标主机不在同一广播域,或者目标主机的防火墙丢弃了ARP应答(少见,但某些安全软件会这么做);还有一种情况是目标主机本身没有ARP缓存对应项,它收到你的请求后需要再做一次反向ARP查询才能应答。但课程设计环境一般不存在这个问题,更常见的原因是抓包网卡的混杂模式没开。
解决:先确认Wireshark的捕获选项中混杂模式勾选框是否选中。其次,如果你ping的是VMware虚拟机的IP,要检查两台机器是否真正在同一网段,比如VMware仅主机模式下,物理机的VMnet1网卡IP必须和虚拟机IP在同一个子网里。最稳妥的做法是在虚拟机里对物理机IP发起ping,让ARP请求由虚拟机发出,物理机网卡上就能同时看到请求和应答。
6.3 解析脚本输出不对,Wireshark解析却正常
现象:自己写的Python脚本解析出的MAC地址序列和Wireshark显示的不一致,比如MAC地址被反转了、IP地址变成了奇怪的值。
原因:十有八九是struct.unpack的格式字符串、偏移地址写错了。常见错误有两种:一是把“协议地址长度”和“硬件地址长度”两个单字节字段的类型写成了H(双字节),导致操作码解析错位;二是偏移算错了,比如frame[28:32]才应该是IPv4地址,如果用了frame[29:33],解析出来的IP就完全不是那么回事。
解决:调试时先打印原始字节的hex(),对照Wireshark的“Packet Bytes”面板手动核对偏移。如果太费劲,还有一个更省事的检查方法:在脚本里加一句断言,强制检查帧头的Ethernet类型是否为0x0806,如果不是就直接跳过,避免把非ARP报文也拿去解析导致错乱。
if eth_type != 0x0806: return None assert len(frame) >= 42, f'帧长度 {len(frame)} 不足以承载ARP报文'这段代码片段不用当作正式功能,但能帮你在写实验报告时少很多莫名其妙的“玄学错误”。
7. 验证方法:让实验结论可信的最后一步
解析脚本写完,数据也打印出来了,但怎么证明你的解析是对的?这是课程设计答辩中最容易被追问的环节。只贴一张Wireshark截图是远远不够的,你得用交叉验证来说明“我的工具没有瞎解析”。
最简单的验证方法是把脚本输出和Wireshark的解析结果做对比。从同一个pcap文件里挑三个报文,比如一个ARP请求、一个ARP应答、一个目标IP是广播地址的请求,把Wireshark每个字段的值摘录到一个表格里,再把脚本输出的对应值放在旁边,逐项对照一致。如果有个别字段不一致,就直接定位是脚本的问题还是Wireshark的显示问题。
另外一个更“硬核”的验证方式是手工构造一个已知的ARP报文,用你的脚本解析,验证结果是否符合预期。用scapy构造一个请求包,然后用你已经写好的解析函数去解它:
from scapy.all import Ether, ARP, wrpcap # 构造一个ARP请求帧 packet = Ether(dst='ff:ff:ff:ff:ff:ff', src='00:0c:29:aa:bb:cc', type=0x0806) / ARP( hwlen=6, plen=4, op=1, hwsrc='00:0c:29:aa:bb:cc', psrc='192.168.1.100', hwdst='00:00:00:00:00:00', pdst='192.168.1.1' ) # 写成一个pcap文件 wrpcap('test_arp.pcap', packet)然后运行你的解析脚本去读test_arp.pcap,如果输出的sender_ip是192.168.1.100、target_ip是192.168.1.1、opcode是1,说明解析逻辑没有偏差。这个方法好在能完全控制输入,不用依赖网络环境下ARP缓存的“随机性”,适合放在实验报告里作为“验证实验”章节。
最后提醒一句,做这个课设“从设计到报告”的落地,最重要的是严谨的对照意识:不要只贴Wireshark的截图,也不要只贴代码运行结果,一定要把报文原始字节、Wireshark解析、自研脚本解析三者对应起来展示。这样不管是助教还是老师来问,你都能稳如泰山地解释清楚每一层逻辑。希望这些方法和踩坑点能帮你在这次课设里少走一些弯路。
本文还有配套的精品资源,点击获取