news 2026/11/2 3:59:49

广东工业大学计算机网络实验报告:从抓包到组网,一份能跑通的实验复盘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
广东工业大学计算机网络实验报告:从抓包到组网,一份能跑通的实验复盘

简介:这份广东工业大学计算机网络实验报告面向计算机、软件工程等专业学生,用于完成课程实验与期末报告撰写,也可供自学者练习网络配置与协议分析。内容覆盖两大部分:一是 Windows 下常用网络命令,包括 Ping、IPconfig、Netsh、Tracert、Netstat、Arp、Nslookup 的测试与结果记录;二是协议分析软件基础,借助 Wireshark 抓包分析 Ethernet II 封包、ARP 请求与应答、IP 与 ICMP 数据包,并解析 ping、tracert 程序功能及 TCP 三次握手过程。资源包共 1 个文件,为 doc 格式实验报告文档,整体约 1.73MB,结构完整、条理清晰,可直接参考实验目的、内容要求、结果记录与思考题解答。目前已有 4030 人学习下载,适合需要快速理解实验流程、对照整理报告或复习网络命令与抓包分析方法的读者。

1. 广东工业大学计算机网络实验报告:从抓包到组网,一份能跑通的实验复盘

如果你在广工读计算机相关专业,大概率会在某个学期撞上计算机网络实验。这门课最让人头疼的地方在于:理论课讲的是 OSI 七层、TCP 三次握手,实验课却要你在 Linux 终端里敲命令、抓包、配路由,中间隔着一道巨大的鸿沟。很多同学实验报告写了几十页,Wireshark 截图贴了一堆,但问他 TCP 三次握手具体在第几个包完成,答不上来。这份实验报告的核心价值,不是帮你凑字数,而是让你真正理解每一个协议字段背后的含义,并且能在自己的虚拟机上完整复现。适合正在上这门课、准备期末复习、或者想补网络基础的同学。下面我按实验类型拆开讲,每一步都给可复现的命令和参数说明。

2. 实验环境搭建:别在第一步就翻车

2.1 虚拟机与网络模式的选择逻辑

广工的计算机网络实验通常要求两人一组,各自用虚拟机互连。常见做法是用 VMware Workstation 或 VirtualBox 装两台 Ubuntu(或一台 Ubuntu 一台 Windows),网络模式选 NAT 还是桥接,直接决定了你能不能抓到对方的包。

我一般会这样配:两台虚拟机都选桥接模式(Bridged),让它们和宿主机在同一个网段。原因是 NAT 模式下虚拟机的 IP 是 VMware 虚拟 DHCP 分配的,宿主机访问虚拟机需要端口转发,抓包时看到的源 IP 全是虚拟网卡地址,分析起来很别扭。桥接模式下每台虚拟机从路由器拿独立 IP,和真实设备没区别,Wireshark 抓到的包源目地址一目了然。

如果你只有一台电脑,那就用 Host-Only 模式加一张 NAT 网卡做双网卡,Host-Only 负责两台虚拟机互通,NAT 负责上外网装软件。配置命令如下:

# 查看网卡名称和 IP ip addr show # 假设 Host-Only 网卡是 ens37,手动配 IP sudo ip addr add 192.168.56.10/24 dev ens37 sudo ip link set ens37 up # 验证连通性 ping 192.168.56.11

这里192.168.56.0/24是 VMware Host-Only 的默认网段,VirtualBox 默认是192.168.56.0/24也一样。配完 IP 后两台机器互 ping,通了你才能开始做后续实验。注意防火墙可能拦 ICMP,Ubuntu 默认 ufw 是关闭的,如果 ping 不通先sudo ufw status确认一下。

2.2 必装工具清单与验证方法

实验报告里最常用的工具就三个:Wireshark、tcpdump、netcat。Wireshark 负责图形化抓包分析,tcpdump 负责命令行抓包(服务器上没图形界面时用),netcat 负责构造 TCP/UDP 测试流量。

# Ubuntu 一键安装 sudo apt update sudo apt install -y wireshark tcpdump netcat-openbsd # 把当前用户加入 wireshark 组,避免每次 sudo sudo usermod -aG wireshark $USER # 重新登录后验证 wireshark --version tcpdump --version nc -h

装完后有一个关键设置:Wireshark 抓包需要权限,加入 wireshark 组后重新登录才生效。如果不想重新登录,临时用sudo wireshark也行,但抓到的包属主是 root,保存文件时注意权限。tcpdump 验证时跑sudo tcpdump -i any -c 5,然后在另一个终端 ping 一下网关,能看到 5 个包就说明抓包正常。

提示:实验报告里截图要截全,包括终端命令、输出结果和时间戳,只截一个 Wireshark 窗口没有说服力。

3. Wireshark 抓包分析:把三次握手拆到字段级

