简介:这份PDF是《通信网络基础》(李建东、盛敏编著)教材的课后习题参考答案,面向通信工程、网络工程等专业的学生及备考人员,用于核对作业、梳理考点与期末复习。资源包共1个PDF文件,大小约1.32MB,内容按章节组织,覆盖通信网络组成、接入与网络链路、分组交换、虚电路、ATM信元与AAL适配、OSI七层与TCP/IP五层对应关系,以及随机过程的平稳性与各态历经性等典型题目,并附有推导过程与计算步骤。目前已有296人学习下载,可作为课后自测与知识点查漏补缺的参考,帮助读者理解教材中链路速率、协议分层、信元格式等易混概念,适合配合课本逐章对照使用。
1. 通信网络基础课后习题答案怎么用:从“对答案”到“真会做”的分水岭
很多人拿到《通信网络基础》李建东、盛敏版课后习题答案,第一反应是拍照搜题、对答案、抄过程。我带过几届做网络方向的学生,也帮同事复盘过考研专业课,发现一个反直觉的结论:答案本身不值钱,值钱的是答案里暴露出来的解题路径和参数取值习惯。这门课的习题覆盖了信道容量、香农公式、排队论、路由与交换、差错控制等硬核内容,光看答案你只能知道“结果是多少”,但考试和工程里真正卡人的是“为什么这么算、边界条件在哪、单位怎么统一”。所以这篇笔记不打算给你一份“答案速查表”,而是把课后习题答案当成一个可复现的解题训练系统:先讲清楚这门课习题的题型分布和常见陷阱,再落到具体题型的推导步骤、参数代入、单位换算,最后给你一套自查和进阶的方法。适合正在学这门课、准备期末或考研专业课、以及需要快速捡起通信网络基础的从业者。下面所有内容都围绕“怎么把答案用出复现能力”展开,不堆砌概念。
2. 先拆题型:李建东盛敏版课后题到底在考什么
2.1 四类高频题型与对应章节分布
把整本教材的课后题过一遍,你会发现题目基本落在四个筐里:信道与容量计算、编码与差错控制、排队与网络时延、路由与交换。这四类不是平均分布,信道和排队往往占计算量大头,编码和路由更偏概念加少量计算。我一般会先按章节把题目归类,再决定每类花多少时间。
| 题型 | 典型章节 | 常见问法 | 核心公式/方法 |
|---|---|---|---|
| 信道容量 | 信道与噪声 | 求C、求带宽、求信噪比 | 香农公式 C=B·log₂(1+S/N) |
| 差错控制 | 编码与差错 | 求码距、检错纠错能力 | d_min与检错/纠错关系 |
| 排队时延 | 排队论 | 求平均队长、等待时间 | M/M/1、Little公式 |
| 路由交换 | 网络层 | 求最短路径、转发表 | Dijkstra、最长前缀匹配 |
这张表的作用是让你拿到一道题先定位,而不是上来就翻答案。定位错了,公式套错,答案对不上还以为是计算失误。
2.2 答案里最容易被忽略的三个信息
很多人只看最终数字,其实答案里藏着三个关键信息:单位、中间步骤的近似、以及边界条件的讨论。比如香农公式里信噪比是比值还是dB,答案里如果直接写S/N=1000,那它默认是比值;如果写30dB,你就得先转成1000。再比如排队论题里,答案可能把λ和μ的单位统一成“个/秒”,但题目给的是“个/分钟”,这一步不写出来,你自己做就翻车。我习惯在答案旁边用红笔标出这三样,后面复习只看红笔部分。
2.3 从答案反推解题模板
每类题型其实都有固定模板。以香农公式为例,模板是:确认B单位→确认S/N形式→代入→取log→得C。你不需要背答案,只需要把模板练熟。下面这一章就按题型给你可抄的推导步骤和参数说明。
3. 香农公式与信道容量题:参数代入和单位换算的完整推演
3.1 香农公式的标准形式与三个必调参数
香农公式写出来简单:C = B · log₂(1 + S/N)。但实际做题时,三个参数每一个都能让你翻车。B是信道带宽,单位Hz;S/N是信噪比,必须是比值,不能直接代dB;log₂在计算器上通常用log或ln换底。我一般会先把题目给的量列成三行:B=?,S/N=?,求C=?。如果S/N给的是dB,先做一步转换:S/N(比值) = 10^(dB/10)。这一步不做,后面全错。
import math def shannon_capacity(B, snr_db=None, snr_ratio=None): """ 计算香农信道容量 B: 带宽,单位Hz snr_db: 信噪比,单位dB(与snr_ratio二选一) snr_ratio: 信噪比比值(与snr_db二选一) 返回:C,单位bit/s """ if snr_db is not None: snr_ratio = 10 ** (snr_db / 10.0) # dB转比值,关键一步 if snr_ratio is None: raise ValueError("必须提供snr_db或snr_ratio") C = B * math.log2(1 + snr_ratio) # 香农公式主体 return C # 例:B=3000Hz,信噪比30dB C = shannon_capacity(3000, snr_db=30) print(f"C = {C:.2f} bit/s") # 约 29901.18 bit/s这段代码的逻辑说明:先判断信噪比给的是dB还是比值,如果是dB就做10^(dB/10)转换,然后套香农公式。参数说明:B不能代kHz,必须转成Hz;snr_db和snr_ratio只能给一个,给两个会以snr_db为准。你手算时也一样,先把单位统一到Hz和比值,再按计算器。
3.2 带宽与信噪比的互换关系题怎么下手
有一类题会问:带宽减半,信噪比要提高多少才能保持容量不变?这种题不要硬算,先写等式:B₁·log₂(1+S₁/N₁) = B₂·log₂(1+S₂/N₂)。如果B₂=B₁/2,那log₂(1+S₂/N₂)必须是原来的两倍。这时候你可以用数值试,也可以直接解。我一般会先假设原来的S/N,算出一个C,再反推新的S/N。答案里如果给了具体数值,你就用数值验证;如果要求表达式,就保留对数形式。
注意:这类题最容易错在把dB直接当比值代入。只要题目出现dB,先转比值,这是血泪经验。
3.3 用Python验证课后题答案的批量方法
如果你想把一整章的香农公式题都验证一遍,可以写一个批量脚本,把题目参数做成列表,一次性输出结果,再和答案对。这样比一题一题按计算器快,而且能发现答案里可能的印刷错误。
# 批量验证香农公式题 problems = [ {"B": 3000, "snr_db": 30}, {"B": 4000, "snr_db": 20}, {"B": 1000, "snr_ratio": 100}, ] for i, p in enumerate(problems, 1): if "snr_db" in p: C = shannon_capacity(p["B"], snr_db=p["snr_db"]) else: C = shannon_capacity(p["B"], snr_ratio=p["snr_ratio"]) print(f"题{i}: C = {C:.2f} bit/s")逻辑说明:把每道题的参数做成字典,循环调用同一个函数。参数说明:如果题目给的是比值就直接传snr_ratio,给dB就传snr_db。这样你只需要核对答案的数字,不用重复写公式。
4. 差错控制与编码题:码距、检错纠错能力的计算套路
4.1 码距与检错纠错能力的关系
编码题里最常见的是给一个码组,求最小码距d_min,然后问能检几位错、纠几位错。关系是:检e位错需要d_min ≥ e+1;纠t位错需要d_min ≥ 2t+1。很多答案只写结果,不写这个不等式,导致你下次遇到还是不会。我一般会先把码组两两比较,找出最小汉明距离,再套不等式。
def hamming_distance(codeword1, codeword2): """计算两个等长码字的汉明距离""" if len(codeword1) != len(codeword2): raise ValueError("码字长度必须相同") return sum(b1 != b2 for b1, b2 in zip(codeword1, codeword2)) def min_distance(code_list): """计算码组的最小码距""" min_d = float('inf') for i in range(len(code_list)): for j in range(i+1, len(code_list)): d = hamming_distance(code_list[i], code_list[j]) if d < min_d: min_d = d return min_d # 例:码组 {000, 011, 101, 110} code = ["000", "011", "101", "110"] d_min = min_distance(code) print(f"最小码距 = {d_min}") # 2 # 检错能力 e = d_min - 1 = 1 # 纠错能力 t = (d_min - 1) // 2 = 0逻辑说明:两两算汉明距离,取最小。参数说明:码字必须等长,且用字符串表示。算完d_min后,检错能力e=d_min-1,纠错能力t=(d_min-1)//2。这个套路适用于所有线性分组码的课后题。
4.2 循环冗余校验CRC的手算与代码验证
CRC题在课后题里经常出现,给生成多项式和数据,求余数。手算用模2除法,代码可以用Python的位运算模拟。我一般会先手算一遍,再用代码验证,这样考试时手算不会慌。
def crc_remainder(data_bits, poly_bits): """ 模2除法求CRC余数 data_bits: 数据位字符串,如 '1101' poly_bits: 生成多项式位字符串,如 '1011' """ data = list(data_bits) + ['0'] * (len(poly_bits) - 1) poly = list(poly_bits) for i in range(len(data_bits)): if data[i] == '1': for j in range(len(poly)): data[i+j] = str(int(data[i+j]) ^ int(poly[j])) return ''.join(data[-(len(poly_bits)-1):]) # 例:数据1101,生成多项式1011 rem = crc_remainder("1101", "1011") print(f"CRC余数 = {rem}") # 001逻辑说明:先把数据后面补len(poly)-1个0,然后逐位做模2除法,遇到1就异或生成多项式。参数说明:data_bits和poly_bits都用字符串,长度任意。最后取余数部分。这个代码可以直接用来核对课后题的CRC结果。
4.3 海明码校验位位置与计算
海明码题常考校验位放在2的幂次位置,然后求校验位的值。我一般会先列出所有位置,标出哪些是校验位,哪些是数据位,然后按覆盖关系算。答案里如果只给最终码字,你就用这个流程反推。
def hamming_encode(data_bits): """ 生成海明码(校验位在2的幂次位置) data_bits: 数据位字符串,如 '1011' 返回:海明码字符串 """ m = len(data_bits) r = 0 while (2**r) < (m + r + 1): r += 1 n = m + r code = ['0'] * (n + 1) # 1-indexed # 填入数据位 j = 0 for i in range(1, n+1): if i & (i-1) != 0: # 不是2的幂次 code[i] = data_bits[j] j += 1 # 计算校验位 for i in range(r): pos = 2**i parity = 0 for k in range(1, n+1): if k & pos and k != pos: parity ^= int(code[k]) code[pos] = str(parity) return ''.join(code[1:]) # 例:数据1011 hcode = hamming_encode("1011") print(f"海明码 = {hcode}")逻辑说明:先确定校验位个数r,然后按位置填数据,再对每个校验位计算覆盖范围内的异或。参数说明:data_bits用字符串,返回也是字符串。这个代码可以帮你验证课后题的海明码结果。
5. 排队论与网络时延题:M/M/1和Little公式的落地计算
5.1 M/M/1模型的核心参数与公式
排队论题在通信网络基础里主要考M/M/1:到达率λ,服务率μ,利用率ρ=λ/μ。核心公式:平均队长L=ρ/(1-ρ),平均等待时间W=L/λ,平均系统时间T=W+1/μ。很多答案直接给数字,但你要知道每个量的单位。λ和μ必须统一成“个/秒”或“个/分钟”,不能混。
def mm1_metrics(lam, mu): """ M/M/1排队模型指标 lam: 到达率(个/秒) mu: 服务率(个/秒) 返回:rho, L, W, T """ if lam >= mu: raise ValueError("系统不稳定,lam必须小于mu") rho = lam / mu L = rho / (1 - rho) W = L / lam T = W + 1 / mu return rho, L, W, T # 例:λ=0.5个/秒,μ=1个/秒 rho, L, W, T = mm1_metrics(0.5, 1.0) print(f"ρ={rho:.2f}, L={L:.2f}, W={W:.2f}s, T={T:.2f}s")逻辑说明:先判断稳定性,再算ρ、L、W、T。参数说明:λ和μ单位必须一致,如果题目给的是“个/分钟”,先除以60转成“个/秒”。这个代码可以直接套课后题。
5.2 Little公式在时延题里的应用
Little公式:L = λ·W。它适用于任何稳定系统,不限于M/M/1。有些题会给你平均队长和到达率,让你求平均等待时间,直接用W=L/λ。我一般会先确认系统是否稳定,再套公式。答案里如果用了Little公式但没写出来,你就补上这一步。
5.3 单位换算与常见陷阱
排队论题最大的坑是单位。题目可能给λ=120个/分钟,μ=3个/秒,你不换算直接算,ρ=40,系统不稳定,但实际是稳定的。所以第一步永远是统一单位。我习惯把λ和μ都转成“个/秒”,再算。另外,如果题目问的是“平均等待时间”,不要和“平均系统时间”搞混,前者不包括服务时间。
提示:算完ρ后先看是否小于1,如果大于等于1,要么是单位错了,要么是题目设计成不稳定系统,需要讨论。
6. 路由与交换题:Dijkstra和最长前缀匹配的解题步骤
6.1 Dijkstra算法求最短路径的表格法
路由题里Dijkstra是必考。手算时用表格法:列出所有节点,每次选一个未访问的最近节点,更新邻居距离。答案里通常只给最终路径和距离,但你要把表格画出来,才能保证不错。我一般会画一个表,列是节点,行是迭代次数。
import heapq def dijkstra(graph, start): """ graph: 邻接表,{节点: {邻居: 权重}} 返回:最短距离字典和前驱字典 """ dist = {node: float('inf') for node in graph} dist[start] = 0 prev = {node: None for node in graph} pq = [(0, start)] while pq: d, u = heapq.heappop(pq) if d > dist[u]: continue for v, w in graph[u].items(): if dist[u] + w < dist[v]: dist[v] = dist[u] + w prev[v] = u heapq.heappush(pq, (dist[v], v)) return dist, prev # 例:一个简单网络 graph = { 'A': {'B': 2, 'C': 5}, 'B': {'C': 1, 'D': 4}, 'C': {'D': 2}, 'D': {} } dist, prev = dijkstra(graph, 'A') print(dist) # {'A':0, 'B':2, 'C':3, 'D':5}逻辑说明:用优先队列每次取最近节点,更新邻居。参数说明:graph是邻接表,权重必须非负。这个代码可以验证课后题的最短路径结果。
6.2 最长前缀匹配的转发表查找
交换题里最长前缀匹配是重点。给一个目的IP,在转发表里找匹配的前缀,选最长的。我一般会把转发表按前缀长度排序,从长到短匹配。答案里如果只给下一跳,你就用这个方法反推。
def longest_prefix_match(ip, table): """ ip: 目的IP字符串,如 '192.168.1.5' table: 列表,每项为 (前缀, 下一跳),如 ('192.168.1.0/24', 'R1') 返回:匹配的下一跳 """ ip_int = int(''.join(f'{int(x):08b}' for x in ip.split('.')), 2) best = None best_len = -1 for prefix, nexthop in table: net, length = prefix.split('/') length = int(length) net_int = int(''.join(f'{int(x):08b}' for x in net.split('.')), 2) mask = (0xFFFFFFFF << (32 - length)) & 0xFFFFFFFF if (ip_int & mask) == (net_int & mask): if length > best_len: best_len = length best = nexthop return best # 例 table = [('192.168.1.0/24', 'R1'), ('192.168.0.0/16', 'R2'), ('0.0.0.0/0', 'R3')] print(longest_prefix_match('192.168.1.5', table)) # R1逻辑说明:把IP和前缀都转成整数,用掩码比较,选前缀最长的。参数说明:table里前缀格式为“网络/长度”,下一跳为字符串。这个代码可以帮你核对课后题的转发表查找结果。
7. 避坑与排查:课后题答案使用中的5个血泪教训
7.1 现象:答案数字对不上,差一个常数
原因:单位没统一。比如带宽给kHz,你直接代Hz;或者信噪比给dB,你直接当比值。解决:每道题先列单位,统一到基本单位再算。
7.2 现象:排队论题算出来ρ>1,系统不稳定
原因:λ和μ单位不一致,或者题目给的是“个/分钟”和“个/秒”。解决:先统一成“个/秒”,再算ρ。如果还是>1,检查题目是否故意设计成不稳定。
7.3 现象:CRC余数手算和答案不一致
原因:模2除法时异或顺序错了,或者补零个数不对。解决:补len(poly)-1个零,从高位到低位逐位异或,用代码验证。
7.4 现象:海明码校验位位置搞混
原因:记成从0开始编号,或者校验位放在非2的幂次位置。解决:统一用1-indexed,校验位在1,2,4,8...位置。
7.5 现象:Dijkstra算出的路径和答案不同但距离相同
原因:存在多条等长路径,答案选了另一条。解决:只要距离对,路径可以不同,考试时写清楚你的选择依据即可。
8. 进阶:用Python把整本课后题做成可复现的解题库
最后一章说一个我自己的习惯:把课后题按题型做成Python函数库,每道题写一个测试用例,答案作为断言。这样你复习时跑一遍测试,就知道自己哪里忘了。比如香农公式、CRC、M/M/1、Dijkstra各写一个函数,然后写一个test_all.py,把课后题参数和答案填进去。跑通就说明你会了,跑不通就回去看哪一步错了。这个方法比反复翻答案有效得多,因为你是用代码复现解题逻辑,而不是背数字。我一般会把这个库放在本地,考前跑一遍,比看笔记快。希望帮到你。
本文还有配套的精品资源,点击获取