计算机网络课程实验全攻略:Wireshark抓包与Python解析避坑指南
简介南京大学2024年计算机网络课程实验全套资料面向计网课程学生用于完成七个按主题递进的实验并撰写实验报告。实验覆盖 Hub/Switch 转发与自学习、静态路由/RIP、可靠传输与拥塞控制、TCP/IP 协议栈、防火墙及 NAT 等主题每个实验均配有 Python 源码框架、Mininet 启动脚本和测试样例。包内共 38 个文件以 Python 脚本为主29 个 py另外含 6 个 txt 配置/转发规则、1 个说明文档、1 个 shell 启动脚本和 1 个 pcap 抓包文件压缩包仅 39KB体量小、便于按目录逐一对照练习。目前已有 159 人学习/使用。对想通过动手配置路由器、交换机、防火墙来理解“自顶向下”网络原理的读者来说这份资料能提供实验指南、参考实现、测试思路与抓包排错经验帮助学生把协议状态机、分组转发和流量控制等抽象概念落到具体代码与实验中是复习备考和课程作业的实用参考。1. 拿到 NJU-2024-计算机网络课程实验.zip先分清两半工作期末前同学把一份名为“NJU-2024-计算机网络课程实验.zip”的压缩包发到我手上我当时以为最大的风险是解压不出来后来才发现真正翻车的地方都在后面——抓包文件打不开、Python 库版本装错、报告里贴的截图连过滤条件都对不上。这套实验包本质上把计算机网络课程的考核拆成了两半一半是拿 Wireshark 看抓包、分析协议交互另一半是顺着代码包把数据链路层、网络层和传输层的概念在本地跑起来。适合正在做课程实验的本科生、马上要期末复习的考研党以及想用抓包数据补理论的从业者。先把这两半分开后面每一步才不会乱。2. 解压与目录盘点先看清这个实验包里装了什么2.1 分平台解压Windows 右键、Linux 命令与 zip 编码问题以 zip 形式分发课程实验是最常见的做法。zip 跨平台、保留目录结构、支持注释比 rar 省心也比 tar.gz 在 Windows 上友好得多。绝大多数同学是在 Windows 上直接右键“全部解压”这没问题但如果你和我一样习惯在 Linux 的服务器或 WSL 里跑分析脚本就要留意中文文件名编码。Windows 上生成的 zip中文文件名默认是 GBK/CP936 编码而 Linux 的 unzip 默认按 UTF-8 解结果就是文件夹名变成一串乱码。实验包里的常见命名往往又是《实验报告-张三》、《数据链路层抓包.pcapng》这类解出来全是「杩斿洖」后面想用通配符批量处理包文件时就会踩坑。我一般这样解压mkdir -p nju-netlab cd nju-netlab unzip -O cp936 ../NJU-2024-计算机网络课程实验.zip-O cp936是指定 zip 内文件名按 GBK 编码解释-d如果不写就默认解压到当前目录先mkdir建一个独立目录是为了防止压缩包内部的零散文件直接撒在当前工作目录里。如果系统 unzip 不支持-O参数说明是旧版本可以换成7z x配合-mcpcp936处理效果一致。解压完先别急着看文件先执行ls -la看目录层级是否干净。2.2 解压后先盘点目录再决定下一步做什么这一步很多人会跳过但我强烈建议花两分钟把包里的内容分一下类。计算机网络课程实验包按我的经验通常包含四类东西抓包数据文件、报告模板、代码文件、说明文档。抓包文件后缀是.pcapng或.pcap报告模板一般是.docx或.md代码文件可能是.c、.py、.java说明文档大多是README.md或实验要求.pdf。可以按功能列一张表方便对照类型常见后缀你在实验里要拿它做什么抓包数据.pcapng / .pcap / .cap用 Wireshark 打开、过滤、统计、截图报告模板.docx / .md按模板结构填写实验过程和结论代码文件.c / .py / .java阅读逻辑、编译运行、或作为参考实现说明文档.md / .pdf / .txt确认实验版本、截止时间、提交格式如果同一套实验有多个抓包文件最好按实验编号子目录重新整理。我的习惯是01-wireshark、02-socket、03-router这样归类每个子目录里放对应的抓包和代码。这样做的直接好处是后续用循环脚本批量处理 pcapng 时路径不会乱报告里也能直接写明文件位置复查时省事。2.3 用 tshark 快速验证 pcapng 是否完好解压出来的 pcapng 双击打不开可能是文件损坏、版本过新或下载不完整。与其一个个双击试不如直接用命令行验证习惯用 Wireshark 自带的 tshark 工具tshark -r 数据链路层抓包.pcapng -c 5-r后面跟文件路径-c 5表示只读取前 5 个包。能正常输出包列表说明文件头没问题如果输出The file isnt a capture file基本可以判定文件损坏。此时别急着重下先看压缩包本身是否完整用unzip -t检查一下更稳妥。这一步能帮你把「压缩包问题」和「抓到包本身有问题」这两件事区分开避免后面为了一个坏文件白折腾半小时。3. 环境准备与技术选型哪些工具值得装哪些可以跳过3.1 抓包分析为主为什么先选 Wireshark 而不是直接写脚本很多同学一上来就翻代码想用 Python 处理一切但课程实验里最耗时间的往往是“看包”而不是“写代码”。抓包分析类实验比如 TCP 三次握手、ARP 请求应答、HTTP 请求结构Wireshark 的图形界面和过滤生态比任何自写脚本都高效。定位一条 TCP 连接只要输入tcp.stream eq 0立刻能看到完整的握手序列要确认三次握手展开每一帧的 Flags 位就能看到 SYN、SYNACK、ACK 标记。这些东西如果用脚本来查你得逐帧遍历数据包再手动计算标志位效率差太多了。Wireshark 的另一个优势是「过滤条件能被直接复用」。你在界面上调好的过滤器比如http.request可以直接作为 tshark 的命令行参数这样一套思路可以贯穿图形界面、批量处理和自动化统计三个阶段。遇到批量分析多份抓包文件时我一般这样跑tshark -r 02-http.pcapng -Y http.request -T fields -e frame.time -e ip.src -e ip.dst -e http.request.uri-Y是显示过滤器-T fields指定输出格式为字段列表-e后面跟具体字段名最终输出是每一行一个 HTTP 请求包含时间、源地址、目的地址和请求 URI。这样一份数据可以直接整理进实验报告比从界面截图再手打文字强得多。如果这学期还打算复习期末配合谢希仁或王道的教材把这些抓包结果和你记的协议状态对照着看比纯刷题记得牢。3.2 编程解析为辅scapy 与 pyshark 的选用边界当实验要求统计包数量、计算 CRC 校验、分析协议字段的分布时Wireshark 点鼠标就有点力不从心了这时候需要程序化处理。Python 生态里主流的两个库是 scapy 和 pyshark选哪个取决于你要做什么。scapy 的优点是能直接操作包结构自定义报文、改字段、构造重放包都很方便适合做「需要发包」的实验缺点是解析超大 pcapng 文件时内存消耗大不要一次性rdpcap()读整个文件。pyshark 本质是 Python 封装 tshark它不自己解码包而是调用 tshark 的解析引擎流式读取、内存友好做统计和分析更稳。我的建议很简单只是读包统计和过滤用 pyshark要改包和重放用 scapy两者都要就装两个互不冲突。安装不要图省事一把梭按需安装即可pip install pyshark scapy装完先用tshark --version确认 Wireshark 的命令行工具在 PATH 里因为 pyshark 依赖 tshark 二进制工作。如果 tshark 不在 PATH 里pyshark 运行时会报FileNotFoundError那不是库的问题是环境变量的问题。3.3 实验平台真机、虚拟机和 Mininet 分别在什么场景下用平台选错是时间黑洞。真机的最大优势是网络环境真实Wireshark 直接抓本机网卡流量适用于「观察自己主机发出的协议行为」比如访问网页、ping 网关缺点是你没法随意修改路由表更不可能把本机配成一台路由器。所以凡是涉及多主机拓扑、静态路由配置、路由器转发的实验我最常做的是拉一台 Ubuntu 虚拟机或者直接用 Mininet 起虚拟拓扑。Mininet 的优势一句话讲完一行命令创建一个带多个主机和交换机的虚拟网络。比如创建两个主机一个交换机的拓扑底层实现、数据转发行为都是真实发生的内核网络栈而不是仿真模拟。针对题目要求动态配置拓扑的编程实验我最常用的是sudo mn --topo linear,3这种快速建链方式。注意 Mininet 里的pingall全通不代表协议分析正确要确认的是抓包文件里是否能观察到对应协议的具体交互过程。如果你不打算在这门课上花太多时间装环境优先级可以这样排Wireshark 必装pyshark 装好Mininet 按需装虚拟机最后再说。很多课程实验只要抓包分析加一份报告就能拿到大部分分数这些成本别一开始就铺大。4. 把编程实验跑起来从读包到出结果的最小操作路径4.1 第一步先让脚本能读到包拿到代码文件后很多人第一件事是打开编辑器读代码但我建议先把「读取工具链」跑通。因为不管代码里做了什么最终验证都要回到抓包文件上——你的程序能不能从这些 pcapng 里找到它该处理的流量决定了这个实验能不能闭环。下面这段是我最常用的读包脚本骨架可以直接放进实验目录跑import glob import pyshark pcap_files glob.glob(*.pcapng) glob.glob(*.pcap) if not pcap_files: raise SystemExit(当前目录下没有 pcapng/pcap 文件请先确认解压路径) cap pyshark.FileCapture( pcap_files[0], display_filterip, only_summariesTrue ) count 0 for packet in cap: print(packet) count 1 if count 20: # 先只打印前 20 条确认输出格式 break cap.close() print(f已读取 {count} 条 IP 包)glob.glob会把当前目录下所有 pcapng 和 pcap 文件收集起来取第一个作为输入这样就避免了手动改路径pyshark.FileCapture指定display_filterip是只关心 IP 层以上的包跳过纯粹的 ARP 帧only_summariesTrue会把每条包压缩成一行字符串方便快速浏览输出格式。cap.close()这行会被很多人漏掉但 pyshark 内部有 tshark 子进程不关闭可能残留进程句柄后续反复运行时偶发端口占用或文件占用的问题。4.2 第二步把过滤器对准实验目标流量同样的脚本把display_filter换掉就能完成不同实验的统计目标。比如 TCP 三次握手实验过滤条件应该聚焦在特定端口和握手标志上HTTP 实验则可以直接用http.request抽取请求。不要贪图ip这种大而全的过滤器过滤条件越宽你的统计结果里混入的干扰流量越多报告里解释起来也越费劲。以下是我根据常见实验类型整理的过滤器对照表实验类型推荐过滤器统计目标TCP 三次握手tcp.flags.syn1HTTP 请求分析http.request统计请求方法、URI、源目地址ARP 协议arp统计请求和应答对DNS 解析dns.flags.response1统计响应包的分布ICMP 连通测试icmp统计请求回显和响应延时这里特别注意别把不在实验范围内的流量也算进去。比如系统里其他软件在后台跑着云同步也会发出 HTTP 请求如果你的过滤器只写了http这些噪音就会混进统计结果。要在报告里写清楚过滤条件、抓包时长、抓包位置这三点对齐了结果才有说服力。4.3 第三步核对输出并落到实验报告脚本输出结果后还要和 Wireshark 界面打开同一个抓包文件做交叉验证。具体操作是在 Wireshark 里设置同样的过滤器看左下角的「已显示 N 条」是否和脚本统计数字一致。这一步是很多人跳过的但恰恰是它最能兜底——过滤器语法写错时脚本可能输出空结果而 Wireshark 的界面不会告诉你「这个过滤器可能不对」它只会安静地显示 0 包。交叉验证通过后把关键输出整理成表格写进报告附带一张 Wireshark 截图。截图时注意把菜单栏的过滤器输入框一并截进去老师复查时能直接看到你这张图是在什么过滤条件下生成的。只截包列表不截过滤条件等于告诉别人这个结果不可复现。5. 避坑这五个坑值得在交报告前再看一遍5.1 明明没设密码解压时却提示要密码现象解压 NJU-2024-计算机网络课程实验.zip 时WinRAR 或 7-Zip 弹出输入密码对话框但你从下载源头拿到时并没被告知密码。原因这是 zip 的「伪加密」在作怪。zip 文件头里有一个通用位标志general purpose bit flag第 0 位是加密标记位有些工具在打包时把这个标记位错误地写成了 1但文件内容其实没有加密于是解压软件看到标志位就要求输入密码。这通常发生在文件被二次打包、或者某个网盘工具转存后改写了文件头。解决先别急着去找密码工具。用 7-Zip 打开压缩包看文件名后面有没有星号标记或者直接用命令行工具尝试列出内容如果列出成功说明是伪加密。常见做法是用一个小工具把加密标志位改回 0或者干脆换一个解压程序重新读。真正处理过几次之后你会发现这类问题大概率不需要破解密码修标志位就行。5.2 Linux 解压后目录名全是乱码现象在 Ubuntu 或 WSL 里用unzip解压实验包后所有中文文件名变成「杩斿洖」之类的乱码导致脚本里写路径时对不上。原因zip 文件内部记录文件名时用的编码是 GBK而 Linux 的unzip默认按 UTF-8 解码导致中文标签全部错位。这与文件内容无关纯粹是编码映射问题。解决用unzip -O cp936指定编码重新解压或者用支持编码转换的 7-Zip 处理。已经解压出来的乱码目录可以先删掉不要手动改名因为手动改容易漏还可能改错层级。乱码文件不止影响阅读更会让后续glob.glob(*.pcapng)脚本扫不到文件。5.3 脚本跑一半抛 KeyError直接崩溃现象用 scapy 或 pyshark 解析 pcapng 时循环到某几个包突然报KeyError: IP或AttributeError程序当场停止。原因pcapng 文件里不只有 IP 数据包还可能有 ARP、ICMPv6、LLDP 等非 IP 协议帧。代码里如果直接写packet[IP].src当当前包不是 IP 包时就会抛出异常。这和库版本无关是典型的「没考虑抓包文件里的协议多样性」。解决在遍历循环里加一层协议判断不是 IP 包就直接跳过。用 pyshark 时判断hasattr(packet, ip)用 scapy 时判断if IP in pkt。这类防御性写法看起来罗嗦但在真实抓包文件里是最省心的因为实验包里给的 pcapng 通常不是纯净的单协议流量。5.4 Wireshark 过滤器不报错但结果永远是空的现象在 Wireshark 过滤栏输入tcp.flags.syn后列表显示 0 条换成tcp又能看到大量包。过滤器没有语法错误但就是过滤不出目标内容。原因最常见是大小写问题。Wireshark 的显示过滤器是大小写敏感的HTTP和http完全不一样另外协议字段名写错时会显示黄色下划线警告但如果你只关注错误提示忽略黄色警告过滤器同样会静默返回空结果。解决过滤器输入时留意有没有黄色背景或者红色波浪线。如果过滤栏变黄说明字段名不存在直接改成正确的字段名另外新手建议输入前几个字符让自动补全带出合法字段。还有一个习惯很好——每写一个过滤器先故意输错一次看它的警告效果这样下次就能快速识别。5.5 截图没带过滤条件报告被打回重改现象报告里贴了很多 Wireshark 截图但复查时老师发现截图里的包数量和数据表对不上或者根本不知道这张图加了什么过滤条件最后打了低分要求重写。原因截图时只截了包列表区域过滤栏、时间列、源目地址列都对不上读者无法从图里还原操作过程。课程实验报告不只是写「我看到了什么」还要让读的人知道「你是如何在什么条件下看到的」。解决截图前先确认三点——过滤栏可见且内容完整、时间列显示成可读格式、至少能看到源地址和目的地址两列。如果截长图尽量保证关键帧的编号清晰。实验报告的截图相当于证据链证据链不全过程再正确也说服不了人。6. 提交前最后 10 分钟让报告里的每个数字都可复现报告写完之后我习惯在提交前跑一遍全量验证确保每一个数字都能从原始抓包文件里重新得到。用一段简短的循环脚本把每个 pcapng 文件的基础信息打印出来对照报告正文逐项核验for f in *.pcapng; do echo $f tshark -r $f -T fields -e frame.number -e ip.src -e ip.dst 21 | head -n 3 total$(tshark -r $f -T fields -e frame.number 2/dev/null | wc -l) echo 总包数: $total done这个循环里-T fields -e frame.number输出每一帧的编号wc -l统计总行数得到的就是该文件的真实包数量。对照检查三件事一是报告里写的抓包文件路径是否和实际文件名一致二是报告里引用的包编号比如「第 128 个包是 SYN」但脚本里对应编号的帧是不是 SYN确保两者对齐三是过滤器的输出字段名和报告里写的字段名完全一致不能一个写 TCP 一个写 tcp。以前我交过一次只贴截图没核对列的报告老师直接在课上点名说我的截图「看不到过滤条件、源地址列也折断了」。那次之后我养成了一个习惯每次提交前把脚本输出导出一份文本和报告一起打包存着。复查时先看脚本输出再看报告截图两分钟就能确认有没有错位。这个习惯也让我后来在复习期末时轻松很多——所有实验数据都以可检索的形式留着不比重新翻 Wireshark 香吗希望帮到你。本文还有配套的精品资源点击获取