简介:本资源是高校《计算机网络I》课程设计的完整实践报告,面向计算机、网络工程等专业本科生,聚焦电子图书馆网站的综合性网络架构与服务部署。内容覆盖从需求分析、拓扑设计(含1000M主干网+100M到点、4+子网划分)、硬件选型(服务器/交换机/路由器)到DNS/DHCP/WEB/FTP服务配置及简易主页开发的全流程,配套详细技术说明、配置过程与问题解决记录,可直接用于课程设计提交与复盘学习。压缩包为单个26KB的Word文档(.doc),内含规范报告结构:绪论、需求分析、详细设计与实现、结论与展望,并附有任务书、评分标准及电子图书技术特性分析。目前已有946人学习下载,适合夯实TCP/IP体系理解、提升网络服务集成能力与工程文档撰写水平的初阶实践者。
1. 电子图书馆网站设计:不是做个网页,而是搭一套能跑通 TCP/IP 全栈的“微型互联网”
你交上去的不是 HTML 页面,而是一张能真实 ping 通、能 dig 到域名、能 dhcp 分到地址、能 ftp 下载图书、能用浏览器访问首页的拓扑图——这才是《计算机网络 I》课程设计里“电子图书馆网站设计”的真实交付物。它不考你会不会写<h1>欢迎来到电子图书馆</h1>,而是考你能不能把谢希仁《计算机网络》第 3~5 章的抽象模型,焊死在 Cisco Packet Tracer 或 GNS3 里,再塞进 Apache 和 vsftpd 的配置文件中。学生常踩的第一个坑,就是把“网站设计”当成前端作业:花三天调 CSS,结果路由器 ACL 没配,子网掩码算错一位,整个拓扑连ping 192.168.10.1都超时——这根本不是网站没做好,是网络层根本没立住。本项目面向的是刚学完 IP 编址、子网划分、DNS 工作原理、HTTP/FTP 协议交互流程的本科生,目标明确:用一套可验证、可截图、可答辩的最小可行网络系统,把“TCP/IP 四层模型”从课本概念变成命令行里的tcpdump -i eth0 port 53抓包结果。它不追求高并发或微服务,但必须让每个服务模块(DNS/DHCP/WEB/FTP)在独立子网间完成跨层通信,且所有配置参数可追溯、可复现、可写进课程设计报告的“第 3 章 详细设计与实现”。
2. 从需求到拓扑:为什么必须划 4 个子网?1000M 主干网在 Packet Tracer 里怎么模拟?
2.1 为什么硬性要求“至少 4 个子网”?——不是凑数,是逼你理解 CIDR 和路由聚合
课程设计任务书里“至少划分 4 个以上子网”这一条,绝非形式主义。它直指 IPv4 地址规划的核心矛盾:如何在有限地址空间内,既满足不同功能区域隔离(安全/管理/服务/用户),又避免路由表爆炸。假设你拿到一个192.168.0.0/22网段(共 1024 个可用地址),若不分网,所有设备都在同一广播域,DHCP 泛洪、ARP 攻击风险陡增,且无法对 DNS 服务器和 FTP 服务器做 ACL 限流。而划成 4 个/24子网(如192.168.0.0/24,192.168.1.0/24,192.168.2.0/24,192.168.3.0/24),每个子网 254 台主机,恰好覆盖任务书要求的“100 个以上站点”(实际可扩展至 4×254=1016 台),同时为后续添加 VLAN、ACL、NAT 留出余量。更重要的是,4 个子网意味着你必须配置静态路由或启用 RIP/OSPF——这是检验你是否真懂“网络层转发”而非只会背“路由器查路由表”的分水岭。
提示:别用
192.168.1.0/24这种被家用路由器霸占的网段。推荐172.16.0.0/16内划分,例如172.16.10.0/24(DNS 区)、172.16.20.0/24(WEB/FTP 区)、172.16.30.0/24(DHCP 客户端区)、172.16.40.0/24(管理区),避免与宿主机网络冲突。
2.2 1000M 主干网 ≠ 插根千兆线:Packet Tracer 中的带宽建模逻辑
很多同学在 Packet Tracer 里拖出一台 2960 交换机,接上四台 PC 就以为完成了“1000M 主干网”。错。Packet Tracer 的物理层建模是符号化的:主干网带宽由连接核心设备的链路类型决定,而非单台交换机的标称速率。正确做法是:
- 使用Cisco 3640 路由器或4500 系列三层交换机作为核心;
- 核心设备之间用GigabitEthernet 接口(如
G0/0,G0/1)互联; - 所有接入层交换机(如 2960)通过GigabitEthernet 上联口(非 FastEthernet)连接至核心;
- 在核心设备接口配置中显式声明带宽:
这行interface GigabitEthernet0/0 bandwidth 1000000 # 单位是 kbps,即 1000Mbps ip address 172.16.255.1 255.255.255.252bandwidth命令虽不改变实际吞吐(Packet Tracer 不仿真物理层延迟),但会直接影响 EIGRP 度量值计算、QoS 策略匹配,是体现“主干网带宽意识”的关键证据。
2.3 拓扑选型:星形结构为何是唯一合理选择?环形/总线型当场翻车
任务书允许选“星形、环形或总线型”,但实操中星形拓扑是唯一能稳定通过答辩的方案。原因如下:
- 环形拓扑:Packet Tracer 中 RSTP 收敛慢,任意链路断开即全网中断,且 DHCP 广播无法跨环传递;
- 总线型拓扑:已淘汰多年,Packet Tracer 仅支持旧式集线器(Hub),无 MAC 地址学习,广播风暴无法抑制,100M 到点根本无法保证;
- 星形拓扑:以三层交换机或路由器为核心,各子网通过独立链路接入,天然支持 VLSM、ACL、NAT,且故障域隔离——某子网 DHCP 服务宕机,不影响 WEB 服务器响应。
标准星形拓扑节点清单(可直接抄入报告图注):
| 设备类型 | 数量 | IP 地址段 | 功能说明 |
|---|---|---|---|
| 核心三层交换机 | 1 | 172.16.255.1/30 | 主干路由、VLAN 间路由 |
| DNS 服务器 | 1 | 172.16.10.10/24 | 提供 library.example.com 解析 |
| WEB+FTP 服务器 | 1 | 172.16.20.10/24 | Apache + vsftpd,托管图书资源 |
| DHCP 服务器 | 1 | 172.16.30.1/24 | 为客户端自动分配 172.16.30.100-200 |
| 管理工作站 | 1 | 172.16.40.100/24 | 远程登录核心设备,抓包调试 |
| 普通客户端 | ≥3 | DHCP 自动获取 | 浏览网页、下载图书、nslookup |
注意:所有服务器必须配置静态 IP,且网关指向所在子网的三层接口(如 DNS 服务器网关为
172.16.10.1,该地址需在核心设备对应 VLANIF 接口上配置)。
2.4 子网划分实战:用 Python 脚本验证你的 /26 划分是否精准
手算子网易出错,尤其当要求“4 个子网且每个子网≥100 台主机”时。最稳妥方式是用脚本交叉验证。以下 Python 代码生成所有可能的子网掩码组合,并输出符合要求的方案:
# subnet_calculator.py from ipaddress import IPv4Network def find_valid_subnets(network, min_hosts_per_subnet, min_subnets): valid = [] # 尝试从 /24 到 /22 的前缀长度(越小前缀,子网越多) for prefix in range(22, 25): net = IPv4Network(network) subnets = list(net.subnets(new_prefix=prefix)) if len(subnets) >= min_subnets: hosts_per_subnet = subnets[0].num_addresses - 2 # 减去网络地址和广播地址 if hosts_per_subnet >= min_hosts_per_subnet: valid.append({ 'prefix': prefix, 'total_subnets': len(subnets), 'hosts_per_subnet': hosts_per_subnet, 'subnets': [str(s) for s in subnets[:min_subnets]] }) return valid # 输入:原始网段、每子网最少主机数、最少子网数 result = find_valid_subnets('172.16.0.0/16', min_hosts_per_subnet=100, min_subnets=4) for r in result: print(f"使用 /{r['prefix']} 划分:{r['total_subnets']} 个子网,每子网 {r['hosts_per_subnet']} 台主机") for i, s in enumerate(r['subnets']): print(f" 子网{i+1}: {s}")运行结果示例:
使用 /22 划分:4 个子网,每子网 1022 台主机 子网1: 172.16.0.0/22 子网2: 172.16.4.0/22 子网3: 172.16.8.0/22 子网4: 172.16.12.0/22但注意:/22过于宽泛,实际应选用/24(254 主机)或/25(126 主机)以精确匹配“100 台以上”且留出管理地址。脚本输出只是校验工具,最终方案需结合设备接口数量手工确定。
3. 四大服务配置:DNS/DHCP/WEB/FTP 的 Linux 服务部署与 Packet Tracer 联调
3.1 DNS 服务:BIND9 配置不是填空题,而是理解权威域与递归查询的边界
课程设计中的 DNS 不是让你装个dnsmasq就完事。它必须体现“权威域名服务器”角色——即library.example.com的 SOA 记录由你的服务器独家发布,而非仅做缓存代理。BIND9 是 Linux 下最符合教学要求的选择,因其配置文件结构清晰反映 DNS 协议分层。
关键配置文件路径与作用:
/etc/bind/named.conf.options:全局选项,禁用递归查询(recursion no;),因学生实验环境无需对外提供解析服务;/etc/bind/named.conf.local:定义本地区域,添加zone "example.com" { type master; file "/etc/bind/db.example.com"; };;/etc/bind/db.example.com:正向解析数据库,必须包含:$TTL 86400 @ IN SOA ns1.example.com. admin.example.com. ( 2024050101 ; serial 3600 ; refresh 1800 ; retry 604800 ; expire 86400 ) ; minimum @ IN NS ns1.example.com. ns1 IN A 172.16.10.10 www IN CNAME library.example.com. library IN A 172.16.20.10
重要参数说明:
serial必须每次修改后递增(如2024050101→2024050102),否则从服务器不更新;NS记录的主机名ns1.example.com.末尾点号表示绝对域名,不可省略;CNAME不能与A记录共存于同一名称,故www指向library。
Packet Tracer 联调验证:
- 在客户端执行
nslookup library.example.com 172.16.10.10,应返回172.16.20.10; - 执行
dig @172.16.10.10 library.example.com,检查AUTHORITY SECTION是否含example.com. 86400 IN NS ns1.example.com.; - 若返回
server can't find library.example.com: NXDOMAIN,90% 是db.example.com中library行末尾少了.或SOA的admin邮箱未转义为admin\.example\.com。
3.2 DHCP 服务:isc-dhcp-server 的 lease 文件与租约时间陷阱
DHCP 服务看似简单,但学生常栽在两个细节:租约时间过长导致地址池耗尽,以及dhcpd.leases文件权限错误导致服务启动失败。
/etc/dhcp/dhcpd.conf核心配置:
subnet 172.16.30.0 netmask 255.255.255.0 { range 172.16.30.100 172.16.30.200; option routers 172.16.30.1; # 网关必须指向三层接口 option domain-name-servers 172.16.10.10; # DNS 服务器地址 option domain-name "example.com"; default-lease-time 3600; # 1小时,避免测试时地址长期占用 max-lease-time 7200; # 2小时,强制客户端续租 authoritative; # 声明此为权威DHCP,防止网络中其他DHCP干扰 }血泪经验:default-lease-time若设为86400(24小时),在 Packet Tracer 多次重启后,/var/lib/dhcp/dhcpd.leases文件会累积大量过期租约,导致新客户端无法获取地址。解决方案是每次测试前清空租约文件并重启服务:
sudo systemctl stop isc-dhcp-server sudo truncate -s 0 /var/lib/dhcp/dhcpd.leases sudo systemctl start isc-dhcp-server验证命令:
- 客户端执行
ipconfig /renew(Windows)或sudo dhclient -r && sudo dhclient(Linux),检查是否获得172.16.30.x地址; - 在 DHCP 服务器执行
cat /var/lib/dhcp/dhcpd.leases | grep "172.16.30.100",确认租约记录存在。
3.3 WEB 服务:Apache 虚拟主机与图书目录的权限映射
WEB 服务目标不是展示一个index.html,而是让客户端通过http://library.example.com访问到真实的图书列表页面。这意味着必须配置 Apache 虚拟主机(VirtualHost),而非仅修改/var/www/html。
/etc/apache2/sites-available/library.conf:
<VirtualHost *:80> ServerAdmin admin@example.com ServerName library.example.com DocumentRoot /var/www/library <Directory /var/www/library> Options Indexes FollowSymLinks AllowOverride None Require all granted # 关键:允许目录索引,使用户看到图书文件列表 </Directory> ErrorLog ${APACHE_LOG_DIR}/library_error.log CustomLog ${APACHE_LOG_DIR}/library_access.log combined </VirtualHost>启用步骤:
sudo mkdir -p /var/www/library sudo chown -R $USER:$USER /var/www/library # 复制图书文件(如 test.pdf, book1.epub)到该目录 sudo a2ensite library.conf sudo systemctl reload apache2避坑重点:DocumentRoot目录权限必须为755,且 Apache 进程用户(www-data)需有读取权。若页面显示403 Forbidden,执行:
sudo chmod -R 755 /var/www/library sudo chown -R root:www-data /var/www/library3.4 FTP 服务:vsftpd 的匿名访问与图书下载的路径绑定
FTP 服务需支持匿名下载(ftp://library.example.com),以便客户端无需账号即可获取图书。vsftpd 是最轻量且安全的选项,但默认禁用匿名访问。
/etc/vsftpd.conf关键修改:
anonymous_enable=YES local_enable=NO # 禁用本地用户,只允许匿名 write_enable=NO # 匿名用户不可上传,仅下载 anon_root=/var/ftp # 匿名用户根目录 dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES chown_uploads=NO listen=YES pam_service_name=vsftpd userlist_enable=NO图书文件放置规则:
- 创建
/var/ftp/pub/books/目录; - 将 PDF/EPUB 图书文件放入此目录;
- 设置权限:
sudo chmod -R 755 /var/ftp/pub,sudo chown -R ftp:ftp /var/ftp/pub; - 客户端访问
ftp://172.16.20.10/pub/books/即可列表下载。
提示:若客户端提示
530 Permission denied,检查vsftpd.conf中seccomp_sandbox=NO(某些 Ubuntu 版本需关闭沙箱)及 SELinux 状态(sudo setenforce 0临时关闭)。
4. 避坑指南:课程设计中最常触发的 5 个“当场答辩失败”问题
4.1 现象:客户端能 ping 通网关,但nslookup library.example.com返回server can't find library.example.com: SERVFAIL
原因:BIND9 的named.conf.options中recursion yes;未改为no;,且allow-query未限制为内网地址,导致外部查询触发递归失败;或db.example.com中SOA记录的serial未递增,BIND 拒绝加载新配置。
解决:
- 修改
/etc/bind/named.conf.options,添加allow-query { 172.16.0.0/12; };; - 执行
sudo named-checkconf验证语法,sudo named-checkzone example.com /etc/bind/db.example.com验证区域文件; sudo systemctl restart bind9后,检查日志sudo journalctl -u bind9 | tail -20。
4.2 现象:DHCP 客户端获取到 IP,但无法访问http://library.example.com
原因:客户端 DNS 设置未指向你的 DNS 服务器(172.16.10.10),而是用了默认的8.8.8.8;或 Apache 的ServerName与 DNS 解析域名不一致。
解决:
- 在 DHCP 配置中确保
option domain-name-servers 172.16.10.10;; - 在客户端执行
nslookup library.example.com,确认解析到172.16.20.10; - 检查 Apache 虚拟主机
ServerName是否为library.example.com(非www.library.example.com)。
4.3 现象:Packet Tracer 中路由器接口show ip interface brief显示up/up,但ping 172.16.20.10超时
原因:三层交换机或路由器未启用路由功能(ip routing未开启),或子网间缺少静态路由。
解决:
- 在核心设备执行
show running-config,确认含ip routing; - 若用静态路由,添加:
ip route 172.16.20.0 255.255.255.0 172.16.255.2(假设 WEB 子网网关为172.16.255.2); - 在 WEB 服务器执行
ip route,确认默认网关指向核心设备。
4.4 现象:FTP 客户端登录成功,但ls命令返回空列表或550 Failed to change directory
原因:vsftpd 的anon_root路径权限不足,或pub目录未创建;或 SELinux 阻止 FTP 访问。
解决:
- 执行
sudo ls -ld /var/ftp/pub,确认权限为drwxr-xr-x; - 执行
sudo setsebool -P ftp_home_dir on(若 SELinux 启用); - 重启服务:
sudo systemctl restart vsftpd。
4.5 现象:课程设计报告中“拓扑图”与 Packet Tracer 实际设备连接不一致,答辩时被质疑
原因:拓扑图用 Visio 或手绘,但未标注设备型号、接口编号、IP 地址、子网掩码,导致无法与 Packet Tracer 配置对应。
解决:
- 拓扑图必须包含:设备图标旁标注型号(如 “Router: 3640”)、接口标签(如 “G0/0: 172.16.255.1/30”)、子网标注(如 “172.16.10.0/24: DNS Server”);
- Packet Tracer 中截图需显示设备 CLI 界面(如
show ip interface brief输出),作为报告附件。
5. WEB 主页开发:用纯 HTML/CSS 实现图书检索入口,拒绝“Hello World”式敷衍
5.1 主页结构:必须包含 DNS 解析验证、FTP 下载入口、图书格式说明三要素
课程设计要求“编写简单的 WEB 主页”,但“简单”不等于“空白”。合格主页需成为整个网络服务的验证枢纽——用户打开页面瞬间,就能感知 DNS、WEB、FTP 全链路是否通畅。以下 HTML 结构是答辩加分项:
<!-- /var/www/library/index.html --> <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>电子图书馆 - library.example.com</title> <style> body { font-family: "Microsoft YaHei", sans-serif; margin: 40px; } .card { border: 1px solid #ddd; padding: 20px; margin: 10px 0; border-radius: 5px; } .status-ok { color: green; } .status-error { color: red; } </style> </head> <body> <h1>📚 电子图书馆</h1> <div class="card"> <h2>🔍 服务状态</h2> <p>DNS 解析:<span id="dns-status" class="status-ok">正常(library.example.com → 172.16.20.10)</span></p> <p>WEB 服务:<span id="web-status" class="status-ok">正常(HTTP/1.1 200)</span></p> <p>FTP 下载:<span id="ftp-status" class="status-ok">正常(匿名访问可用)</span></p> </div> <div class="card"> <h2>📖 图书资源</h2> <p>当前提供 <strong>PDF/EPUB/CHM</strong> 格式电子书,支持全文检索与分类浏览。</p> <ul> <li><a href="/books/计算机网络基础.pdf">《计算机网络基础》(PDF)</a></li> <li><a href="/books/电子图书馆设计指南.epub">《电子图书馆设计指南》(EPUB)</a></li> <li><a href="/books/网络协议详解.chm">《网络协议详解》(CHM)</a></li> </ul> </div> <div class="card"> <h2>ℹ️ 格式说明</h2> <p>• <strong>PDF</strong>:通用格式,Adobe Reader 可读,适合打印<br> • <strong>EPUB</strong>:重排版格式,手机/阅读器自适应<br> • <strong>CHM</strong>:Windows 帮助格式,支持 JavaScript 交互</p> </div> <script> // 简单状态检测(实际部署时可替换为 AJAX) document.getElementById('dns-status').textContent = '正常(library.example.com → 172.16.20.10)'; document.getElementById('web-status').textContent = '正常(HTTP/1.1 200)'; document.getElementById('ftp-status').textContent = '正常(ftp://library.example.com/pub/books/)'; </script> </body> </html>关键设计点:
<a href="/books/xxx.pdf">链接必须指向 ApacheDocumentRoot下真实存在的文件路径;- “服务状态”区块用文字而非图标,确保无 JS 时仍可读;
- “格式说明”直接呼应任务书中 CHM/PDF 等格式分析,体现需求分析落地。
5.2 响应式适配:用 CSS Grid 实现三栏布局,适配答辩投影屏
答辩时投影分辨率常为 1024×768,主页若用浮动布局易错位。采用 CSS Grid 保证结构稳定:
.card { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 15px; } /* 在小屏下自动变为单列 */ @media (max-width: 768px) { .card { grid-template-columns: 1fr; } }将.card类应用于所有内容区块,确保在低分辨率投影仪上仍保持清晰可读。
5.3 图书文件组织:按格式分类存放,避免 Apache 目录遍历漏洞
/var/www/library/books/目录结构必须严格按格式隔离:
/var/www/library/books/ ├── pdf/ │ ├── 计算机网络基础.pdf │ └── 谢希仁计算机网络第八版.pdf ├── epub/ │ └── 王道计算机网络.epub └── chm/ └── 头歌计算机网络实训.chm并在 Apache 配置中禁用目录索引(Options -Indexes),仅对特定子目录开启:
<Directory /var/www/library/books/pdf> Options Indexes FollowSymLinks Require all granted </Directory>这样既满足“提供图书下载”要求,又规避了暴露敏感文件的风险。
6. 答辩前终极验证:用 5 条命令走完 TCP/IP 全栈,让老师当场点头
6.1 五步验证法:从物理层到应用层,每步输出必须截图存档
答辩不是讲 PPT,而是现场演示。我要求学生在答辩前用以下 5 条命令,在 Packet Tracer 客户端和 Linux 服务器上依次执行,每步截图(含命令和输出)插入报告附录。这比任何文字描述都更有说服力:
| 步骤 | 命令 | 预期输出 | 证明层级 |
|---|---|---|---|
| 1. 物理连通性 | ping 172.16.30.1 | Reply from 172.16.30.1: bytes=32 time<1ms TTL=255 | 网络层可达 |
| 2. DNS 解析 | nslookup library.example.com 172.16.10.10 | Name: library.example.com<br>Address: 172.16.20.10 | 应用层 DNS |
| 3. WEB 访问 | curl -I http://library.example.com | HTTP/1.1 200 OK<br>Server: Apache/2.4.52<br>Date: ... | 应用层 HTTP |
| 4. FTP 列表 | ftp -n 172.16.20.10→user anonymous→ls | 226 Directory send OK<br>-rw-r--r-- 1 ftp ftp 12345678 Sep 01 10:00 计算机网络基础.pdf | 应用层 FTP |
| 5. 跨子网路由 | traceroute 172.16.20.10 | 1 172.16.30.1 0.5ms<br>2 172.16.255.1 0.8ms<br>3 172.16.20.10 1.2ms | 网络层路由 |
注意:
curl和traceroute需在 Linux 客户端安装(sudo apt install curl traceroute),Windows 客户端可用telnet library.example.com 80替代第 3 步。
6.2 抓包佐证:用 Wireshark 截获 DNS 查询与 HTTP GET 的完整会话
光有命令行输出还不够。在核心路由器或 WEB 服务器上用 Wireshark 抓包,导出dns_http.pcapng文件,截图关键帧:
- DNS 查询帧:过滤
udp.port==53,显示客户端发library.example.com查询,服务器回A 172.16.20.10; - HTTP GET 帧:过滤
http.request.method=="GET",显示GET / HTTP/1.1请求头与HTTP/1.1 200 OK响应头。
这直接证明“DNS 解析触发 HTTP 请求”这一 TCP/IP 协议栈协同过程,是课程设计最硬核的证据。
6.3 报告撰写铁律:每一行代码、每一个 IP、每一条命令,必须能在 Packet Tracer 和 Linux 中 1:1 复现
我批改过上百份课程设计报告,最致命的错误是“文档与程序代码不一致”。比如报告写“DNS 服务器 IP 为192.168.1.10”,但 Packet Tracer 里配的是172.16.10.10;或代码贴了ifconfig输出,却没写清是在哪台设备上执行。从那以后,我每次指导学生,都强制他们走一遍“三对照”:
- 拓扑图 ↔ Packet Tracer 设备配置:图上每个 IP、接口、子网,必须与 Packet Tracer 中
show running-config输出逐字匹配; - 配置文件 ↔ Linux 服务器文件:报告中贴的
named.conf片段,必须与/etc/bind/named.conf.options实际内容完全一致; - 命令截图 ↔ 报告描述:报告写“执行
systemctl start apache2”,截图就必须含该命令及systemctl status apache2的绿色active (running)状态。
这不是吹毛求疵,而是训练工程师最基本的“可验证性”素养——你的设计,必须经得起任何人拿 U 盘拷走,在另一台电脑上一键复现。希望帮到你。
本文还有配套的精品资源,点击获取