3.1 抓包位置与过滤表达式

Wireshark 的核心能力是过滤。不会写过滤表达式,你面对几千个包根本无从下手。实验报告里最常考的就是 TCP 三次握手和四次挥手,过滤表达式必须记牢。

# 只抓 TCP 且端口为 80 的包 tcp port 80 # 只抓某个 IP 的包 ip.addr == 192.168.56.10 # 只抓 SYN 包(三次握手第一步) tcp.flags.syn == 1 && tcp.flags.ack == 0 # 抓 HTTP 请求 http.request # 组合过滤:某 IP 的 80 端口 TCP 包 ip.addr == 192.168.56.10 && tcp.port == 80

这些表达式直接填在 Wireshark 顶部的过滤栏里。tcp.flags.syn == 1 && tcp.flags.ack == 0这个表达式专门抓第一次握手,因为第一次握手的 SYN 包 ack 标志位是 0。第二次握手的 SYN+ACK 包两个标志位都是 1,第三次握手的 ACK 包只有 ack 是 1。把这三个包按顺序找到,实验报告的核心截图就有了。

3.2 三次握手字段逐项解读

用 netcat 构造一个最简单的 TCP 连接,然后抓包看字段。

# 机器 A(服务端)监听 8080 端口 nc -l 8080 # 机器 B(客户端)连接 nc 192.168.56.10 8080

连接建立后,在 Wireshark 里过滤tcp.port == 8080,你会看到三个包。第一个包是客户端发的 SYN,关键字段:Sequence Number 是随机初始序列号(比如 0),Flags 里 SYN=1,Window Size 是接收窗口。第二个包是服务端回的 SYN+ACK,Acknowledgment Number 是客户端序列号+1,自己的 Sequence Number 也是随机值。第三个包是客户端回的 ACK,Acknowledgment Number 是服务端序列号+1。

实验报告里要写清楚:为什么序列号是随机而不是从 0 开始?因为防止历史连接残留数据干扰新连接。为什么需要三次而不是两次?因为要确认双方的收发能力都正常。这些是老师必问的点,光贴截图不写分析拿不到高分。

3.3 用 tcpdump 做无图形界面抓包

有些实验环境是纯命令行服务器,没有 Wireshark 图形界面,这时候 tcpdump 就是唯一选择。它的输出比 Wireshark 简略,但关键信息都有。

# 抓 8080 端口的包,-nn 不解析域名,-S 显示绝对序列号 sudo tcpdump -i any -nn -S tcp port 8080 -w capture.pcap # 抓完后用 tcpdump 读 tcpdump -r capture.pcap -nn # 或者把 pcap 拷到有 Wireshark 的机器上打开

-w capture.pcap把原始包写入文件,这个文件可以拷到任何有 Wireshark 的机器上打开,格式完全兼容。-S参数很重要,默认 tcpdump 显示的是相对序列号,开了-S才显示绝对序列号,分析握手过程时更直观。-nn禁止 DNS 解析和端口名解析,避免抓包时因为解析拖慢速度丢包。

注意:tcpdump 抓包本身会消耗 CPU,高流量场景下可能丢包。实验环境流量小无所谓,但如果做性能测试,建议用-s 0抓完整包长,默认只抓 262144 字节可能截断大包。

4. Socket 编程实验:从代码到抓包验证闭环

4.1 TCP 服务端与客户端最小实现

广工的 Socket 编程实验一般要求用 C 或 Python 写一个 C/S 程序,实现文件传输或简单聊天。Python 的 socket 库最直观,下面是一个能跑通的 TCP 回声服务端。

# tcp_server.py import socket HOST = '0.0.0.0' # 监听所有网卡 PORT = 9000 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 端口复用 s.bind((HOST, PORT)) s.listen(5) # 半连接队列长度 print(f'Listening on {PORT}') conn, addr = s.accept() with conn: print(f'Connected by {addr}') while True: data = conn.recv(1024) # 每次最多收 1024 字节 if not data: break conn.sendall(data) # 原样发回
# tcp_client.py import socket HOST = '192.168.56.10' # 服务端 IP PORT = 9000 with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect((HOST, PORT)) s.sendall(b'Hello, GTU network lab') data = s.recv(1024) print(f'Received: {data.decode()}')

服务端SO_REUSEADDR这个选项很关键,不加的话程序退出后端口会处于 TIME_WAIT 状态,短时间内无法重新绑定。listen(5)的参数是半连接队列长度,不是最大连接数,实验报告里经常有人搞混。客户端sendall和send的区别是sendall会循环发送直到所有数据发完,send可能只发一部分,新手直接用sendall避免踩坑。

4.2 用抓包验证 Socket 行为

