简介《计算机网络课程设计——精品课程网站》是一份面向高校计算机网络课程设计的 PDF 报告适合网络工程、计算机相关专业学生作为课程设计或毕业设计的参考资料。文档围绕基于 WEB 的精品课程网站展开详细呈现需求分析、网站要求与任务、系统功能设计、网络设备选型、子网划分与 TCP/IP 技术应用等完整流程并覆盖管理员、教师、学生的权限划分及资源共享模式以及从网站类型、拓扑结构到主机、交换机、路由器选型的建设思路。压缩包共 1 个 PDF 文件整体约 76KB已有 373 人浏览学习。读者可以从中掌握精品课程网站的整体规划思路了解局域网交换与以太网交换机选型、DNS/DHCP/WEB/FTP 服务配置等要点还可参考作者对系统性能、安全性、适应性要求的分析对完成同类课程设计具有直接借鉴价值。1. 计算机网络课程设计为什么选精品课程网站一个能讲清协议又能演示的题目拿到精品课程网站这个课程设计题目很多人第一反应是赶紧写几个页面最后凑一份PDF报告交差。但计算机网络课程设计的评分点从来不在页面好不好看而在你能不能讲清楚网站背后的HTTP、TCP、DNS这些协议是怎么协作的。精品课程网站恰好是这类题目里性价比最高的业务逻辑简单不会让开发时间吞噬文档时间网络特征齐全抓包、断网、并发测试都有现成场景。这篇笔记按课程设计从开题到答辩的顺序把技术栈选型、代码实现、协议验证和报告撰写一次讲透。适合正要开题、正在赶报告、以及想给答辩增加说服力的同学。2. 先定技术栈再写代码精品课程网站的协议落点与分层架构课程设计最常见的翻车方式是拿到题目后不管三七二十一复制一套管理系统模板页面一大堆写报告时却说不清楚哪个功能对应哪条网络知识。精品课程网站的聪明之处在于它的核心动作只有浏览课程、查看章节、下载课件、读公告这几件事每个动作几乎都能映射到一条HTTP方法或一个传输层机制。先把协议在哪一层发生钉死再去选框架和写代码后面抓包和答辩都会轻松很多。2.1 从URL输入到页面渲染课程网站的协议链路一个用户在浏览器输入地址到最终看到课程卡片这条链路上至少发生四次协议行为DNS解析、TCP三次握手、HTTP请求响应、静态资源加载。很多人的报告只写使用了HTTP协议这等于没写。我一般会把链路拆成一张表把每个环节对应到具体的协议、字段和抓包点这一张表就是后面实验报告的骨架。环节协议关键字段课程网站的对应行为地址解析DNS域名 / IP访问http://netcourse.local:8000时先查 hosts建立连接TCPSYN、ACK、seq/ack浏览器发起第一个请求前的三次握手请求页面HTTPGET、200 OK打开课程首页加载静态资源HTTPGET /static/cssHTML 解析后请求 CSS、JS、图片下载课件HTTPContent-Disposition点击下载 PDF 课件这张表最大的作用不是好看而是让你在写报告时有一个可以追溯的目录。比如答辩老师问DNS为什么没抓到包你就能答因为我用IP直连只有第一次解析域名时才走DNS这个行为本身就是一个知识点。切到/etc/hosts里配置一个本地域名后Wireshark 里就能同时看到 DNS 查询和 TCP 三次握手的完整过程。这一手在答辩现场非常加分。2.2 技术选型为什么课程设计推荐 Flask SQLite 原生前端课程设计的评判标准是能讲清原理、能演示、结构清晰不是高并发。我一般建议后端用 Python 的 Flask数据库用 SQLite前端用原生 HTML/CSS/JS。Flask 一个文件就能起服务开发服务器默认支持多线程评委现场要跑不需要装 MySQL、Redis 这类外部组件SQLite 是单文件数据库整个项目可以压缩成一个 zip 提交数据不会丢原生前端不用 npm install避免答辩现场 node_modules 缺失导致整套环境起不来。方案组合优点缺点适用场景Flask SQLite零外部依赖、启动快、报告容易讲不适合真实高并发绝大多数课程设计Django MySQL自带 admin 后台、ORM 完善概念多、代码量大要求独立后台的大作业Java Servlet Tomcat贴近面试常问的 Servlet 生命周期环境配置麻烦课程指定 JavaNode.js Express前后端同语言依赖安装易踩坑偏前端方向的同学PHP Apache经典 LAMP 栈、部署简单结构偏老课程指定 PHP这里多提一句如果不想用 Flask 自带的开发服务器也可以装一个免费 nginx 网站服务做反向代理把 80 端口的请求转发给 Flask 的 8000 端口。这样做的好处是能演示 HTTP/1.1 的 keep-alive 和静态文件缓存但课程设计阶段不是必须项反而容易把文档重点带偏。技术选型最重要的原则是你要能解释每一个组件的网络行为。教材侧建议按《计算机网络自顶向下方法》的层次模型来组织报告应用层写 HTTP传输层写 TCP网络层写 IP 分片答辩老师一眼就能看出你读教材时不是只背了目录。2.3 数据表设计与协议映射四张表对应哪些网络行为精品课程网站最少需要四张表course课程、chapter章节含课件路径、announcement公告、user用户如果要求登录。这里有个常见争议课件 PDF 到底存数据库还是存文件。我的做法是数据库只存相对路径课件文件放uploads目录下载时走 HTTP 静态文件服务。这样既能演示Content-Disposition响应头的机制又避免 SQLite 单文件里塞大对象导致体积膨胀。四张表基本对应课程网站的四个 HTTP 接口读课程列表、读章节、读公告、下载资源。# models.py —— 用 sqlite3 建表避免引入重量级 ORM import sqlite3 DB_PATH website.db def get_conn(): conn sqlite3.connect(DB_PATH) conn.row_factory sqlite3.Row return conn def init_db(): conn get_conn() conn.executescript( CREATE TABLE IF NOT EXISTS course ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, teacher TEXT NOT NULL, description TEXT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS chapter ( id INTEGER PRIMARY KEY AUTOINCREMENT, course_id INTEGER NOT NULL REFERENCES course(id), title TEXT NOT NULL, video_url TEXT, pdf_path TEXT ); CREATE TABLE IF NOT EXISTS announcement ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, content TEXT, publish_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ) conn.commit() conn.close() if __name__ __main__: init_db()这段代码用sqlite3标准库而不是 SQLAlchemy是因为课程设计不要求对象关系映射用标准库写的每一条 SQL 都能在答辩现场被问到的时候直接解释清楚。连接对象设置row_factory sqlite3.Row查询结果就能按列名访问模板里可以写course.name而不是row[0]。几个设计要点外键course_id REFERENCES course(id)保证章节永远挂在某个课程下不会产生孤儿数据video_url和pdf_path只存相对路径例如uploads/3_tcp.pptx由下载路由拼出完整路径publish_time用TIMESTAMP DEFAULT CURRENT_TIMESTAMP测试时不用手动填时间建表用executescript一次执行多条 SQL避免逐条execute的重复连接开销。3. 把精品课程网站跑起来Flask 路由、前端模板与局域网演示代码骨架确定后下一步是让评委能在任何一台机器上把项目跑起来。这里给的是最小可运行版本重点不是炫技而是每个文件的角色和网络行为都看得见。跑通之后再去补样式、补功能顺序不要反——先让链路通再让页面好看。3.1 Flask 后端最小实现动态路由、参数化查询与文件下载models.py里除了建表还要提供查询函数。这里给两个通用查询函数分别对应返回多行和返回单行两种场景。查询全部写在业务函数里也可以但抽出来之后路由部分会清爽很多答辩时讲代码也更容易按函数划分。# models.py 追加的查询函数 def query_all(sql, args()): conn get_conn() cur conn.execute(sql, args) rows cur.fetchall() conn.close() return rows def query_one(sql, args()): conn get_conn() cur conn.execute(sql, args) row cur.fetchone() conn.close() return row查询函数写成query_one和query_all两个原因是fetchone()和fetchall()在处理空结果时的返回值不一样没有数据时fetchone()返回Nonefetchall()返回空列表。路由逻辑里必须对None做判断否则模板渲染会报错。所有查询都用?占位符传参这是参数化查询能防止 SQL 注入也是答辩老师常问的一个点——报错和注入是两个必问项。# app.py —— Flask 后端入口路由按资源组织 from flask import Flask, render_template, request, send_from_directory, abort import models app Flask(__name__) app.route(/) def index(): courses models.query_all(SELECT * FROM course) return render_template(index.html, coursescourses) app.route(/course/int:course_id) def course_detail(course_id): course models.query_one(SELECT * FROM course WHERE id?, (course_id,)) if course is None: abort(404) chapters models.query_all( SELECT * FROM chapter WHERE course_id? ORDER BY id, (course_id,)) return render_template(course_detail.html, coursecourse, chapterschapters) app.route(/download/path:filename) def download(filename): return send_from_directory(uploads, filename, as_attachmentTrue) app.route(/announcements) def announcements(): rows models.query_all(SELECT * FROM announcement ORDER BY publish_time DESC) return render_template(announcement.html, rowsrows) if __name__ __main__: models.init_db() app.run(host0.0.0.0, port8000, debugTrue)/course/int:course_id的尖括号是动态路由Flask 会把 URL 里的参数转成 int 传给函数这是 REST 风格路径的标准写法。每个路由函数做的事都很短查数据、渲染模板、返回页面。abort(404)处理课程不存在的情况返回标准 404 页。send_from_directory会自动处理静态文件的 Content-Type 并生成下载响应头比手动读文件再返回更安全因为它会做路径校验防止../穿越目录。app.run的三个参数值得记一下host0.0.0.0表示监听所有网卡局域网才能访问port8000避开 80 端口需要管理员权限的问题debugTrue方便改代码自动重载但答辩演示时建议改成False否则异常堆栈会直接暴露代码细节。3.2 前端模板与静态资源一个页面至少三次 HTTP GETFlask 默认用templates目录下的模板文件渲染页面。课程列表页只需要一张 index.html核心是把后端传过来的courses变量循环输出。这个页面本身只有一个 HTML 文档但它引用了 CSS 和 JS所以浏览器实际会发起三次 HTTP GET 请求这是一个天然的HTTP 请求-响应演示点。!-- templates/index.html —— 课程列表页 -- !DOCTYPE html html langzh-CN head meta charsetUTF-8 title精品课程网站/title link relstylesheet href/static/css/style.css /head body header h1计算机网络精品课程/h1 nav a href/首页/a a href/announcements公告/a /nav /header main {% for course in courses %} section classcourse-card h2a href/course/{{ course.id }}{{ course.name }}/a/h2 p授课教师{{ course.teacher }}/p p{{ course.description }}/p /section {% endfor %} /main script src/static/js/main.js/script /body /html这个模板的渲染结果是静态 HTML点击课程卡片会跳转到/course/id触发新的 HTTP GET这正好对应第 2 章协议链路表里的请求页面环节。CSS 和 JS 文件放在static目录下Flask 会把/static/xxx直接映射到对应文件不需要额外写路由。style.css里放两行基础样式即可重点不是设计感而是让学生体会到页面加载会触发多次资源请求这个网络行为。调试时可以打开浏览器的开发者工具切到 Network 面板刷新页面能看到三条请求及每条请求的耗时这是回答网站加载慢怎么定位的标准切入点。3.3 局域网演示让评委手机访问你的网站课程设计演示那天评委很少坐在你的电脑前大部分时间是站在旁边看。把网站开放到局域网让评委用手机扫码或输地址访问体验比挤在一起看屏幕好很多。操作分三步查本机局域网 IP、确认 Flask 监听 0.0.0.0、放行防火墙端口。# 查看本机局域网地址 hostname -I # Linux/macOS ipconfig # Windows看 IPv4 地址 # Linux 防火墙放行 8000如果开了 ufw sudo ufw allow 8000/tcp拿到 IP 后手机和电脑连同一个 Wi-Fi浏览器打开http://电脑IP:8000即可。这里有个很容易被忽视的知识点直接访问 IP 是没有 DNS 参与的。想把这个环节也演示出来可以在电脑的 hosts 文件里加一行映射比如192.168.1.100 netcourse.local然后在浏览器访问http://netcourse.local:8000。这样 Wireshark 里就能同时看到 DNS 查询和 TCP 三次握手两条记录答辩时从域名解析讲到连接建立逻辑链非常完整。4. 把计算机网络知识写进课程设计报告三个必测实验与参数表页面跑通只完成了一半。课程设计真正评分的是报告和答辩网络协议验证是报告里最能体现专业度的地方。常见做法是安排三个实验TCP 握手抓包、断网重传观察、HTTP 并发测量。下面给出每个实验的操作步骤和报告写法照着做能省下大量试错时间。4.1 Wireshark 抓包验证三次握手过滤条件与截图取证抓包实验不需要复杂的网络环境本机回环接口就能做。Wireshark 的过滤表达式是第一个坑很多人打开软件后看到满屏的报文不知道从哪下手。我一般先用tcp.port 8000把范围锁死再按需叠加其他条件。# 常用过滤表达式 tcp.port 8000 # 只看课程网站流量 tcp.flags.syn 1 # 只看 SYN 报文 http # 只看 HTTP 请求响应 tcp.analysis.retransmission # 只看重传报文操作步骤启动 Wireshark选择回环接口lo本机访问 127.0.0.1 时数据走回环设置过滤器tcp.port 8000在浏览器刷新一次课程首页找到首个访问 8000 端口的 TCP 流右键选择跟随 TCP 流观察 SYN、SYNACK、ACK 三条握手报文截图时保留时间列、Source 列、Destination 列和 Info 列的标志位。报告中必须写清楚第一次握手客户端发送 SYNseqx第二次服务器回 SYNACKseqy, ackx1第三次客户端发 ACKseqx1, acky1。这三个数字写明白比贴十张图都管用因为它证明你真的看懂了报文而不是从网上抄概念。4.2 断网与重传模拟看 TCP 怎么自己救自己TCP 的超时重传和快速重传在正常浏览时看不到因为网络太顺丢包率趋近于零。要制造实验场景我一般用断网法先让页面开始下载一个大 PDF 课件然后在 Wireshark 里设置tcp.analysis.retransmission过滤器直接拔掉网线或断开 Wi-Fi 三秒再恢复观察重传报文出现的时间和数量。# 生成一个 20MB 的测试文件放到 uploads 目录 dd if/dev/zero ofuploads/test.pdf bs1M count20 # 在浏览器里访问下载路由开始下载然后拔网线操作时要注意两件事。第一拔网线要在演示机上做别远程连接服务器再拔——我干过一次把自己和服务器一起断开了属于血泪经验。第二断网时间控制在两三秒太长会导致 TCP 重传次数耗尽直接断连反而看不到恢复后的行为。报告里观察点写两个发送方在 RTO 到期后重新发送未确认的数据段接收方收到重复段后返回 Dup ACK。这对应教材里可靠传输和流量控制两个知识点不用额外做任何花哨的分析这两条观察记录已经够写满一页实验结论。4.3 报告参数表延迟、吞吐、并发数怎么写进 PDF答辩老师最吃数字这套。课程网站至少要测三个数首页响应时间、单文件下载吞吐、并发打开页面的耗时。不需要上商业压测平台局域网里用 curl 就能完成。实验环境要写清楚操作系统、Python 版本、网卡类型因为同一个网站千兆网卡和百兆网卡测出来的速度能差十倍不写环境的数字就是无效数据。# 测量首页完整响应时间 curl -o /dev/null -s -w time_total: %{time_total}s\n http://127.0.0.1:8000/ # 测量下载课件的平均下载速度 curl -o /dev/null -s -w speed_download: %{speed_download} B/s\n \ http://127.0.0.1:8000/download/test.pdftime_total是从发起请求到响应完成的完整耗时speed_download是平均下载速度单位是字节每秒。注意 curl 在下载二进制文件时要加-o /dev/null否则会把文件内容直接打到终端上触发乱码。跑三次取平均值做成表格放进 PDF 文档格式参考下面这张表指标测法合理范围报告结论首页响应时间curl -w time_total本机 50ms局域网 200ms网络延迟正常课件下载速度curl -w speed_download与网卡类型相关瓶颈在带宽并发打开页面第 6 章 wrk 命令50 并发不报错HTTP 服务可并行处理5. 课程设计避坑从端口占用到 PDF 导出的 5 个踩坑记录这一章写给正在赶 DDL 的人。下面五条都是课程设计阶段高频出现的现场翻车按现象 → 原因 → 解决写出可以当排查手册直接查。5.1 端口被占用Flask 启动时报 Address already in use现象运行python app.py后终端抛出OSError: [Errno 98] Address already in use换端口也起不来。原因上一次进程没退干净或者有系统进程占用了同一端口。在 IDE 里调试时debugTrue会启动一个 reloader 子进程IDE 停止按钮有时只杀了主进程子进程还占着端口。解决先查占用再决定杀进程还是换端口。不要盲目换端口换到 8080 可能又撞上其他服务。# 查 8000 端口被谁占用 lsof -i :8000 # Linux/macOS netstat -ano | findstr :8000 # Windows # 拿到 PID 后结束进程 kill PID # Linux/macOS taskkill /PID PID /F # Windows5.2 手机访问不了网站浏览器一直转圈现象电脑上访问http://127.0.0.1:8000正常手机连同一个 Wi-Fi 却打不开。原因app.run没写host0.0.0.0服务只监听了回环地址或者防火墙拦了入站连接。这是课程设计里被问得最多的问题。解决把 host 改成0.0.0.0并放行 8000 端口入站。Windows 在防火墙高级设置里新建入站规则Linux 执行sudo ufw allow 8000/tcp。如果项目跑在虚拟机里主机访问虚拟机网站失败也常是这一条NAT 模式下宿主机要用虚拟机的 IP 访问但虚拟机防火墙不放行同样白搭桥接模式下要确认虚拟机和宿主机在同一网段VMware 的默认 DHCP 经常把网段分得不一致。这类问题看起来像玄学实际是网络模式没对上。5.3 下载 PDF 时中文文件名乱码现象下载《第3章-网络层.pdf》浏览器保存到本地后文件名变成%E7%AC%AC3...或者一串乱码。原因HTTP 响应头Content-Disposition里的filename字段只支持 ASCII直接写中文会被浏览器按 Latin-1 解码中文就碎了。解决用 RFC 5987 规定的filename*写法把文件名做 UTF-8 百分号编码后放进响应头。from urllib.parse import quote app.route(/download/path:filename) def download(filename): response send_from_directory(uploads, filename) response.headers[Content-Disposition] \ fattachment; filename*UTF-8{quote(filename)} return responseUTF-8是编码标识quote()把中文转成百分号编码。这是标准做法不是魔改写进报告反而能体现你对 HTTP 响应头机制的理解。5.4 SQLite 写入中文变成问号现象公告内容从表单提交进数据库后页面显示?????终端里查也是问号。原因字符编码不一致。常见的是 Windows 控制台默认 GBKPython 的字符串没有显式声明编码写库时被转错了。解决统一 UTF-8。数据库连接建立后先执行PRAGMA encoding UTF-8这个语句必须在建表之前执行才有效如果有已经建好的表需要先DROP TABLE再用新编码重建。同时保证 HTML 的meta charsetUTF-8、Python 文件头部、数据库文件三方一致这个现象基本不会再出现。遇到这类玄学问题时先查编码再查网络顺序不要反。5.5 从网页导出的 PDF 报告格式崩坏现象用浏览器直接打印课程设计文档图片错位、代码换行乱、表格超过页边距。原因页面没有为打印做样式适配浏览器的默认打印 CSS 对 flex 布局和长代码块支持不一致。很多 Markdown 转 PDF 的报告也会在代码行处断行。解决给模板加一套media print打印样式导出时在打印对话框的目标位置选另存为 PDF。这是 web 页面 PDF 打印的标准流程比截图拼文档更正规。/* print.css —— 只影响打印输出 */ media print { nav, .btn, footer { display: none; } body { width: auto; margin: 0; } pre, code { white-space: pre-wrap; word-break: break-all; } table { page-break-inside: avoid; } }white-space: pre-wrap是代码块不溢出的关键word-break: break-all处理超长 URLpage-break-inside: avoid防止表格被拦腰截断到两页里。另外把 PDF 转成排版干净的 HTML 再打印比直接用网页打印效果稳定得多转换完成后务必用 PDF 阅读器预览一遍分页效果避免交上去的报告在别人电脑上打开时排版稀碎。6. 给答辩加分的验证套路用并发数据说话6.1 用 wrk 做一轮并发压力测试课程网站的功能大家都差不多决定分数差距的往往是谁能证明自己的网站能扛多少并发。常见做法是用 wrk 压 10 秒把结果截图放进报告。wrk 比 ab 轻量输出也更易读。# 用 wrk 对首页做 10 秒并发测试 wrk -t2 -c50 -d10s http://127.0.0.1:8000/-t2表示开两个线程-c50表示保持 50 个并发连接-d10s表示持续 10 秒。在课程设计的小站点上50 并发足够说明 HTTP 服务能并行处理请求。报告里重点截两张图一是Requests/sec吞吐量二是Latency分布表再补一句50 并发下平均延迟 xx ms服务器 CPU 占用 xx%这就是一份完整的压力测试结论。6.2 把压测和抓包串成一条证据链答辩讲的时候按这条线走先用 Wireshark 的抓包证明 TCP 三次握手再用浏览器 Network 面板说明页面加载产生了多少次 HTTP 请求最后用 wrk 的并发数据说明服务器处理能力。三段证据分别对应传输层、应用层和系统整体表现老师问到哪一层都能接住。这条证据链是我做课程设计项目的固定套路比背十个名词解释有用得多。这个题目做完我最大的教训是功能可以简单证据不能少。我本科那次就是因为只交了功能截图没交抓包证据被答辩老师一句这网站跟计算机网络有什么关系问住了。后来再做同类项目我都强制自己先跑一轮抓包再写报告分数稳定在优秀档。血泪经验分享到这里——这个题本身门槛不高花两晚把实验证据补全比改三版前端界面都值。希望帮到你。本文还有配套的精品资源点击获取
阅读完成 · 觉得有帮助?