
简介面向计算机网络课程综合实验与课程设计场景资源以华北电力大学《互联网综合设计与网络协议分析》实验报告为主体内容覆盖交换机与路由器基本配置、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/30R2-R3 之间用 10.0.2.0/30PC1、PC2 挂在 R1 下的 192.168.1.0/24PC3、PC4 挂在 R2 下的 192.168.2.0/24PC5、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/30G0/0/1 配 192.168.1.254/24R2 的 G0/0/0 配 10.0.1.2/30G0/0/1 配 10.0.2.1/30G0/0/2 配 192.168.2.254/24R3 的 G0/0/0 配 10.0.2.2/30G0/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 里配置完忘了开启接口物理链路显示为 downping 的结果是目标不可达这个印象分丢了很冤。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.1R1 发现这个地址不在任何直连网段路由表里虽然写了条目但它不知道如何去解析 MAC数据包就会一直挂在路由器的黑洞里。配置完后验证手段按顺序来第一跳检查每台路由器上show ip route是否出现完整的 C 和 S 路由第二跳从 PC1ping 192.168.3.1即 PC5 的地址通了代表 R1-R2-R3 全链路没问题第三跳再tracert 192.168.3.1看路径是否依次弹出三个路由器的接口地址。实验报告里把这三步的输出截进去比任何大段文字都更能证明你通了。2.3 实验报告里“静态路由”部分最该写什么报告撰写时不要抄设备配置作为唯一内容。华北电力大学的实验报告模板一般包含“实验目的、实验原理、实验步骤、实验结果、实验结论”但拿高分的关键是“实验原理”和“实验结果分析”。我的建议是多写一段“路由决策过程”当 PC1192.168.1.1访问 PC5192.168.3.1时数据包经历什么。具体写清三步——PC1 发现目标不在本网段将帧发给网关 192.168.1.254R1 查路由表匹配到 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 字段从 1Request变 2Reply。ICMP 报文分析相对简单但有一个必须写清的点Echo Request 和 Echo Reply 的 Identifier 与 Sequence Number 是否一致。教材上会告诉你这两个字段用来匹配请求与响应你在实验报告里写的正确操作是把 Request 包第 4 层的 Identifier 值和 Reply 包做对比如果一致说明这对请求-响应对是匹配的。我在给学生的报告中看到的高频错误是直接抄“Identifier 和 Sequence Number 相同表示匹配成功”但自己根本没点开两个包对比。验收时老师问“你说相同截图里数值是多少”当场哑火。所以报告里别写套话截图标出两个包的 Identifier 具体值是 0x0001Sequence 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 或 JavaPython 代码量最少讲起来也顺。# 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(freceived {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 bhello network lab client_socket.sendto(message, server_addr) data, _ client_socket.recvfrom(1024) print(fecho 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(fclient 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(bERROR: 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(freceived {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”现象上次运行服务器程序后 CtrlC 关闭再次运行时抛出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 三段都跑通了实验分数基本稳了。希望帮到你。本文还有配套的精品资源点击获取