☰
计算机网络实验通关指南:环境、Socket与抓包实战
2026/10/8 9:56:24 网站建设 项目流程

简介:南京大学2024年度计算机网络课程实验资料包,面向选修该课程的本科生及需要系统训练网络协议、路由交换与网络编程的初学者。压缩包内共38个文件,以29个Python教学/实验脚本为主,另有6个txt说明/配置文件、README指南、Shell启动脚本及pcap抓包样本,包体大小39KB,结构紧凑但覆盖全面。七个实验(lab_1至lab_7)按难度递进,覆盖从基础hub/switch模拟、路由器转发与转发表配置,到TCP/UDP流量传输、中间盒与防火墙规则设计等专题;每个实验均提供可运行的Python框架、Mininet拓扑脚本和对应测试用例,便于在本地虚拟网络中验证协议行为。已有160人学习下载,适合需要对照实验要求完成课程作业、撰写实验报告,或通过动手实践深化对TCP/IP、网络层路由及网络安全策略理解的读者。资料中的pcap文件和测试脚本还可用于抓包分析、故障排查与结果复现,为课程考核提供完整支撑。

1. 拿到 NJU-2024-计算机网络课程实验.zip:先别急着解压,先看这三个问题

拿到这种高校课程实验压缩包,最常见的结果不是代码写不出来,而是把一晚上时间砸在环境搭建上,最后连验收入口都没摸到。这类包通常走的是计算机网络自顶向下的教学路线,把 TCP、IP、HTTP 这些协议拆成几个必须在 Linux 里跑出真实结果的编程任务,验收看的是代码、抓包文件、实验报告三件套。值不值得投入时间,其实在解压前就能判断:这个包有没有 README、你的环境能不能跑 tcpdump、以及你愿不愿意用命令行而不是双击打开一切。正在修计网课想拿高分的学生,考研 408 想补实验视角的复习者,还有工作中每天被慢接口折磨的 devops 工程师,都能从这份 zip 里捞到对应的东西。

2. 拆开 zip 之前:先确认这份实验包到底在考什么

2.1 解压前的三个检查:列清单、看类型、找 README

我第一次拿到实验包的习惯动作不是双击解压,而是先列清单。unzip -l只列出压缩包内容而不释放文件,几秒钟就能看清目录层级和文件分布,避免直接解压后面对一堆来历不明的文件犯迷糊。

# 列出压缩包内容,不实际解压 unzip -l "NJU-2024-计算机网络课程实验.zip" | head -50 # 对可疑文件做类型判断,确认技术栈 file 实验说明书.pdf

-l参数是 list,只读不解压;head -50防止文件条目太多刷屏。列完清单后看两类东西:有没有README.md或实验手册这类文档,有没有Makefile、.py、.c、.pcap这些能暴露技术栈的文件。以下对应关系几乎在所有计网实验包里通用:

文件后缀/名字含义需要的环境
.pyPython 源码实验python3 + pip
.c/.hC 语言 socket 实验gcc + make
.pcap/.pcapng抓包证据Wireshark / tshark
Makefile构建脚本make + 配套编译器
README.md/.pdf实验说明、评分标准阅读器即可

为什么不直接解压?我在 Linux 下见过太多次 zip 里中文文件名变成乱码、可执行脚本权限丢失的情况。先列清单能让你提前知道这个包有没有坑,决定是用unzip解压还是换用7z或 Python 的zipfile模块处理。这个习惯同样适用于你从网上下载的任何课程资源包——花十秒列清单,省掉后面半小时的排错。

2.2 环境选型:Linux 虚拟机 + Python3 + Wireshark 是最小可用组合

