
简介这份计算机网络习题文档面向高校计算机及相关专业学生用于课程复习、期末备考与考研自测。内容以选择题为主覆盖网络定义、资源共享、ARPANET与分组交换、网络拓扑、OSI参考模型、TCP/IP协议、面向连接与无连接服务、传输介质及TCP/UDP熟知端口等核心考点并附有逐题解析便于对照理解易错概念。资源包内含1个doc文件约611KB可直接打印或在线作答适合课堂练习与考前查漏补缺。目前已有291人学习下载可作为章节自测与知识点梳理的配套材料帮助读者快速定位薄弱环节、巩固网络体系结构基础。1. 一份 .doc 习题集为什么值得当成工程项目来做如果你手里只有一份「计算机专业-计算机网络习题.doc」第一反应可能是把它当复习资料打印出来刷一遍。但真正做过网络方向的人会告诉你这份文档的价值远不止刷题——它其实是一份可以拆解、标注、自动化验证的知识图谱原料。计算机网络这门课横跨物理层到应用层谢希仁、王道、自顶向下三个体系的习题侧重点完全不同期末复习和 408 考研的考点分布也不一样。把这份 doc 直接丢进 Word 里翻你永远不知道自己哪一层最弱。我一般会把它转成结构化数据按协议层次打标签再用脚本统计错题分布最后生成一份只属于你的薄弱点清单。这套流程适合正在准备期末、考研 408、或者想系统补网络基础的 DevOps 工程师——毕竟天天跟 TCP、DNS、HTTP 打交道但真让你说清楚三次握手为什么不是两次很多人还是卡壳。2. 把 doc 拆成可检索题库格式转换与结构化字段设计2.1 为什么不能直接复制粘贴到 Excel.doc 格式尤其是老版本二进制格式和 .docx 有本质区别。直接全选复制到 Excel你会发现题目、选项、答案全挤在一列里题号丢失图片题直接变成空白。更麻烦的是很多习题集的答案和题目在同一段落用「答案」或「【答案】」分隔但分隔符不统一。我见过最离谱的一份前 50 题用「答案」后 50 题用「参考答案」还有几题答案直接跟在选项后面没有标记。所以第一步不是急着解析而是先统一格式。常见做法是先用 LibreOffice 或 Word 把 .doc 另存为 .docx再用 python-docx 读取。如果你拿到的就是 .doc可以用libreoffice --headless --convert-to docx批量转。转换完先别写解析脚本手动翻一遍把答案标记格式统一成一种比如全部改成「答案」。这一步花 10 分钟后面能省 2 小时。2.2 用 python-docx 提取段落并切分题目from docx import Document import re doc Document(计算机网络习题.docx) paragraphs [p.text.strip() for p in doc.paragraphs if p.text.strip()] # 统一答案标记 raw_text \n.join(paragraphs) raw_text raw_text.replace(参考答案, 答案).replace(【答案】, 答案) # 按题号切分支持 1. 1、 第1题 三种格式 pattern re.compile(r(?:^|\n)(?:第)?(\d)[\.、题]\s*) splits pattern.split(raw_text) questions [] # splits[0] 是题号前的杂项之后每两个元素是一组题号 内容 for i in range(1, len(splits), 2): qid int(splits[i]) body splits[i1].strip() # 分离答案 if 答案 in body: stem, answer body.split(答案, 1) answer answer.strip().split(\n)[0] else: stem, answer body, questions.append({id: qid, stem: stem.strip(), answer: answer}) print(f共解析 {len(questions)} 题)这段代码的核心逻辑是先把所有段落拼成一个长字符串统一答案标记然后用正则按题号切分。pattern.split会把字符串切成「题号」和「内容」交替的列表所以从索引 1 开始每次跳 2 取一组。答案分离时只取第一行因为有些答案后面还跟着解析解析可以单独存一个字段。参数说明re.compile里的(?:^|\n)确保题号在行首避免把「如图 1.2 所示」里的数字误判成题号。如果你的文档题号格式更复杂比如「一、选择题」下面才是「1.」那需要先按大题切分再按小题切分这里不展开。2.3 字段设计让每道题都能被检索和统计解析出来的题目如果只存 id、题干、答案后面做分析时会很被动。我一般会加这几个字段字段名类型说明idint题号从 1 开始chapterstr所属章节如「传输层」stemstr题干含选项answerstr标准答案qtypestr题型单选/多选/判断/填空/简答tagslist知识点标签如 [TCP, 三次握手]difficultyint难度 1-5初期可留空chapter 和 tags 需要人工或半自动标注。我的做法是先用关键词规则打一版粗标签比如题干里出现「TCP」「UDP」就归到传输层出现「HTTP」「DNS」归到应用层。规则覆盖不到的再手动补。别小看这一步后面统计薄弱章节全靠它。3. 按协议层次打标签从题干关键词到知识点映射3.1 五层模型的关键词规则表计算机网络习题的考点分布高度集中在几个协议上。我整理了一份关键词到知识点的映射规则覆盖谢希仁和王道体系里 80% 以上的题目协议层次关键词知识点标签物理层码元、波特率、奈氏准则、香农定理编码与调制数据链路层CRC、PPP、以太网、MAC、CSMA/CD差错控制、介质访问网络层IP、子网掩码、CIDR、ARP、ICMP、路由编址与转发传输层TCP、UDP、三次握手、四次挥手、拥塞控制可靠传输应用层HTTP、DNS、FTP、SMTP、DHCP应用协议用规则打标签的代码很简单tag_rules { 传输层: [TCP, UDP, 三次握手, 四次挥手, 拥塞, 滑动窗口], 网络层: [IP, 子网, CIDR, ARP, ICMP, 路由, 网关], 数据链路层: [CRC, PPP, 以太网, MAC, CSMA, 帧], 应用层: [HTTP, DNS, FTP, SMTP, DHCP, URL], 物理层: [码元, 波特率, 奈氏, 香农, 调制], } def tag_question(stem): tags [] for layer, keywords in tag_rules.items(): for kw in keywords: if kw.lower() in stem.lower(): tags.append(layer) break return tags if tags else [未分类] for q in questions: q[chapter] tag_question(q[stem])[0]逻辑说明遍历每道题的题干只要命中某个层次的关键词就归到该层。break保证一道题只归一个主层次避免「TCP/IP」这种同时命中传输层和网络层的情况。如果你想要多标签把break去掉tags存列表即可。参数调整关键词表需要根据你的习题集微调。比如谢希仁版里「时延」出现频率很高可以加到物理层或网络层王道版里「GBN」「SR」是传输层重点要单独加。规则跑完后打印「未分类」的题目手动补规则迭代两三轮就能覆盖 95% 以上。3.2 用统计结果定位薄弱章节打完标签后按章节统计题目数量和你的错题数量。假设你刷了一遍把错题 id 记下来用下面这段代码生成薄弱点报告wrong_ids [3, 7, 12, 25, 33, 41, 56] # 手动记录或从答题卡导入 from collections import Counter chapter_total Counter(q[chapter] for q in questions) chapter_wrong Counter(q[chapter] for q in questions if q[id] in wrong_ids) for ch in chapter_total: total chapter_total[ch] wrong chapter_wrong.get(ch, 0) rate wrong / total * 100 print(f{ch}: 共{total}题错{wrong}题错误率{rate:.1f}%)输出会告诉你哪个层次最弱。我见过很多人传输层错误率 40% 以上但应用层几乎全对——因为 HTTP、DNS 天天用TCP 的拥塞控制却只在考试里见。这份报告比「感觉哪里不会」靠谱得多。提示错题 id 可以手动记在纸上再录入也可以用在线答题卡导出 CSV。别在 Word 里直接标记后面统计时你会后悔。4. 避坑与排查doc 解析和标签统计里的五个血泪教训4.1 现象解析出来题目数量对不上少了十几题原因doc 里的题号格式不统一有些题用「1、」有些用「1.」还有的题号后面没有分隔符直接跟文字。正则[\.、题]只覆盖了三种遇到「1」或「1」就漏了。解决把正则改成r(?:^|\n)(?:第)?[(]?(\d)[)]?[\.、题]?\s*允许括号和可选分隔符。改完先打印切分结果的前 20 条确认题号都抓到了再跑全量。4.2 现象答案和解析混在一起答案字段里带了一大段解释原因有些习题集在答案后面直接跟「解析」而我的代码只按「答案」切分解析被当成答案的一部分。解决在分离答案时再加一层判断遇到「解析」「分析」「说明」就截断。代码改成answer answer.split(解析)[0].split(分析)[0].strip()。如果解析也想保留单独存一个explanation字段。4.3 现象关键词打标签后网络层题目被误分到传输层原因「TCP/IP」里的「IP」命中了网络层关键词但整道题考的是 TCP 拥塞控制。规则按字典顺序遍历传输层排在网络层前面先命中就 break 了。解决调整规则优先级把更具体的协议关键词放前面。或者改成打分制每个命中关键词给对应层次加 1 分最后取最高分。这样「TCP/IP」会给传输层和网络层各加 1 分如果题干里还有「拥塞」传输层得 2 分胜出。4.4 现象统计错误率时有些章节显示 0 题原因标签规则没覆盖到该章节所有题都被归到「未分类」而统计时只遍历了chapter_total里有的章节。解决在统计前先检查「未分类」的数量如果超过总题数的 10%说明规则需要补。打印未分类题目的题干人工看几条就能找到缺失的关键词。4.5 现象docx 里的图片题全部丢失题干变成空白原因python-docx 的paragraphs只读文本图片存在run的inline_shapes里不会出现在段落文本中。解决图片题单独处理。遍历doc.inline_shapes可以拿到图片但和题号的对应关系需要靠位置推断。我的做法是先把图片全部导出到文件夹命名用「题号_序号.png」然后手动把图片题标记出来在题干里写「[见图]」。如果图片题不多手动补比写自动化脚本快。5. 从错题清单到复习计划用脚本生成每日刷题任务5.1 按遗忘曲线分配复习间隔错题不是刷一遍就完事。我一般用简化的艾宾浩斯间隔第 1 天、第 2 天、第 4 天、第 7 天、第 15 天各复习一次。用脚本把错题按这个间隔排进日历from datetime import date, timedelta intervals [1, 2, 4, 7, 15] today date.today() schedule [] for qid in wrong_ids: for day_offset in intervals: review_date today timedelta(daysday_offset) schedule.append({date: review_date, qid: qid}) # 按日期分组输出 from itertools import groupby schedule.sort(keylambda x: x[date]) for d, group in groupby(schedule, keylambda x: x[date]): ids [str(item[qid]) for item in group] print(f{d}: 复习第 {, .join(ids)} 题)逻辑说明intervals是复习间隔天数每道错题生成 5 条复习记录。groupby按日期聚合输出每天要复习的题号。你可以把这个输出导入日历或待办工具。参数调整如果错题超过 50 道每天复习量会很大。可以把间隔拉长比如[2, 5, 10, 20]或者只对错误率高的章节用完整间隔其他章节用简化版。5.2 用错题反查知识点而不是只记答案刷第二遍时别只看「这题选 C」要问自己「这题考的是 TCP 的哪个机制」。我一般会在错题旁边写一行「考点慢启动阈值调整」然后按考点而不是题号来复习。同一个考点可能对应好几道题集中突破比散着刷效率高。具体做法在标签基础上再加一个concept字段手动填考点名。统计时按concept分组错误率最高的前三个考点就是你的重点突破对象。比如「子网划分」错误率 60%那就专门找 10 道子网划分题连做做完再回头看错题通常会有「原来都是同一个坑」的感觉。5.3 把习题集和实际抓包对照起来这是我觉得最值的一步。做完 TCP 三次握手的题打开 Wireshark 抓一次本机访问网站的包找到 SYN、SYN-ACK、ACK 三个包对照题里的序列号变化看一遍。做完 DNS 的题用nslookup或dig查一次域名看递归查询和迭代查询的实际报文。习题集里的抽象概念一旦和真实抓包对上记忆会牢固得多。我自己的习惯是每做完一个章节的题就抓一次对应的包。传输层抓 TCP 握手和挥手网络层抓 ICMP 和 ARP应用层抓 HTTP 和 DNS。抓包不用多每个协议抓一次就够。你会发现题里那些「序列号」「窗口大小」「TTL」不再是死记硬背的数字而是屏幕上真实跳动的字段。这套流程跑下来一份 doc 习题集就变成了带标签、有统计、能排期的个人复习系统。工具不复杂python-docx 加几十行脚本就够关键是字段设计和标签规则要贴合你的实际考点。我踩过的坑基本都写在上面了希望帮到你。本文还有配套的精品资源点击获取