简介:面向计算机网络课程综合实验与课程设计场景,资源以华北电力大学《互联网综合设计与网络协议分析》实验报告为主体,内容覆盖交换机与路由器基本配置、VLAN划分及VLAN间通信、OSPF/RIP v2/静态路由配置、静态NAT与动态NAT/NAPT地址转换,以及TCP建立与释放连接时的数据帧捕获和协议分析。压缩包共1个文件,为doc格式综合报告,约21.91MB,内含实验任务书、完整网络拓扑设计、IP与VLAN规划、OSPF多区域划分及链路状态观察方法、主要配置命令与关键代码片段,便于对照练习和验收准备。已有154人学习下载,适合需要参考完整实验流程、动手配置思路与报告写作规范的本科生使用。
1. 为什么一份“能跑”的实验报告比课程本身更值钱
如果你正准备华北电力大学计算机网络实验,最该问的问题不是“报告怎么写”,而是“这份实验到底要验证什么、代码怎么敲出来、验收时老师会揪哪里”。很多同学把时间花在抄实验书、贴抓包截图、拼格式,结果最后一步现场演示时,程序起不来、PC 之间 ping 不通、实验报告里只贴了 Wireshark 的图却说不出过滤条件。这门课按谢希仁《计算机网络》和自顶向下教材的思路走,实验覆盖交换机配置、静态路由、ARP、TCP、UDP、HTTP 等核心主题,实验报告的得分点其实很固定:拓扑图画对、关键代码能跑、抓包能讲出字段、实验结论明确。
我见过太多高分报告的共性——不是写得花哨,而是每一项都有能复现的命令和代码,老师问的时候敢当场敲一遍。反过来,低分报告的死法也雷同:README 写了一堆,主程序跑不起来;WiresHark 截了图却不标序号;TCP 三次握手抓到了却分不清 SYN 和 ACK 的确认号递进关系。这篇文章直接按华北电力大学计算机网络实验的常见题目走,把实验一(组网与静态路由)、实验二(ARP 与 ICMP 分析)、实验三(TCP/UDP Socket 编程)这三块拆开讲,重点放在每份报告都要附的“主要代码”——不只是贴源码,而是给你能跑、能改、能讲明白的版本。
适用人群很明确:正在写实验报告需要代码兜底的本科生、准备复试机考要补网络编程的考生、以及想把手头 Packet Tracer 实验升级成“带真实代码”的作业党。这篇文章不会教你封装一个图书馆管理系统来撑字数,而是让你拿着代码到机房二十分钟内复现结果。后面每一章都按“我要交什么、代码在干什么、验收会被问什么”来写,尽量让新手跟得上步骤,熟手能直接拿去改参数。
2. 组网与静态路由实验:拿 Packet Tracer 和 GNS3 把拓扑图变成“能讲”的配置
2.1 实验拓扑怎么搭:三台路由器六台 PC 的地址规划要点
华北电力大学计算机网络实验里,组网实验最常见的拓扑是“三台路由器串成一条线,每台路由器下挂一台交换机、交换机接两台 PC”,拓扑看起来简单,但地址规划错了后面全崩。常见要求是 R1-R2 之间用 10.0.1.0/30,R2-R3 之间用 10.0.2.0/30,PC1、PC2 挂在 R1 下的 192.168.1.0/24,PC3、PC4 挂在 R2 下的 192.168.2.0/24,PC5、PC6 挂在 R3 下的 192.168.3.0/24。这里有一个特别容易翻车的点:很多人把 R1-R2 的互联地址写成 10.0.1.1 和 10.0.1.2,掩码却写成 255.255.255.0,这导致 R1 的路由表里认为 10.0.1.0/24 直连,而 R2 又同时在同一个网段里配了另一个接口地址,路由环回和 ARP 冲突接踵而至。
地址规划我给一套稳定的参考做法。R1 的接口地址按顺序来:G0/0/0 配 10.0.1.1/30,G0/0/1 配 192.168.1.254/24;R2 的 G0/0/0 配 10.0.1.2/30,G0/0/1 配 10.0.2.1/30,G0/0/2 配 192.168.2.254/24;R3 的 G0/0/0 配 10.0.2.2/30,G0/0/1 配 192.168.3.254/24。PC 的网关分别指向各自网段的 .254 地址。这样规划的优势是所有互联段都用 /30,只允许两个 IP 地址,Route 表的条目自然;而每个 PC 网段是独立广播域,便于后面用 ping 和 tracert 验证路径。
# R1 基础接口配置(Cisco IOS 命令行) interface g0/0/0 ip address 10.0.1.1 255.255.255.252 no shutdown interface g0/0/1 ip address 192.168.1.254 255.255.255.0 no shutdown这段配置的逻辑说明:g0/0/0是 R1 朝 R2 方向的互联口,掩码 255.255.255.252 就是 /30,整个网段只容纳 10.0.1.1 和 10.0.1.2 两个可用地址,避免广播过多。g0/0/1连交换机,用 /24 掩码给 PC 分配地址。注意接口必须no shutdown,很多同学 Packet Tracer 里配置完忘了开启接口,物理链路显示为 down,ping 的结果是目标不可达,这个印象分丢了很冤。
2.2 静态路由配置:每条命令背后的路由语义
组网实验第二部分是让全网互通,做法是静态路由。静态路由的力量在于每条表项都是白纸黑字的“你要去哪个网段,走哪一跳”,老师验收时让你解释每一条都很容易。R1 需要两条静态路由:去 192.168.2.0/24 走 10.0.1.2,去 192.168.3.0/24 也要走 10.0.1.2,因为 R2 是下一跳。R2 需要两条:去 192.168.1.0/24 走 10.0.1.1,去 192.168.3.0/24 走 10.0.2.2。R3 同理,两条都指向 R2。
# R1 上配置静态路由 ip route 192.168.2.0 255.255.255.0 10.0.1.2 ip route 192.168.3.0 255.255.255.0 10.0.1.2# R2 上配置静态路由 ip route 192.168.1.0 255.255.255.0 10.0.1.1 ip route 192.168.3.0 255.255.255.0 10.0.2.2这些命令的逻辑要点在于:下一跳地址必须是“本路由器直连网段内的可达地址”。比如 R1 的下一跳 10.0.1.2 就在它的直连网段 10.0.1.0/30 内,路由器把数据包交给该地址时,底层会先查 ARP 表拿到 MAC 地址再封装帧头。如果你下一跳写成了 192.168.2.1,R1 发现这个地址不在任何直连网段,路由表里虽然写了条目但它不知道如何去解析 MAC,数据包就会一直挂在路由器的黑洞里。
配置完后验证手段按顺序来:第一跳检查每台路由器上show ip route是否出现完整的 C 和 S 路由;第二跳从 PC1ping 192.168.3.1即 PC5 的地址,通了代表 R1-R2-R3 全链路没问题;第三跳再tracert 192.168.3.1看路径是否依次弹出三个路由器的接口地址。实验报告里把这三步的输出截进去,比任何大段文字都更能证明你通了。
2.3 实验报告里“静态路由”部分最该写什么
报告撰写时不要抄设备配置作为唯一内容。华北电力大学的实验报告模板一般包含“实验目的、实验原理、实验步骤、实验结果、实验结论”,但拿高分的关键是“实验原理”和“实验结果分析”。我的建议是多写一段“路由决策过程”:当 PC1(192.168.1.1)访问 PC5(192.168.3.1)时,数据包经历什么。具体写清三步——PC1 发现目标不在本网段,将帧发给网关 192.168.1.254;R1 查路由表,匹配到 192.168.3.0/24 条目的下一跳是 10.0.1.2,重新封装帧头后从 g0/0/0 发出;R2 收到后再查表转发给 R3。这一段写清楚了,说明你真懂,而不是只会复制配置命令。同时放一张截图,是 PC1 上ping 192.168.3.1的成功返回与tracert的三跳路径。最后给一个路由表条目含义表格:表项顺序、目的网段、掩码、下一跳、出接口,五列写清楚,这就是报告里一个非常专业的信息化段落。
3. ARP 与 ICMP 抓包分析实验:Wireshark 过滤器写到什么程度才算会
3.1 实验前准备:让抓包数据“符合教材经典预期”的环境设置
这个实验通常是两台真实 PC 或一台 PC 加一台虚拟机的有线连接,要求在 Ping 被清空 ARP 缓存后首次通信时抓包。简单说就是让你观察“先 ARP 后 ICMP Echo Request 再 ICMP Echo Reply”的完整过程。如果你直接在机房随便抓,会发现 ARP 报文刷得很快,一个 Request 可能带出一堆广播风暴,或者你抓到的是已经解析完 MAC 地址后的纯 ICMP 包,那就看不到实验报告要的 ARP 细节。
我一般建议先把 Windows 的命令行环境干净化,在管理员 PowerShell 里执行arp -d清空本机 ARP 缓存。注意arp -d只能清静态表项和动态表项里非本机的条目,你本机网卡的 MAC 不会消失,但足够确保下一次访问 192.168.x.1 时触发重新 ARP。实验环境用一台 Windows 笔记本加一台虚拟机 Ubuntu 就够,两个网卡必须在同一个 /24 网段,虚拟机网络模式选“桥接”而不是 NAT,因为 NAT 模式会有一层虚拟网卡地址转换,抓到的包多了几层无法对应教材的纯净模型。
# Windows 命令行(管理员身份) arp -d ping 192.168.1.1 # Ubuntu 虚拟机查看本机 ARP 表 arp -n命令行执行后 Wireshark 里过滤器写arp or icmp。逻辑是:arp协议用来观察 MAC 地址解析过程,icmp用来观察 Echo 报文请求与响应。注意如果你只在过滤器里敲icmp,那 ARP 报文会被过滤掉,实验就看不到完整链路了。抓包结果里你会看到四条报文按顺序排列:ARP Request(广播到 FF:FF:FF:FF:FF:FF)、ARP Reply(单播返回请求方)、ICMP Echo Request(目标 MAC 是网关 MAC)、ICMP Echo Reply(原路返回)。这四条报文截图加序号,就是实验报告里的一类经典证据。
3.2 抓包之后怎么“讲协议”:ARP 字段和 ICMP 报文的核对技巧
抓到包之后最容易犯的错是“截了图却不知道下一步该看什么”。实验报告要求你对协议字段做分析,而不是只放一张截图。Wireshark 的中下面板已经帮你拆好了各层字段,你需要做的就是把关键字段摘录到报告里并解释含义。ARP Request 部分要重点写:发送方 MAC、发送方 IP、目标 MAC 为全 0、目标 IP 是网关 IP。它代表“谁知道 192.168.1.1 的 MAC 地址,请告诉 192.168.1.2”,此时目标 MAC 置成全 0 表示未知。ARP Reply 部分则要写清:发送方 MAC 变成网关 MAC、目标 MAC 变成请求方的 MAC、OPERATION 字段从 1(Request)变 2(Reply)。
ICMP 报文分析相对简单,但有一个必须写清的点:Echo Request 和 Echo Reply 的 Identifier 与 Sequence Number 是否一致。教材上会告诉你这两个字段用来匹配请求与响应,你在实验报告里写的正确操作是把 Request 包第 4 层的 Identifier 值和 Reply 包做对比,如果一致,说明这对请求-响应对是匹配的。我在给学生的报告中看到的高频错误是:直接抄“Identifier 和 Sequence Number 相同表示匹配成功”,但自己根本没点开两个包对比。验收时老师问“你说相同,截图里数值是多少”,当场哑火。所以报告里别写套话,截图标出两个包的 Identifier 具体值是 0x0001,Sequence Number 是 1,这就足够扎实了。
3.3 抓包实验的四个高频翻车现场与对策
实验过程中最让人上火的坑不是抓不到包,而是抓了一堆乱七八糟的包却开始怀疑人生。第一个高频问题:清空 ARP 后 ping 网关,Wireshark 只显示 ICMP 而 ARP 不见了。原因是 Windows 系统可能还在使用邻居缓存,arp -d在执行时并不总能立刻清掉所有已解析地址。解决方法是先用netsh interface ip delete arpcache再执行一次arp -d,也可以等待 30 秒再 ping。第二个问题:抓包时看到大量 TCP 后台流量,实验环境不干净。解决方法是开启 Wireshark 的捕获过滤器,在“Capture Filter”里写arp or icmp,这样只留两种协议,后面解析更省力气。第三个问题:ubuntU 虚拟机 ping 不通 Windows 宿主机,检查虚拟机网卡是否桥接到宿主机网卡而不是默认的 NAT 虚拟网卡。第四个问题是 ARP 报文在交换机上会被泛洪,导致你抓到别人的 ARP 包;在实验报告里不要慌,只要过滤出目标 IP 是你自己的报文即可,这也是 Wireshark 显示过滤器存在的意义。
4. Socket 编程实验:UDP 与 TCP 代码怎么写得像“实验报告要求”而不是玩具
4.1 基于 UDP 的回显程序:用 Python 写一个能答辩的最小实现
华北电力大学计算机网络实验的编程题一般有两种:一是基于 UDP 的“客户端发一串消息,服务器原样返回”,二是基于 TCP 的“客户端传文件名,服务器返回文件内容”。核心代码量不大,但报告里必须写清“套接字工作流程、API 的每个参数含义、粘包问题如何处理、怎么验证”。这里我用 Python 写,因为机房评测和课程验收大多接受 Python 3 或 Java,Python 代码量最少,讲起来也顺。
# udp_echo_server.py import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_socket.bind(('0.0.0.0', 8888)) print("UDP echo server running on port 8888") while True: data, client_addr = server_socket.recvfrom(1024) print(f"received {len(data)} bytes from {client_addr}") server_socket.sendto(data, client_addr)这段代码的逻辑说明:AF_INET指定 IPv4 地址族,SOCK_DGRAM指定 UDP 数据报协议;bind(('0.0.0.0', 8888))让服务器监听所有网卡接口的 8888 端口,0.0.0.0而不是127.0.0.1很关键,否则另一台机器无法访问。recvfrom(1024)一次读取最多 1024 字节的 UDP 数据,返回值包括数据和客户端地址;sendto(data, client_addr)向原客户端地址发回数据。这里没有建立连接的过程,UDP 的每个sendto/recvfrom都是独立的,这就是“无连接”传输的直观体现。
# udp_echo_client.py import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) server_addr = ('127.0.0.1', 8888) message = b"hello network lab" client_socket.sendto(message, server_addr) data, _ = client_socket.recvfrom(1024) print(f"echo from server: {data.decode()}") client_socket.close()客户端这边的关键点:sendto(message, server_addr)发送时是不需要先建立连接的,但如果服务器不在线,UDP 本身不会告诉你“失败”,recvfrom会一直阻塞。所以实验演示时要先启动 server,再启动 client。另一个容易踩的坑是recvfrom接收缓冲区设 1024,而发送端发来的数据如果超过 1024 字节,会截断——UDP 不会自动帮你拆包,超过缓冲区的内容直接丢掉。课堂实验里很多人发一大段字符串回来被截断,然后误以为程序写错了。
4.2 基于 TCP 的简单文件传输:三次握手、粘包与循环接收
TCP 版的实验常被要求做成“客户端请求文件名,服务器读取本地文件并回传内容”。如果只写一个send一次recv,在小文件场景下能跑,但验收老师问“如果文件超过 4KB 会怎样”,你说不出来就露怯了。正确做法是循环接收直到对端关闭连接,并用sendall发送整个文件内容。
# tcp_file_server.py import socket server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) server_socket.bind(('0.0.0.0', 9999)) server_socket.listen(5) print("TCP file server running on port 9999") while True: conn, addr = server_socket.accept() print(f"client connected from {addr}") filename = conn.recv(1024).decode().strip() try: with open(filename, 'rb') as f: file_data = f.read() conn.sendall(file_data) except FileNotFoundError: conn.sendall(b"ERROR: file not found") conn.close()TCP 版代码的关键逻辑:listen(5)代表内核维护的连接队列长度为 5,超过长度的连接请求会被拒绝;accept()返回一个新的conn套接字,用于和单个客户端通信,而监听套接字server_socket继续等待其他连接。recv(1024)在 TCP 里可能只收到部分数据,所以如果要接收的文件名恰好超过 1024 字节,需要循环接收,但实验题目的文件名一般较短,一次接收就能拿到。sendall(file_data)是重点,它循环调用底层send,直到所有数据都发完,避免大文件只发送了一部分就返回。
# tcp_file_client.py import socket client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) client_socket.connect(('127.0.0.1', 9999)) filename = "lab_report.txt" client_socket.sendall(filename.encode()) received = b"" while True: chunk = client_socket.recv(4096) if not chunk: break received += chunk client_socket.close() print(f"received {len(received)} bytes from server")客户端循环接收的逻辑:recv(4096)返回空字节串表示服务器已经关闭连接,此时退出循环。这就是 TCP 和 UDP 的最大区别:TCP 是字节流,没有消息边界,必须靠循环接收或自定义协议边界来保证读取完整数据。UDP 是一次一个数据报,边界天然存在。报告里你可以把这个对比写进去,老师会认为你对传输层协议的理解是到位的。
4.3 编程实验报告里代码之外的“分析杀手锏”
很多人的代码能跑,但报告只有三段:贴代码、贴运行截图、写“实验成功”。这不是分析。华中地区高校的计算机网络实验通常要求“代码注释 + 关键报文格式”,你可以在报告里加一个“消息格式设计”小节,用表格写清:字段名、类型、长度、说明。比如 UDP 回显程序中,消息格式就是纯 payload,无额外头部;TCP 文件传输里,客户端首包是文件名字节串,服务器返回文件内容的字节流。当你把字段结构说清楚,老师就知道你不是只调通了代码,而是真的在“设计协议”。
另外,编程实验还常被问到“如果 UDP 消息很大怎么办”、“TCP 为什么叫可靠传输”。报告里可以补一段“扩展思考”:UDP 在局域网传输时不会自动分片,超过 MTU(通常 1500 字节)会引发 IP 分片,而 IP 分片会增加丢包概率和重组开销;TCP 则根据 MSS 做分段,由接收方通告窗口控制发送量。这些内容不一定都在实验课上明确要求,但写进报告里是加分项,前提是你能讲明白,不是为了堆术语。
5. 实验报告避坑指南:四个“平时没人提醒、验收现场哭”的细节
5.1 抓包截图模糊不清,老师根本看不清字段值
现象:实验报告里截了 Wireshark 的窗口,但重要字段被折叠、字体小到看不清,或者截图里同时包含一堆不相关报文。原因:很多人直接按PrintScreen截全屏,报告排版时缩小了图片,三层结构全部变成马赛克。解决:抓包后先调整 Wireshark 显示过滤器,只显示与实验相关的报文;点击展开该报文各层字段;用窗口截图工具只截协议详情面板,保证关键的 MAC 地址、IP 地址、端口号清晰可读。报告里每个截图下方加一行说明,指明图中序号和对应字段含义。
5.2 静态路由配置完 ping 通了一次,重启设备后全断
现象:Packet Tracer 里配完路由后测试全通,保存关闭后再打开,设备配置全部消失,路由表空。原因:没做保存,copy running-config startup-config没执行,或者直接关闭模拟器软件,配置只存在于运行内存里。解决:每台路由器配置结束后,在特权模式下执行copy running-config startup-config,回车确认保存到 startup-config。这一条看似简单,却是验收时设备重启后还能不能展示成果的分水岭。实验报告里也可以写一句“本实验所有设备已完成配置持久化”,显示你的工程意识。
5.3 ARP 实验时 ping 通了但抓不到 ARP 包
现象:执行arp -d后立即 ping 网关,Wireshark 里只有 ICMP 没有 ARP。原因:Windows 的邻居缓存清理不是同步的,也可能你抓包过滤器写的是icmp而不是arp or icmp。解决:先设置捕获过滤器arp or icmp,再在管理员终端执行netsh interface ip delete arpcache,等待两秒后 ping。如果依然没抓到 ARP,可以换一个目标地址,比如 ping 另一网段的新地址(尚未解析过 MAC),这样必然触发 ARP。不要慌,这个现象在真实 Windows 环境经常出现,属于实验环境细节,不是协议没学懂。
5.4 Python 代码在机房运行报“Address already in use”
现象:上次运行服务器程序后 Ctrl+C 关闭,再次运行时抛出OSError: [Errno 98] Address already in use。原因:TCP 连接关闭后,端口进入 TIME_WAIT 状态,默认要等 2 分钟才释放;UDP 虽然没有连接状态,但如果上一次进程没有完全退出,端口仍被占用。解决:在bind()之前调用setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1),让端口在关闭后允许立即重用。这一步在实验报告里可以作为“常见问题与解决”小节写进去,很多同学不会写,你写了就是亮点。
6. 验收答辩前的最后把关:按这份核对表自查,能挡住九成扣分
实验报告交出去是一回事,现场演示答辩是另一回事。华北电力大学的计算机网络实验通常有“演示 + 提问”环节,老师会随机挑一台设备或一段代码问你“为什么这么配”“这条命令删了会怎样”。我建议你按下面的顺序在验收前做一轮自查,每一项都实际打一遍,不要只看报告。
先查组网实验:从 PC1 ping PC5 是否通;show ip route里静态路由条目是否齐全;故意删掉 R2 上 192.168.3.0/24 的路由,再用 PC1 ping PC5,观察“目标不可达”还是“超时”——前者说明有路由但下一跳不对,后者说明根本没匹配到路由,这两个结论老师大概率会问。再查抓包实验:现场清 ARP 缓存再 ping 网关,Wireshark 是否能复现 ARP Request/Reply 和 ICMP Echo 的完整序列;当场点开两个 ICMP 包对比 ID 和 SEQ,确认能说出具体数值差异。最后查编程实验:先启动服务端程序,再启动客户端,现场演示“发数据、收数据、打印长度”;然后把服务器关掉再敲客户端发送,故意演示 UDP 客户端“看似成功但其实没发到”。你要能讲清楚这个现象背后的原理——UDP 是无连接、不可靠,发送端不会知道数据是否到达。
最后一招对答辩很有用:给助教或同学讲一遍你的实验,让他扮演老师不断问“为什么”。如果某一步你要翻 PPT 或翻代码才能想起来为什么,那就说明理解不到位,赶紧回去重新过一遍。这个法子看起来很土,但比你自己对着报告看十遍有效得多。我每次做实验验收前都这样预演,最怕的是数据通了但脑子里没有完整的决策链路,而老师恰恰就爱问这个。
说到底,这份实验的含金量不在一页格式美观的报告,而在于每一步你有没有亲手敲过、坑有没有踩过、代码每个参数是不是都能讲出用途。如果你今天照着这篇文章把组网、抓包、Socket 三段都跑通了,实验分数基本稳了。希望帮到你。
本文还有配套的精品资源,点击获取