计算机网络实验必须在 Linux 环境下做,这不是偏好,是技术选型的必然。原因有三个:第一,socket 编程里的SO_REUSEADDR、TCP_NODELAY这些选项在 Windows 和 Linux 上的默认行为不一致,你在 Windows 上跑通的代码,拿到 Linux 上可能直接 bind 失败;第二,抓包工具在 Linux 下的权限模型简单直接,普通用户加入wireshark组就能抓包,不像 Windows 上还要装 Npcap 驱动;第三,如果实验涉及网络仿真或路由器转发,mininet、ns-3这类工具原生支持 Linux,省去一堆兼容性问题。

环境准备的最小命令如下,我一般会在干净的 Ubuntu 虚拟机里执行:

sudo apt update sudo apt install -y python3 python3-pip tcpdump wireshark net-tools # 把当前用户加入 wireshark 组,避免用 root 跑图形界面 sudo usermod -aG wireshark "$USER" newgrp wireshark

net-tools提供netstat、ifconfig这些排查工具,虽然老旧但胜在直觉;newgrp wireshark让当前 shell 立刻获得抓包权限而不必注销重登。这里有一个容易被忽略的点:不要在 root 下跑 Wireshark 图形界面,否则后面用命令行排查问题时,文件权限会一团乱麻。虚拟机的网络模式建议直接用桥接,NAT 模式下宿主机访问虚拟机实验服务时经常出现连接超时,光这个能卡掉半天进度。

2.3 先让 make run 跑起来:依赖、虚拟环境与构建路径

解开压缩包后,我通常按"看构建规则 → 建环境 → 跑最小用例"三步走。如果包里有 Makefile,先不要直接执行,用make -n只打印将要执行的命令:

unzip "NJU-2024-计算机网络课程实验.zip" -d nju-lab cd nju-lab # 查看目录树,确认文件组织 find . -maxdepth 2 -type f | sort # 只看 Makefile 将要做什么,不执行 make -n build

make -n是做 dry run,它会输出要执行的每条命令但不真正运行。这一步能让你提前看到有没有rm -rf这类危险操作,以及编译目标是否依赖正确路径。如果包是纯 Python 项目,没有 Makefile,就用虚拟环境隔离依赖:

python3 -m venv .venv source .venv/bin/activate # 包里有 requirements.txt 就装;没有就跳过,先尝试跑通 pip install -r requirements.txt 2>/dev/null || echo "无依赖清单,直接跑源码"

2>/dev/null把 pip 的报错吞掉,||保证没有 requirements.txt 时不会中断脚本。这里的关键思维是:先让项目以最小代价跑起来,再回头研究它为什么这么设计。很多学生一上来就想读懂全部代码,结果卡在读代码上,连实验有没有跑通都不知道。正确顺序是反过来的——先找到入口文件,跑出一个可观察的结果,然后才谈得上去改参数、加功能。

3. 把协议变成代码:实验包里四类核心任务的做法

3.1 Socket 编程实验:TCP 回显服务的最小骨架

绝大多数计网实验包的第一关是 socket 编程。常见做法是给你一个服务端或客户端骨架,让你补全另一端。这里我给一个可以直接落地的 TCP 回显服务骨架,它对应的是自顶向下教材第二、三章的内容:

import socket import threading HOST = "0.0.0.0" # 监听所有网卡,方便虚拟机与宿主机联调 PORT = 8080 def echo(conn): while True: data = conn.recv(1024) # 一次最多读 1024 字节 if not data: # 对端关闭,recv 返回空串 break conn.sendall(data) # sendall 保证全部发出,send 不保证 conn.close() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: # SO_REUSEADDR 解决 TIME_WAIT 导致的 bind 失败 s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) s.bind((HOST, PORT)) s.listen(5) # backlog=5,等待队列长度 while True: conn, _ = s.accept() threading.Thread(target=echo, args=(conn,), daemon=True).start()

这段代码的三个参数值得解释。HOST设为0.0.0.0而不是127.0.0.1,是为了让虚拟机和宿主机、或者两台实验机器之间能互相访问,这在双端联调实验里是刚需;recv(1024)是一次读取的上限,不代表一次能读到完整消息,TCP 是字节流,没有消息边界,所以循环读直到空串是必须的;listen(5)的 5 是 accept 队列长度,不是最大连接数。daemon=True让线程随主进程退出,避免遗留僵尸线程把端口占住。