代码跑通只是第一步,实验报告要求你证明数据确实经过了网络协议栈。在客户端和服务端通信时,用 Wireshark 抓tcp.port == 9000,你能看到:

  • 三次握手建立连接
  • 客户端发送Hello, GTU network lab对应的 PSH+ACK 包,数据长度 22 字节
  • 服务端回显同样的数据
  • 四次挥手断开连接

这里有一个细节:如果客户端发送的数据小于 MSS(最大报文段长度),TCP 会立即发送;如果大于 MSS,会分段。实验报告里可以故意发一个 5000 字节的字符串,观察 Wireshark 里是否被分成多个包。MSS 在以太网环境下通常是 1460 字节,5000 字节会被分成 4 个包(1460+1460+1460+620)。

4.3 UDP 对比实验与丢包观察

TCP 实验做完后,通常还要做 UDP 对比。UDP 无连接、不保证可靠,代码更简单但行为差异很大。

# udp_server.py import socket with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s: s.bind(('0.0.0.0', 9001)) while True: data, addr = s.recvfrom(1024) print(f'From {addr}: {data.decode()}') s.sendto(b'ACK', addr)

UDP 服务端不需要listen和accept,直接recvfrom收数据。抓包时你会发现 UDP 没有握手过程,第一个包就是数据包。如果客户端连续发 100 个 UDP 包,Wireshark 里可能只看到 95 个,这就是 UDP 丢包。实验报告里可以统计丢包率,分析原因(缓冲区满、网络拥塞等)。

提示:UDP 实验的加分项是设置SO_RCVBUF观察缓冲区大小对丢包率的影响,默认缓冲区 212992 字节,改小到 1024 后丢包率会明显上升。

5. 避坑与排查:实验报告里最容易翻车的 5 个点

5.1 抓不到包:现象、原因、解决

现象:Wireshark 选了网卡,过滤表达式也写了,但一个包都没有。

原因:最常见的是选错了网卡。虚拟机有两张网卡(NAT 和 Host-Only),流量走的是 Host-Only,你却在 NAT 网卡上抓。其次是过滤表达式写错,比如tcp port 80写成了tcp.port = 80(Wireshark 用==不用=)。

解决:先不加任何过滤,抓所有包,看有没有流量。如果有流量但过滤后没有,就是表达式问题。如果所有包都没有,检查网卡选择,在 Wireshark 首页看哪张网卡有流量波动。

5.2 序列号显示为相对值:现象、原因、解决

现象:Wireshark 里 Sequence Number 显示 0、1、2 这种小数字,不是随机大数。

原因:Wireshark 默认开启相对序列号,方便阅读但不利于分析。

解决:Edit → Preferences → Protocols → TCP → 取消勾选Relative sequence numbers。改完后重新抓包,序列号就是真实的随机初始值。实验报告里如果要求写初始序列号,必须关掉这个选项。

5.3 Socket 程序报 Address already in use:现象、原因、解决

现象:服务端程序刚退出,重新运行时报OSError: [Errno 98] Address already in use。

原因:TCP 连接断开后,主动关闭方会进入 TIME_WAIT 状态,持续 2MSL(通常 60 秒),期间端口不能被重新绑定。

解决:加SO_REUSEADDR选项,如 4.1 节代码所示。或者等 60 秒再运行。实验报告里可以顺便解释 TIME_WAIT 的作用:确保最后一个 ACK 能到达对方,防止旧连接的数据包干扰新连接。

5.4 ping 不通但抓包能看到请求:现象、原因、解决

现象:A ping B,A 显示请求超时,但在 B 上抓包能看到 ICMP 请求包。

原因:B 收到了请求但没回,通常是 B 的防火墙拦了 ICMP 回应,或者 B 的路由表没有回程路由。

解决:sudo ufw disable临时关防火墙测试。如果是路由问题,ip route show检查默认网关,Host-Only 网络不需要网关,但需要正确的子网掩码。

5.5 实验报告截图没有时间戳:现象、原因、解决

现象:老师要求截图包含时间信息,但你的截图只有 Wireshark 窗口。

原因:Wireshark 默认不显示绝对时间,只显示相对时间。

解决:View → Time Display Format → Date and Time of Day。这样每个包的时间戳就是完整的年月日时分秒。另外终端截图要包含命令提示符,证明是你实际运行的,不是网上抄的。

6. 进阶技巧:用 Python 脚本自动化分析 pcap 文件

实验报告写到后面,手动数包、算时间差很痛苦。我一般会写个脚本自动提取关键指标,比如三次握手耗时、吞吐量、重传率。用scapy库可以直接读 pcap 文件。

