简介:这份资源是广东工业大学计算机学院2015年计算机网络课程的实验报告PDF,面向正在修读计算机网络实验、需要参考实验流程与报告写法的本科生,也可供复习交换机与VLAN配置的读者使用。压缩包内仅1个PDF文件,约1.17MB,内容以图文形式呈现,便于直接阅读和打印。报告围绕GNS3安装使用与交换机技术展开,涵盖网络拓扑搭建、网络设备基础操作、交换机基本配置、VLAN基础配置及VLAN间通信等实验目的,并记录了同VLAN内PC连通性测试、不同VLAN间通过路由器实现互通的对比验证,以及使用Wireshark抓取Trunk流量并分析IEEE 802.3帧结构、逻辑链路控制与思科发现协议等过程。读者可借此了解实验步骤、截图记录方式与结果分析思路,作为撰写同类实验报告的参考。目前已有71人学习下载。
1. 一份实验报告为什么值得逐行拆解
很多人看到「广工2015年计算机网络实验报告.pdf」这个标题,第一反应是:不就是一份学生作业吗,有什么好讲的。但如果你真正带过新人、或者自己从抓包工具都装不利索的阶段走过来,就会明白这类实验报告其实是一份被严重低估的「最小可复现网络实验清单」。它把计算机网络课程里最核心的几件事——协议分层、抓包分析、Socket 编程、路由与子网——压缩成了几个能在宿舍电脑上跑通的实验。问题在于,PDF 本身只给结论和截图,不给环境配置、不给踩坑记录、不给参数为什么这么设。你照着抄,大概率卡在第一步。这篇笔记要做的事,就是把这份报告背后的实验体系拆开,告诉你每个实验到底在验证什么、环境怎么搭、代码怎么写、报错怎么查。适合正在补网络基础的程序员、准备复试或面试的应届生,以及想带学生做实验但缺一套可落地流程的助教。核心不是复现某一份 PDF,而是掌握这套实验方法论。
2. 抓包实验:从 Wireshark 过滤器到三次握手时序
抓包是网络实验里最直观的一环,也是「广工2015年计算机网络实验报告」里出现频率最高的部分。当年报告里用的是 Wireshark,今天依然是主流。但很多人装了 Wireshark 之后,面对满屏数据包直接懵掉,不知道从哪看起。这一章把抓包实验拆成可执行的步骤,重点讲过滤器怎么写、握手过程怎么定位、常见误判怎么排除。
2.1 实验环境搭建与网卡选择
先解决环境问题。Wireshark 在 Windows、macOS、Linux 上都能装,官网直接下载对应版本即可。安装时 Windows 会提示安装 Npcap,这是抓包驱动,必须装,否则网卡列表是空的。装完之后打开软件,第一件事是选网卡。这里有个新手最容易翻车的地方:笔记本同时有有线和无线网卡,还可能有虚拟网卡(VMware、VirtualBox 装的),选错了就什么都抓不到。
判断方法很简单:看哪个网卡有流量波动。Wireshark 首页的网卡列表里,每个网卡后面有个迷你折线图,有波动的就是当前在用的。如果分不清,就先断开无线、只插网线,或者反过来,逐个排除。选定网卡后双击进入抓包界面,此时数据已经开始滚动。
提示:如果列表里出现一堆「本地连接」「以太网」分不清,可以在命令行执行
ipconfig(Windows)或ifconfig(macOS/Linux)看当前活动网卡的 IP,再回 Wireshark 对照。
抓包前建议先设一个捕获过滤器,减少无关流量。捕获过滤器在选网卡界面下方的输入框里填,语法是 BPF 语法。比如只抓 HTTP 流量:
tcp port 80这行命令的意思是只捕获 TCP 协议且端口为 80 的数据包。注意捕获过滤器和显示过滤器是两回事,前者在抓之前生效,后者在抓之后筛选。新手常把两者语法搞混,比如在捕获过滤器里写http,结果报错,因为http是显示过滤器语法,捕获过滤器要用tcp port 80。
2.2 用显示过滤器定位 TCP 三次握手
抓包容易,看懂难。三次握手是网络实验的必考项,但满屏包里怎么快速找到某一次完整的握手?靠显示过滤器。最实用的组合是:
tcp.flags.syn == 1 && tcp.flags.ack == 0这行过滤出所有「SYN 置位且 ACK 未置位」的包,也就是三次握手的第一步 SYN 包。找到它之后,右键该包,选择 Follow → TCP Stream,Wireshark 会自动把这次连接的所有包串起来,握手、数据传输、挥手一目了然。
三次握手的标准时序是:客户端发 SYN(seq=x),服务端回 SYN+ACK(seq=y, ack=x+1),客户端再发 ACK(ack=y+1)。在 Wireshark 里,你看到的 seq 和 ack 是相对值还是绝对值,取决于设置。默认是相对值,从 0 开始,方便阅读。如果想看真实序列号,在 Preferences → Protocols → TCP 里取消 Relative sequence numbers。
这里有个常见误判:很多人以为抓到 SYN 就代表连接成功,其实 SYN 只是请求,如果服务端没回 SYN+ACK,说明端口没开或被防火墙拦了。排查时看有没有对应的 RST 包,RST 表示拒绝连接。
2.3 抓包实验的四个典型翻车点
第一个翻车点:抓不到任何包。原因通常是网卡选错,或者没装 Npcap。解决方法是重装 Wireshark 并勾选 Npcap,或者换网卡重试。
第二个翻车点:抓到大量重复包。这通常是开启了「混杂模式」但网络里有广播风暴,或者抓包过滤器没设。解决方法是加捕获过滤器,只抓目标 IP 或端口。
第三个翻车点:时间戳乱序。Wireshark 默认按抓包顺序显示,但网络包可能乱序到达。如果要做时序分析,在 View → Time Display Format 里选「Time of Day」或「Seconds Since Beginning of Capture」,别用默认的相对时间。
第四个翻车点:HTTPS 流量看不懂。2015 年很多实验还在抓 HTTP,现在大部分网站是 HTTPS,抓到的内容是加密的。这不是抓包工具的问题,是协议本身加密了。想分析 HTTPS,需要配置 SSLKEYLOGFILE 环境变量,让浏览器导出密钥,再在 Wireshark 里加载。这个操作在报告里通常不会写,但实际做实验时绕不开。
3. Socket 编程实验:从 TCP 回声服务到多线程并发
Socket 编程是「广工2015年计算机网络实验报告」里代码量最大的部分。当年报告里大概率用的是 C 或 Java,但现在用 Python 复现更快,也更容易看清逻辑。这一章给出一套最小可运行的 TCP 回声服务端和客户端,再扩展到多线程并发,最后讲清楚阻塞、粘包、端口复用这几个必踩的坑。
3.1 最小 TCP 回声服务端与客户端
先看服务端代码,Python 实现,20 行以内:
import socket # 创建 TCP socket server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 设置端口复用,避免重启时报 Address already in use server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # 绑定地址和端口,0.0.0.0 表示监听所有网卡 server.bind(('0.0.0.0', 8888)) # 开始监听,参数 5 是等待队列长度 server.listen(5) print('服务端启动,监听 8888 端口') while True: # 阻塞等待客户端连接 conn, addr = server.accept() print(f'客户端 {addr} 已连接') # 接收数据,1024 是缓冲区大小 data = conn.recv(1024) if data: # 回声:把收到的数据原样发回 conn.sendall(data) # 关闭连接 conn.close()逻辑说明:socket.AF_INET表示 IPv4,SOCK_STREAM表示 TCP。SO_REUSEADDR是关键参数,不加的话服务端重启时如果端口还没释放,会报OSError: [Errno 98] Address already in use。listen(5)里的 5 是 backlog,表示最多允许 5 个连接排队等待 accept,超过的会被拒绝。recv(1024)表示一次最多读 1024 字节,如果客户端发的内容超过这个数,需要循环读。
客户端代码:
import socket client = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务端,如果是本机就用 127.0.0.1 client.connect(('127.0.0.1', 8888)) # 发送数据,encode 把字符串转成字节 client.sendall('hello socket'.encode('utf-8')) # 接收回声 resp = client.recv(1024) print('收到回声:', resp.decode('utf-8')) client.close()先运行服务端,再运行客户端,客户端会打印出收到回声: hello socket。这个实验验证的是 TCP 的可靠传输:客户端发什么,服务端原样返回,中间没有丢包或乱序。
3.2 多线程并发与粘包问题
上面的服务端一次只能处理一个连接,处理完就 close,第二个客户端必须等第一个结束。实际实验里通常要求支持多个客户端同时连接,这就需要用多线程。改造服务端:
import socket import threading def handle_client(conn, addr): print(f'客户端 {addr} 已连接') try: while True: data = conn.recv(1024) if not data: break conn.sendall(data) finally: conn.close() print(f'客户端 {addr} 已断开') server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server.bind(('0.0.0.0', 8888)) server.listen(5) print('多线程服务端启动') while True: conn, addr = server.accept() # 每个连接开一个线程处理 t = threading.Thread(target=handle_client, args=(conn, addr)) t.start()关键变化是handle_client里用了while True循环读,直到recv返回空字节(表示客户端关闭)。每个连接独立线程,互不阻塞。
但这里有个经典问题:粘包。TCP 是字节流协议,没有消息边界。如果客户端连续发两次sendall,服务端可能一次recv就把两条消息都读出来,也可能分两次读。实验里如果要求「发一条收一条」,就必须自己定义消息边界。常见做法是加长度头:先发 4 字节表示消息长度,再发消息体。或者用换行符分隔,recv后按\n切分。
注意:粘包不是 bug,是 TCP 的特性。UDP 有消息边界,但不可靠。选 TCP 就要自己处理边界。
3.3 Socket 实验的参数调优与排查
几个必调参数:recv的缓冲区大小建议设 4096 或 8192,太小会导致频繁系统调用,太大浪费内存。listen的 backlog 在实验环境设 5 够用,生产环境要设 128 以上。SO_REUSEADDR必开,否则调试时反复重启服务端会疯掉。
排查连接失败时,按这个顺序看:先确认服务端是否真的在监听,用netstat -an | grep 8888(Linux/macOS)或netstat -an | findstr 8888(Windows)。如果显示 LISTENING,说明服务端没问题。再看客户端连的 IP 对不对,本机测试用 127.0.0.1,跨机测试要用服务端的局域网 IP,不能用 127.0.0.1。最后看防火墙,Windows 防火墙默认会拦入站连接,实验时临时关闭或加规则。
如果recv一直阻塞不返回,说明客户端没发数据,或者发了但没发出去。检查客户端的sendall是否执行到,可以在发送前后加 print。如果sendall报BrokenPipeError,说明服务端已经关闭了连接,客户端还在发,通常是服务端处理逻辑有异常提前退出了。
4. 子网划分与路由实验:用 Packet Tracer 验证连通性
子网划分和路由配置是网络实验里最「纸上谈兵」的部分,但「广工2015年计算机网络实验报告」里通常会用 Cisco Packet Tracer 做仿真验证。这一章讲清楚子网划分的计算方法、Packet Tracer 里的拓扑搭建步骤,以及静态路由和动态路由的选择依据。
4.1 子网划分的手算方法与验证
子网划分的核心是借位。给定一个网段,比如 192.168.1.0/24,要划分成 4 个子网,需要借 2 位主机位(2^2=4),子网掩码从 /24 变成 /26,即 255.255.255.192。每个子网有 64 个地址,可用主机地址 62 个(去掉网络地址和广播地址)。
四个子网分别是:
- 192.168.1.0/26,可用范围 192.168.1.1 ~ 192.168.1.62
- 192.168.1.64/26,可用范围 192.168.1.65 ~ 192.168.1.126
- 192.168.1.128/26,可用范围 192.168.1.129 ~ 192.168.1.190
- 192.168.1.192/26,可用范围 192.168.1.193 ~ 192.168.1.254
手算时容易错的地方是网络地址和广播地址的边界。记住:网络地址是子网第一个地址,广播地址是最后一个地址,这两个不能分配给主机。验证方法是用计算器把 IP 和掩码做按位与,结果就是网络地址。
4.2 Packet Tracer 拓扑搭建与静态路由配置
Packet Tracer 是 Cisco 出的仿真工具,免费注册后可用。搭建一个最小路由实验:两台路由器 R1 和 R2 直连,R1 下挂一个子网 192.168.1.0/24,R2 下挂 192.168.2.0/24,要求两边能互通。
步骤:拖两台 2811 路由器,两台 2960 交换机,四台 PC。R1 和 R2 之间用交叉线(虚线)连 FastEthernet0/0,PC 用直通线(实线)连交换机,交换机连路由器。然后配置 IP:
R1 配置:
R1> enable R1# configure terminal R1(config)# interface FastEthernet0/0 R1(config-if)# ip address 10.0.0.1 255.255.255.252 R1(config-if)# no shutdown R1(config-if)# exit R1(config)# interface FastEthernet0/1 R1(config-if)# ip address 192.168.1.1 255.255.255.0 R1(config-if)# no shutdownR2 配置类似,FastEthernet0/0 配 10.0.0.2/30,FastEthernet0/1 配 192.168.2.1/24。然后加静态路由:
R1(config)# ip route 192.168.2.0 255.255.255.0 10.0.0.2 R2(config)# ip route 192.168.1.0 255.255.255.0 10.0.0.1这行的意思是:要去 192.168.2.0/24 的包,下一跳交给 10.0.0.2。配置完后用 PC 的 ping 命令验证,PC1 ping PC2 应该通。
4.3 静态路由与动态路由的选择依据
实验报告里通常两种都要求做。静态路由适合小型网络,配置简单,不占带宽,但网络拓扑一变就要手动改。动态路由(RIP、OSPF)适合大型网络,自动收敛,但配置复杂,有收敛时间。
Packet Tracer 里配 RIP 很简单:
R1(config)# router rip R1(config-router)# version 2 R1(config-router)# network 192.168.1.0 R1(config-router)# network 10.0.0.0OSPF 类似,把router rip换成router ospf 1,network 后面加 area 0。选择依据:实验环境用静态路由足够,能看清下一跳逻辑;如果实验要求模拟企业网,用 OSPF 更贴近实际。
排查连通性问题时,按层查:先看接口是否 up(show ip interface brief),再看路由表有没有目标网段(show ip route),最后用traceroute看包在哪一跳丢了。常见错误是子网掩码配错,比如把 /30 的互联地址配成 /24,导致路由表混乱。
5. 实验报告里的避坑与常见问题排查
这一章集中处理「广工2015年计算机网络实验报告」这类文档在实际复现时最容易卡住的地方。每一条都按现象、原因、解决来写,都是血泪经验。
5.1 抓包时网卡选错导致零流量
现象:Wireshark 启动后界面一片空白,或者只有零星几个包,和目标流量完全对不上。
原因:笔记本有多块网卡,默认选中的可能是虚拟网卡或已断开的无线网卡。虚拟网卡(VMware Network Adapter)通常没有实际流量。
解决:在 Wireshark 首页看每个网卡的流量折线图,选波动最大的那个。如果不确定,先在命令行ping一个外网地址,观察哪个网卡的折线在动。另外,如果用的是无线网卡,确认没有开启「监控模式」和「混杂模式」的冲突,普通实验不需要混杂模式。
5.2 Socket 服务端重启报端口占用
现象:Python 服务端 Ctrl+C 停止后,立刻重新运行,报OSError: [Errno 98] Address already in use。
原因:TCP 连接关闭后,端口会进入 TIME_WAIT 状态,默认持续 2 分钟左右,期间不能重新绑定。
解决:在bind之前加server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)。这行代码告诉操作系统,端口释放后可以立即重用。注意 Windows 和 Linux 行为略有差异,Linux 上还需要考虑SO_REUSEPORT,但实验环境SO_REUSEADDR足够。
5.3 Packet Tracer 里 PC 的网关没配
现象:PC 能 ping 通同子网的其他 PC,但 ping 不通其他子网,路由器配置看起来没问题。
原因:PC 的默认网关没填,或者填错了。PC 发包到其他子网时,不知道交给哪个路由器,直接丢弃。
解决:在 Packet Tracer 里点开 PC → Desktop → IP Configuration,Gateway 填直连路由器的接口 IP。比如 PC 在 192.168.1.0/24,直连 R1 的 Fa0/1 是 192.168.1.1,网关就填 192.168.1.1。填完后 PC 的路由表里会多一条默认路由。
5.4 子网划分时广播地址当主机地址用
现象:配置完 IP 后,同子网内能通,跨子网不通,或者 ping 时断时续。
原因:把广播地址分配给了主机。比如 192.168.1.63 是 192.168.1.0/26 的广播地址,配上去之后,该主机会收到所有广播包,但正常单播可能被丢弃。
解决:重新计算可用地址范围。网络地址和广播地址永远不能分配给主机。用在线子网计算器验证,或者手算:网络地址 = IP & 掩码,广播地址 = 网络地址 | (~掩码)。
5.5 多线程 Socket 实验里客户端不关闭连接
现象:服务端线程数越来越多,内存上涨,最终卡死。
原因:客户端代码里忘了client.close(),或者异常退出时没走 close。服务端的recv一直阻塞,线程不释放。
解决:客户端用with语句管理 socket,或者 try/finally 确保关闭。服务端在handle_client里设超时:conn.settimeout(60),超过 60 秒没数据就自动断开。另外,服务端可以维护一个连接计数,超过阈值时拒绝新连接,防止资源耗尽。
6. 把实验报告变成可复用的网络调试能力
这份「广工2015年计算机网络实验报告.pdf」最大的价值,不是那几个实验本身,而是它逼你走了一遍「抓包看现象 → 写代码验证 → 配路由连通」的完整链路。这套链路放到今天的工作里依然管用:线上服务连不上,先抓包看三次握手有没有完成;自己写的服务端吞吐上不去,先查 Socket 缓冲区设了多少;跨机房调不通,先看路由表和子网掩码。我自己的习惯是,每做一个网络相关的项目,先在本机用 Wireshark 抓一遍正常流程的包,存成 pcap 文件当基线。后面出问题时,抓一份新的对比,差异点往往就是根因。这个习惯就是从当年做实验报告时养成的,那时候为了截图三次握手,反复抓了十几次才抓到干净的包。另外,Packet Tracer 虽然是个仿真工具,但它对理解路由收敛过程很有帮助,比直接看traceroute输出直观得多。如果你正在补网络基础,建议不要只抄报告里的命令,而是把每个实验的拓扑画出来,标上 IP 和掩码,再自己推一遍包的走向。推不通的地方,就是你没真懂的地方。希望帮到你。
本文还有配套的精品资源,点击获取