3.2 拥塞控制实验:从抓包文件反推 cwnd 变化

第二个常见的实验是拥塞控制。课堂上讲慢启动、拥塞避免、快重传,都是对着课本的 cwnd 曲线图,但课程实验要求你自己抓一份能画出这个曲线的数据。实操方法是用 tcpdump 抓本机回环接口的流量,再用 tshark 导出窗口数据:

# 后台抓包,回环接口上抓 8080 端口的全部流量 sudo tcpdump -i lo -nn -s 0 -w congestion.pcap 'tcp port 8080' & # 运行大文件传输脚本,观察窗口增长 python3 bulk_sender.py 127.0.0.1 8080 payload.bin # 传输结束后,结束后台抓包进程 sudo pkill -f "tcpdump -i lo"

tcpdump 的参数每个都有用:-i lo指定回环接口,因为本机两个进程通信时流量不经过物理网卡,只走 lo;-nn不做 DNS 解析和端口名解析,减少网络请求、加快抓包速度;-s 0抓完整包,避免截断 TCP 头;-w写 pcap 文件而不是直接打印。抓完后用 tshark 把窗口数据导出成 CSV:

tshark -r congestion.pcap -Y "tcp.analysis.ack_rtt" \ -T fields -e frame.time_relative -e tcp.window_size > window.csv

-Y是显示过滤器,ack_rtt过滤出有 RTT 采样能力的报文;-T fields -e指定输出字段,得到时间和窗口大小的两列数据。把这个 CSV 拖进 Excel 或 matplotlib 画图,就是课本里那张慢启动曲线。很多学生交实验只交代码,实际上这张图才是拥塞控制实验最有说服力的交付物。

3.3 HTTP 协议实验:用 nc 手工构造请求验证协议行为

HTTP 实验通常是实现一个最简单的 Web 服务器或正向代理。这里有一个技巧:不要急着写代码,先用nc手工构造一个 HTTP/1.1 请求,看服务端怎么响应。这能帮你区分协议细节和代码 bug:

# 手工构造 HTTP/1.1 GET 请求,注意必须用 \r\n 换行 printf "GET / HTTP/1.1\r\nHost: 127.0.0.1:8080\r\nConnection: close\r\n\r\n" | nc 127.0.0.1 8080

printf里的\r\n是 HTTP/1.1 协议规定的换行符,用\n在很多实现里会直接收到400 Bad Request。这是 HTTP 实验里最常见的低级翻车点——代码逻辑没问题,但换行符不对,结果被判定为不兼容。如果实验要求实现代理,用 curl 带-x参数验证代理行为:

curl -x http://127.0.0.1:8080 http://example.com -v

-v会打印完整的请求头和响应头,你能直接看到代理有没有正确转发、有没有加上Via头字段。做这个实验时我建议多构造几种非法请求:错误的 HTTP 版本号、缺失 Host 头、超长 URL,观察服务器的错误处理是否符合 RFC 规范,这些在验收答辩时非常加分。

3.4 路由器与转发表实验:用 traceroute 验证路径选择

如果实验包里包含路由器转发或静态路由配置,验证手段不是看代码,而是看路径。mininet 仿真环境下配置好静态路由后,用 traceroute 观察每一跳:

# 从主机 A 追踪到主机 B 的路径,-n 不做反向 DNS 解析 sudo traceroute -n 10.0.2.20

输出里每一行代表一个路由跳点,如果路径没有按你配置的静态路由走,说明转发表优先级或者子网掩码算错了。这是典型的"数据面验证"思路:协议对不对,不是靠读代码,而是靠观察报文真实走过的路径。对准备考研 408 的读者来说,这个实验把"最长前缀匹配"从一道选择题变成了肉眼可见的跳点序列,理解深度完全不同。

