
简介这份广东工业大学计算机网络实验报告面向计算机、软件工程等专业学生用于完成课程实验与期末报告撰写也可供自学者练习网络配置与协议分析。内容覆盖两大部分一是 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通了你才能开始做后续实验。注意防火墙可能拦 ICMPUbuntu 默认 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。第二次握手的 SYNACK 包两个标志位都是 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 是随机初始序列号比如 0Flags 里 SYN1Window Size 是接收窗口。第二个包是服务端回的 SYNACKAcknowledgment Number 是客户端序列号1自己的 Sequence Number 也是随机值。第三个包是客户端回的 ACKAcknowledgment 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(fListening on {PORT}) conn, addr s.accept() with conn: print(fConnected 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(bHello, GTU network lab) data s.recv(1024) print(fReceived: {data.decode()})服务端SO_REUSEADDR这个选项很关键不加的话程序退出后端口会处于 TIME_WAIT 状态短时间内无法重新绑定。listen(5)的参数是半连接队列长度不是最大连接数实验报告里经常有人搞混。客户端sendall和send的区别是sendall会循环发送直到所有数据发完send可能只发一部分新手直接用sendall避免踩坑。4.2 用抓包验证 Socket 行为代码跑通只是第一步实验报告要求你证明数据确实经过了网络协议栈。在客户端和服务端通信时用 Wireshark 抓tcp.port 9000你能看到三次握手建立连接客户端发送Hello, GTU network lab对应的 PSHACK 包数据长度 22 字节服务端回显同样的数据四次挥手断开连接这里有一个细节如果客户端发送的数据小于 MSS最大报文段长度TCP 会立即发送如果大于 MSS会分段。实验报告里可以故意发一个 5000 字节的字符串观察 Wireshark 里是否被分成多个包。MSS 在以太网环境下通常是 1460 字节5000 字节会被分成 4 个包146014601460620。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(fFrom {addr}: {data.decode()}) s.sendto(bACK, 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 80Wireshark 用不用。解决先不加任何过滤抓所有包看有没有流量。如果有流量但过滤后没有就是表达式问题。如果所有包都没有检查网卡选择在 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 BA 显示请求超时但在 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: # SYNACK 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(fSYN - SYNACK: {(synack_time - syn_time)*1000:.2f} ms) print(fSYNACK - ACK: {(ack_time - synack_time)*1000:.2f} ms) print(fTotal handshake: {(ack_time - syn_time)*1000:.2f} ms) else: print(未找到完整握手包检查过滤条件)这个脚本读 pcap 文件自动找 SYN、SYNACK、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 包比如 ARPpkt[IP]会报错。稳妥写法是先判断IP in pkt。这个细节在实验报告里不用写但你自己跑脚本时能省不少调试时间。希望帮到你。本文还有配套的精品资源点击获取