
简介本资源是高校《计算机网络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而是考你能不能把谢希仁《计算机网络》第 35 章的抽象模型焊死在 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×2541016 台同时为后续添加 VLAN、ACL、NAT 留出余量。更重要的是4 个子网意味着你必须配置静态路由或启用 RIP/OSPF——这是检验你是否真懂“网络层转发”而非只会背“路由器查路由表”的分水岭。提示别用192.168.1.0/24这种被家用路由器霸占的网段。推荐172.16.0.0/16内划分例如172.16.10.0/24DNS 区、172.16.20.0/24WEB/FTP 区、172.16.30.0/24DHCP 客户端区、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.252这行bandwidth命令虽不改变实际吞吐Packet Tracer 不仿真物理层延迟但会直接影响 EIGRP 度量值计算、QoS 策略匹配是体现“主干网带宽意识”的关键证据。2.3 拓扑选型星形结构为何是唯一合理选择环形/总线型当场翻车任务书允许选“星形、环形或总线型”但实操中星形拓扑是唯一能稳定通过答辩的方案。原因如下环形拓扑Packet Tracer 中 RSTP 收敛慢任意链路断开即全网中断且 DHCP 广播无法跨环传递总线型拓扑已淘汰多年Packet Tracer 仅支持旧式集线器Hub无 MAC 地址学习广播风暴无法抑制100M 到点根本无法保证星形拓扑以三层交换机或路由器为核心各子网通过独立链路接入天然支持 VLSM、ACL、NAT且故障域隔离——某子网 DHCP 服务宕机不影响 WEB 服务器响应。标准星形拓扑节点清单可直接抄入报告图注设备类型数量IP 地址段功能说明核心三层交换机1172.16.255.1/30主干路由、VLAN 间路由DNS 服务器1172.16.10.10/24提供 library.example.com 解析WEBFTP 服务器1172.16.20.10/24Apache vsftpd托管图书资源DHCP 服务器1172.16.30.1/24为客户端自动分配 172.16.30.100-200管理工作站1172.16.40.100/24远程登录核心设备抓包调试普通客户端≥3DHCP 自动获取浏览网页、下载图书、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_prefixprefix)) 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_subnet100, min_subnets4) for r in result: print(f使用 /{r[prefix]} 划分{r[total_subnets]} 个子网每子网 {r[hosts_per_subnet]} 台主机) for i, s in enumerate(r[subnets]): print(f 子网{i1}: {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过于宽泛实际应选用/24254 主机或/25126 主机以精确匹配“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 cant find library.example.com: NXDOMAIN90% 是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若设为8640024小时在 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 /renewWindows或sudo dhclient -r sudo dhclientLinux检查是否获得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.confVirtualHost *:80 ServerAdmin adminexample.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_enableYES local_enableNO # 禁用本地用户只允许匿名 write_enableNO # 匿名用户不可上传仅下载 anon_root/var/ftp # 匿名用户根目录 dirmessage_enableYES xferlog_enableYES connect_from_port_20YES chown_uploadsNO listenYES pam_service_namevsftpd userlist_enableNO图书文件放置规则创建/var/ftp/pub/books/目录将 PDF/EPUB 图书文件放入此目录设置权限sudo chmod -R 755 /var/ftp/pubsudo chown -R ftp:ftp /var/ftp/pub客户端访问ftp://172.16.20.10/pub/books/即可列表下载。提示若客户端提示530 Permission denied检查vsftpd.conf中seccomp_sandboxNO某些 Ubuntu 版本需关闭沙箱及 SELinux 状态sudo setenforce 0临时关闭。4. 避坑指南课程设计中最常触发的 5 个“当场答辩失败”问题4.1 现象客户端能 ping 通网关但nslookup library.example.com返回server cant 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 langzh-CN head meta charsetUTF-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 classcard h2 服务状态/h2 pDNS 解析span iddns-status classstatus-ok正常library.example.com → 172.16.20.10/span/p pWEB 服务span idweb-status classstatus-ok正常HTTP/1.1 200/span/p pFTP 下载span idftp-status classstatus-ok正常匿名访问可用/span/p /div div classcard h2 图书资源/h2 p当前提供 strongPDF/EPUB/CHM/strong 格式电子书支持全文检索与分类浏览。/p ul lia href/books/计算机网络基础.pdf《计算机网络基础》PDF/a/li lia href/books/电子图书馆设计指南.epub《电子图书馆设计指南》EPUB/a/li lia href/books/网络协议详解.chm《网络协议详解》CHM/a/li /ul /div div classcard h2ℹ️ 格式说明/h2 p• strongPDF/strong通用格式Adobe Reader 可读适合打印br • strongEPUB/strong重排版格式手机/阅读器自适应br • strongCHM/strongWindows 帮助格式支持 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.1Reply from 172.16.30.1: bytes32 time1ms TTL255网络层可达2. DNS 解析nslookup library.example.com 172.16.10.10Name: library.example.combrAddress: 172.16.20.10应用层 DNS3. WEB 访问curl -I http://library.example.comHTTP/1.1 200 OKbrServer: Apache/2.4.52brDate: ...应用层 HTTP4. FTP 列表ftp -n 172.16.20.10→user anonymous→ls226 Directory send OKbr-rw-r--r-- 1 ftp ftp 12345678 Sep 01 10:00 计算机网络基础.pdf应用层 FTP5. 跨子网路由traceroute 172.16.20.101 172.16.30.1 0.5msbr2 172.16.255.1 0.8msbr3 172.16.20.10 1.2ms网络层路由注意curl和traceroute需在 Linux 客户端安装sudo apt install curl tracerouteWindows 客户端可用telnet library.example.com 80替代第 3 步。6.2 抓包佐证用 Wireshark 截获 DNS 查询与 HTTP GET 的完整会话光有命令行输出还不够。在核心路由器或 WEB 服务器上用 Wireshark 抓包导出dns_http.pcapng文件截图关键帧DNS 查询帧过滤udp.port53显示客户端发library.example.com查询服务器回A 172.16.20.10HTTP GET 帧过滤http.request.methodGET显示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 盘拷走在另一台电脑上一键复现。希望帮到你。本文还有配套的精品资源点击获取