4. 可验收的交付物:代码、抓包与报告怎么交才不扣分

4.1 三样东西必须能对上:代码、抓包、报告的时间线一致性

实验验收扣分最大的隐藏项不是功能,而是交付物之间彼此对不上。报告里写了"窗口从 16 增长到 64",但抓包里找不到对应数据段;代码文件名和报告里引用的函数名不一致;抓包文件的时间戳和系统时间对不上——这些都会被答辩老师追问。我的做法是给每个实验建一个固定目录结构:

lab3-congestion/ ├── server.py ├── client.py ├── run.sh ├── capture/ │ └── congestion-20240601.pcap ├── figures/ │ ├── cwnd-curve.png │ └── rtt-distribution.png └── report.md

capture目录放原始抓包,figures放从抓包里导出的图表,report.md写分析。报告里每一张图都标注"数据来源:congestion-20240601.pcap 第 X 至 Y 秒",答辩时任何人问起来都能回溯到原始证据。这个习惯在工程里叫可复现性,在课程实验里直接决定你的报告能不能让人信服。

4.2 抓包文件提交前必须裁剪:tshark 按过滤条件导出

一个原始抓包动辄几百 MB,直接交上去老师打不开、邮件传不动,还容易被判敷衍。在提交之前,用 tshark 按显示过滤器裁剪出关键报文:

# 只保留与 8080 端口相关的握手报文,输出为经典 pcap 格式 tshark -r raw.pcap -Y "tcp.port == 8080 && tcp.flags.syn == 1" \ -F pcap -w handshake-only.pcap

-Y过滤器只保留三次握手报文,-F pcap强制输出经典的 pcap 格式而不是新版 Wireshark 默认的 pcapng 格式。为什么要强制 pcap?因为老师的机器上不一定装了新版 Wireshark,pcapng 在部分旧版本上打不开;pcap 是通用格式,所有版本通吃。这个细节能让你的验收过程少一个"文件损坏"的沟通成本。

4.3 实验报告怎么写:结论前置,数据说话,代码靠后

课程实验报告不是代码说明书,而是一份论证文档。结构的常见做法是:先说这个实验验证了什么结论,再贴数据图表,最后才给关键代码片段。报告里每个结论都要带数据支撑,比如"慢启动阶段窗口每 RTT 翻倍,实测第 2 到第 4 个 RTT 内窗口从 16 增至 64"。答辩时老师最喜欢问的是"这里为什么是翻倍而不是线性增长",如果你能在报告里预留一句自问自答,比如"因为 cwnd 每收到一个 ACK 增加 MSS,一个 RTT 内收到的 ACK 数等于当前窗口大小,所以表现为指数增长",基本就能堵住追问。

5. 避坑:NJU-2024 这类实验包最容易翻车的五个地方

5.1 解压后中文文件名乱码,脚本权限丢失

现象:Windows 上打包的 zip 解压到 Linux 后,中文文件名变成乱码,.sh脚本没有可执行权限,直接./run.sh报 Permission denied。

原因:zip 格式里文件名编码不标准,Windows 默认用本地编码(GBK),Linux 的 unzip 默认按 UTF-8 解码;同时 zip 文件不保存 Unix 权限位。

解决:用支持编码转换的工具解压,或者解压后统一补权限:

# 如果有 7z,指定 GBK 编码解压 7z x "NJU-2024-计算机网络课程实验.zip" -o nju-lab -y # 通用兜底:把所有 .sh 补上可执行权限 find nju-lab -name "*.sh" -exec chmod +x {} \;

5.2 tcpdump 抓出来是空文件

现象:tcpdump 正常执行、正常结束,-w写出的 pcap 文件用 Wireshark 打开却是 0 包。

原因:三种可能——权限不够抓不到包、接口选错(抓了eth0但流量走的是lo)、过滤器写得太严把包全过滤掉了。

解决:先用无过滤的短时抓包验证通路:

