ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

计算机网络实验通关指南:环境、Socket与抓包实战

计算机网络实验通关指南:环境、Socket与抓包实战 简介南京大学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 / tsharkMakefile构建脚本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 wiresharknet-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 buildmake -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) # backlog5等待队列长度 while True: conn, _ s.accept() threading.Thread(targetecho, args(conn,), daemonTrue).start()这段代码的三个参数值得解释。HOST设为0.0.0.0而不是127.0.0.1是为了让虚拟机和宿主机、或者两台实验机器之间能互相访问这在双端联调实验里是刚需recv(1024)是一次读取的上限不代表一次能读到完整消息TCP 是字节流没有消息边界所以循环读直到空串是必须的listen(5)的 5 是 accept 队列长度不是最大连接数。daemonTrue让线程随主进程退出避免遗留僵尸线程把端口占住。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 lotcpdump 的参数每个都有用-i lo指定回环接口因为本机两个进程通信时流量不经过物理网卡只走 lo-nn不做 DNS 解析和端口名解析减少网络请求、加快抓包速度-s 0抓完整包避免截断 TCP 头-w写 pcap 文件而不是直接打印。抓完后用 tshark 把窗口数据导出成 CSVtshark -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 8080printf里的\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.mdcapture目录放原始抓包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因为老师的机器上不一定装了新版 Wiresharkpcapng 在部分旧版本上打不开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 默认用本地编码GBKLinux 的 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 20timeout 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 超时。原因虚拟机的网络模式是 NATNAT 模式下宿主机无法直接反向访问虚拟机。解决把虚拟机的网络模式改为桥接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 FAILsleep 1太短会 connection refused太长会拖慢循环kill %1用的是 bash 的作业控制杀掉最近一个后台进程。第二项自检是把抓包文件的时间和系统时间对齐抓包前先date打一个时间戳抓完在 Wireshark 里核对首包时间误差超过一分钟的报告数据就不可信了。TCP 时间戳选项也能辅助对时但实验层面用系统时间对时已经足够。第三项是回归到实验要求逐条勾选。我会把 README 里的验收点拆成清单单向传输是否验证、双向传输是否验证、异常输入是否处理、抓包是否有证据。每勾一项就在报告里对应位置标注已验证数据见 XXX.pcap。这种逐条打勾的方式看起来笨但能挡住大多数扣分点。这三套动作做完实验才算真正收尾。我自己的习惯是所有代码、抓包、图表、报告放进同一个目录按实验编号命名压缩前自己先解压一遍验证一次。这个习惯救过我很多次——有次就是解压后发现少了张图重打压缩包才避免了交付事故。实验如此工作里组建网络环境同样如此先列清单再验证通路最后留证据。希望这一步一步的习惯能帮你在计网实验上少走点弯路。本文还有配套的精品资源点击获取
返回列表