from scapy.all import rdpcap, TCP import sys packets = rdpcap('capture.pcap') syn_time = None synack_time = None ack_time = None for pkt in packets: if TCP in pkt: flags = pkt[TCP].flags if flags == 'S': # SYN syn_time = pkt.time elif flags == 'SA': # SYN+ACK synack_time = pkt.time elif flags == 'A' and syn_time and not ack_time: ack_time = pkt.time if syn_time and synack_time and ack_time: print(f'SYN -> SYN+ACK: {(synack_time - syn_time)*1000:.2f} ms') print(f'SYN+ACK -> ACK: {(ack_time - synack_time)*1000:.2f} ms') print(f'Total handshake: {(ack_time - syn_time)*1000:.2f} ms') else: print('未找到完整握手包,检查过滤条件')

这个脚本读 pcap 文件,自动找 SYN、SYN+ACK、ACK 三个包,算出每段耗时。pkt.time是浮点秒数,乘 1000 转毫秒。实验报告里放这个数据,比手动看 Wireshark 时间列精确得多。如果抓包文件很大,rdpcap会全部加载到内存,可以用PcapReader流式读取。

另一个实用技巧是统计重传率。TCP 重传的包在 Wireshark 里标记为[TCP Retransmission],用 scapy 判断条件是相同序列号出现多次。

from collections import defaultdict seq_count = defaultdict(int) for pkt in packets: if TCP in pkt and pkt[TCP].flags & 0x02: # 只看数据包 key = (pkt[IP].src, pkt[IP].dst, pkt[TCP].seq) seq_count[key] += 1 retrans = sum(1 for v in seq_count.values() if v > 1) print(f'重传包数量: {retrans}')

这段代码用(源IP, 目的IP, 序列号)做唯一键,如果同一个键出现多次就是重传。实验报告里可以对比不同网络条件下的重传率,比如本地回环 vs 跨虚拟机 vs 真实外网。本地回环重传率基本为 0,跨虚拟机偶尔有,真实外网取决于链路质量。

最后说一个我踩过的坑:scapy 读 pcap 时如果文件里有非 IP 包(比如 ARP),pkt[IP]会报错。稳妥写法是先判断IP in pkt。这个细节在实验报告里不用写,但你自己跑脚本时能省不少调试时间。希望帮到你。

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/26 2:52:41

Linux性能监控利器vmstat:从字段详解到实战故障排查

1. vmstat 到底是什么,为什么你要用它搞 Linux 运维和性能调优的朋友,一定绕不开 vmstat 这个名字。它全称是 Virtual Memory Statistics,直译过来就是虚拟内存统计,是 Linux 系统自带的一个性能监控命令。我第一次认真研究它&…

作者头像 李华
网站建设 2026/11/2 3:59:15

Windows 8 RTM镜像下载与安装:从官方渠道到UEFI启动盘实操

简介:Windows 8 简体中文版官方下载地址与版本详解文档,面向需要获取微软原版系统镜像或了解各版本差异的IT运维人员、开发者和普通用户。这份PDF汇总了Windows 8 RTM正式版的零售版、Pro VL批量授权版及Enterprise企业版等不同版本的下载信息&#xff0…

作者头像 李华
网站建设 2026/11/2 3:57:27

AI辅助数学建模论文复现:从PDF到可运行代码的高效工作流

复现一篇数学建模论文,尤其是美赛O奖、国赛一等奖或者期刊里的建模类文章,最磨人的其实不是模型有多难,而是你根本不知道作者在论文里省略了什么。我在读研期间至少完整复现过二十多篇建模类论文,踩过无数坑之后跟周围人交流&…

作者头像 李华
网站建设 2026/11/1 11:24:25

RAID5多盘离线故障实战:从原理到数据恢复全流程解析

RAID这玩意儿,平时没故障的时候谁都不会多看一眼,一旦多块硬盘同时亮黄灯,服务器直接进不了系统,那才叫真正的“技术心跳时刻”。我这些年接手过的服务器数据恢复案例里,一半以上都跟RAID有关,其中最棘手的…

作者头像 李华
网站建设 2026/11/1 22:03:41

PDF转Excel免费的软件有哪些?电脑+手机靠谱工具全汇总

日常办公经常会遇到PDF表格需要转换成Excel的情况,手动复制粘贴不仅耗时费力,还容易打乱排版、出错漏数据。很多小伙伴都在找靠谱、免费、无水印的PDF转Excel工具,市面上工具五花八门,很容易踩坑(广告多、强制付费、排…

作者头像 李华
网站建设 2026/10/25 7:18:00

IDEA 2025.3 升级避坑指南:AI 与本地模型实战

说句不太客气的话,IDEA 2025.3 这波更新,第一批冲上去尝鲜的人里,至少有三分之一是骂骂咧咧退回来的。原因无非这么几件事:新版 UI 长得和昨天那套完全不一样了,右键菜单里多出一排 AI 图标,想配置本地模型…

作者头像 李华