sudo timeout 5 tcpdump -i lo -nn -c 20

timeout 5让 tcpdump 5 秒后自动退出,-c 20抓到 20 个包就停止。如果这里能看到包,再逐步加上port 8080之类的过滤条件。如果这里就是空的,检查接口名是不是lo,用ip addr确认当前流量走的真实接口。

5.3 bind 报错 Address already in use

现象:连续两次运行服务器,第二次启动时 bind 失败,端口被占住。

原因:前一次连接的 TCP 连接进入 TIME_WAIT 状态,端口还没有释放。

解决:代码里加SO_REUSEADDR,也就是我在第 3 章骨架里写的那行setsockopt。注意,这个选项必须在bind之前设置。如果代码是给的,不能改,就在命令行层面解决:换端口,或者等待一段时间再重启。

5.4 虚拟机里实验服务宿主机访问不到

现象:实验需要宿主机访问虚拟机里的 HTTP 服务,虚拟机里curl 127.0.0.1正常,但宿主机访问虚拟机 IP 超时。

原因:虚拟机的网络模式是 NAT,NAT 模式下宿主机无法直接反向访问虚拟机。

解决:把虚拟机的网络模式改为桥接(Bridged),让虚拟机直接拿局域网 IP;或者保留 NAT 但配置端口转发规则,把宿主机的 8080 转发到虚拟机的 8080。路由器转发类实验如果卡在这个问题上,排查时先看网络模式,再看防火墙。

5.5 抓包文件老师那边打不开

现象:自己电脑上 Wireshark 正常打开的抓包,发给老师后被提示文件格式不识别。

原因:新版 Wireshark 默认写 pcapng 格式,老师的旧版本不支持。

解决:导出时强制转成经典 pcap 格式,用tshark -F pcap转换一次。同样,代码文件如果是在 Windows 上写的,注意把换行符转成 Unix 风格(dos2unix或编辑器右下角切换),否则代码在 Linux 上编译可能报奇怪的错误。

6. 验收前的最后三项自检:把"能跑"升级成"能扛"

实验交出去之前,我会做三件看起来很笨但很管用的自检。第一条是写一个回归脚本,把实验跑三遍,确保结果稳定可复现,而不是手动点一次运气好碰对了。回归脚本的逻辑很简单:

#!/bin/bash # 回归测试:跑三次客户端,确认每次都能拿到预期输出 for i in 1 2 3; do python3 server.py > "server-$i.log" & sleep 1 # 等服务器完成 listen python3 client.py > "client-$i.log" kill %1 # 清理后台服务器进程 done # 检查所有日志是否包含成功标志 grep -q "SUCCESS" client-*.log && echo "PASS" || echo "FAIL"

sleep 1太短会 connection refused,太长会拖慢循环;kill %1用的是 bash 的作业控制,杀掉最近一个后台进程。第二项自检是把抓包文件的时间和系统时间对齐:抓包前先date打一个时间戳,抓完在 Wireshark 里核对首包时间,误差超过一分钟的报告数据就不可信了。TCP 时间戳选项也能辅助对时,但实验层面用系统时间对时已经足够。

第三项是回归到实验要求逐条勾选。我会把 README 里的验收点拆成清单:单向传输是否验证、双向传输是否验证、异常输入是否处理、抓包是否有证据。每勾一项,就在报告里对应位置标注"已验证,数据见 XXX.pcap"。这种逐条打勾的方式看起来笨,但能挡住大多数扣分点。

这三套动作做完,实验才算真正收尾。我自己的习惯是:所有代码、抓包、图表、报告放进同一个目录,按实验编号命名,压缩前自己先解压一遍验证一次。这个习惯救过我很多次——有次就是解压后发现少了张图,重打压缩包才避免了交付事故。实验如此,工作里组建网络环境同样如此:先列清单,再验证通路,最后留证据。希望这一步一步的习惯能帮你在计网实验上少走点弯路。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询