☰
通信网络基础课后题怎么啃:从时延计算到滑动窗口的避坑指南
2026/9/30 8:12:14 网站建设 项目流程

简介:这份文档是《通信网络基础》(李建东、盛敏)教材的课后习题答案整理,面向通信工程、计算机网络等专业的学生及备考人员,帮助梳理课程重点、核对习题思路。内容覆盖通信网络组成、接入与网络链路类型、分组交换、虚电路、ATM信元与AAL适配、OSI七层与TCP/IP五层模型对应关系,以及Poisson过程、状态转移、组帧与CRC校验、停等式ARQ等典型习题解答,适合课后复习与考前查漏补缺。资源包共1个doc文件,约4.71MB,以文字答案与推导过程为主,便于打印或电子阅读。目前已有546人学习下载,可作为教材配套的习题参考,帮助读者对照章节顺序理解概念、掌握计算与证明题的解题路径。

1. 通信网络基础课后题怎么啃:从一道计算题翻车说起

《通信网络基础》李建东、盛敏两位老师这本教材,很多通信、电子、网络工程方向的同学都是又爱又恨。爱的是它把物理层到网络层的骨架讲得足够系统,恨的是课后习题里那些时延、吞吐、排队、编码的推导,光看答案数字根本不知道自己错在哪。我当年第一次做分组交换时延那道题,直接把发送时延和传播时延加反了,答案对不上还以为是书印错了,后来才发现是自己对“带宽”和“速率”的理解从一开始就偏了。这篇笔记不打算给你一份“课后习题答案.doc”的搬运,而是想讲清楚:拿到这本书的习题,应该按什么顺序拆、每类题背后的模型是什么、参数怎么代、算完怎么验证。适合正在跟这本书死磕的本科生,也适合考研复习时想把通信网络基础重新捋一遍的人。核心思路只有一句:答案只是结果,推导路径才是能带走的东西。

2. 先分清题型:通信网络基础课后题的四大类与对应模型

2.1 时延、吞吐、利用率:最容易被“单位”坑的一类

这类题几乎每章都有,典型问法就是“求端到端时延”“求最大吞吐量”“求链路利用率”。很多人一上来就套公式,结果单位没统一,数量级直接错。我一般会先把题目里的量全部换算成国际单位制:带宽用 bit/s,长度用 m,速率用 m/s,分组长度用 bit。发送时延等于分组长度除以带宽,传播时延等于距离除以传播速率,处理时延和排队时延看题目给不给条件。排队时延如果题目没给分布,通常默认用 M/M/1 或者简单先到先服务模型估算,但教材课后题多数只考发送和传播这两项。

这里有个血泪经验:题目里写“带宽 10 Mbps”,你要立刻反应成 10×10^6 bit/s,而不是 10×2^20。通信里带宽的 M 是十进制,存储容量里的 M 才是二进制。这个坑我见过太多人踩,算出来差 4.8%,看着不大,但选择题里就是错。

2.2 编码与调制:画波形比背公式管用

曼彻斯特编码、差分曼彻斯特、NRZ、4B/5B 这些,课后题经常让你画波形或者判断编码效率。我的做法是:先画时钟,再画数据,最后按规则叠编码。曼彻斯特是“高到低表示 0,低到高表示 1”还是反过来,不同教材约定可能不同,李建东这本里你要以正文定义为准。差分曼彻斯特看的是每个比特起始处有没有跳变,有跳变表示 0,无跳变表示 1,这个规则也容易记反。

编码效率的计算要分清“理论效率”和“实际效率”。比如曼彻斯特编码效率是 50%,因为每个比特用两个信号周期;4B/5B 是 80%,因为 4 位数据映射成 5 位码。课后题如果问“传 100 Mbit 数据需要多少码元”,你要先确定一个码元携带几比特,再算总码元数,最后除以码元速率得到时间。

2.3 交换与路由:虚电路和数据报的对比题

这类题常考“分组交换 vs 电路交换的时延比较”“虚电路建立时间对总时延的影响”。我一般会列一个时间轴:电路交换先有建立阶段,然后连续传输;分组交换没有建立阶段,但每个分组都要独立选路,可能乱序。题目如果给“分组长度 1000 bit,链路速率 1 Mbps,中间经过 3 个路由器,每个路由器处理时延 1 ms”,你要把每一跳的发送时延、传播时延、处理时延分别算出来再累加。

注意:很多课后题默认“传播时延忽略不计”或者“处理时延为 0”,但题干里如果给了具体数值,就必须代进去。我见过有人看到“忽略传播时延”就真的不写,结果题目最后问“总时延”,阅卷时直接扣分。

2.4 差错控制与滑动窗口:序号范围和窗口大小的关系

后退 N 帧和选择重传的窗口大小、序号位数关系是必考。后退 N 帧的发送窗口最大是 2^n - 1,选择重传是 2^(n-1),其中 n 是序号位数。这个结论要会推:后退 N 帧里接收窗口是 1,所以发送窗口不能超过序号空间的一半再减一;选择重传收发窗口相等,各占一半。

课后题经常给一个窗口大小,问需要几位序号。你就反过来用公式:2^n ≥ 2W(选择重传)或者 2^n ≥ W+1(后退 N 帧)。算完取最小整数 n。这里容易错的是把“窗口大小”和“序号范围”搞混,窗口是“最多能发多少个未确认帧”,序号范围是“编号能编到多少”。

3. 动手算一遍:用 Python 把时延和吞吐题做成可复用的计算脚本

3.1 环境准备与脚本骨架

你不需要装什么重型工具,Python 3.8 以上加标准库就够了。我习惯把常用公式写成函数,这样同一类题改参数就能直接跑,不用每次按计算器。下面这个脚本覆盖发送时延、传播时延、端到端时延和吞吐量四个最常考的量。

# comm_net_calc.py # 通信网络基础课后题常用计算函数 # 所有输入统一用国际单位制:bit, bit/s, m, m/s, s def transmission_delay(packet_bits, link_rate_bps): """发送时延 = 分组长度 / 链路速率""" return packet_bits / link_rate_bps def propagation_delay(distance_m, prop_speed_mps=2e8): """传播时延 = 距离 / 传播速率,默认 2e8 m/s(铜缆约 2/3 光速)""" return distance_m / prop_speed_mps def end_to_end_delay(packet_bits, link_rate_bps, distance_m, num_hops=1, proc_delay_per_hop=0.0, queue_delay_per_hop=0.0): """ 端到端时延 = 发送时延 + 传播时延 + 处理时延 + 排队时延 num_hops 表示经过的链路数,处理时延和排队时延按每跳累加 """ t_tx = transmission_delay(packet_bits, link_rate_bps) t_prop = propagation_delay(distance_m) t_proc = proc_delay_per_hop * num_hops t_queue = queue_delay_per_hop * num_hops return t_tx + t_prop + t_proc + t_queue def throughput(packet_bits, rtt_s, window_size): """滑动窗口吞吐量 = 窗口大小 * 分组长度 / 往返时间""" return window_size * packet_bits / rtt_s if __name__ == "__main__": # 示例:1000 bit 分组,1 Mbps 链路,1000 km 距离,3 跳,每跳处理 1 ms delay = end_to_end_delay( packet_bits=1000, link_rate_bps=1e6, distance_m=1e6, num_hops=3, proc_delay_per_hop=1e-3 ) print(f"端到端时延 = {delay*1000:.3f} ms") # 示例:窗口 7,分组 1000 bit,RTT 20 ms tp = throughput(1000, 0.02, 7) print(f"吞吐量 = {tp/1e6:.3f} Mbps")

逻辑说明:transmission_delay只做除法,不处理单位换算,所以调用前你要自己把 Mbps 转成 bit/s。propagation_delay默认传播速率 2e8 m/s,这是铜缆和光纤里常用的估算值,如果题目明确给 3e8 就改参数。end_to_end_delay把处理时延和排队时延按跳数累加,因为每经过一个路由器都要处理一次。throughput用的是窗口协议的基本吞吐公式,前提是窗口足够大能覆盖 RTT 内的链路容量,否则实际吞吐受限于链路速率。

参数怎么改:如果题目说“忽略传播时延”,就把distance_m设成 0;如果题目给的是“往返传播时延 RTT”,那propagation_delay要算双程,或者直接用 RTT 减发送时延。我一般会在草稿纸上先写清楚每个量的单位,再往函数里代。

3.2 用脚本验证课后题:以分组交换时延为例

假设课后题:分组长度 1200 bit,链路速率 2 Mbps,源到目的经过 2 个路由器,每段链路长 500 km,传播速率 2×10^8 m/s,路由器处理时延 0.5 ms,忽略排队。求端到端时延。

你手动算:发送时延 = 1200 / 2e6 = 0.6 ms;传播时延每段 = 500e3 / 2e8 = 2.5 ms;三段链路共 3 段传播,总传播 = 7.5 ms;处理时延 2 个路由器 × 0.5 ms = 1 ms;总时延 = 0.6 + 7.5 + 1 = 9.1 ms。注意发送时延只算一次,因为分组在源端发出去后,中间路由器是存储转发,但题目如果问“从源发出到目的收到”,发送时延只发生在源端一次,中间路由器的发送时延已经包含在“存储转发”里,但很多教材简化处理只算一次。这里要按你教材的约定来,李建东这本里通常把每跳的发送时延都算进去,所以更严谨的算法是每段链路都有发送时延。

用脚本验证:

# 每段链路都有发送时延的情况 t_tx_per_hop = transmission_delay(1200, 2e6) # 0.6 ms t_prop_per_hop = propagation_delay(500e3) # 2.5 ms num_links = 3 t_proc_total = 2 * 0.5e-3 # 1 ms total = num_links * (t_tx_per_hop + t_prop_per_hop) + t_proc_total print(f"总时延 = {total*1000:.3f} ms") # 3*(0.6+2.5)+1 = 10.3 ms

看到差别了吗?只算一次发送时延是 9.1 ms,每跳都算是 10.3 ms。课后题答案给哪个,取决于题干怎么描述。如果题目说“分组在每段链路上都要重新发送”,那就用 10.3 ms;如果说“源端发送后中间节点只转发不重新封装”,那发送时延只算一次。这个细节就是很多人对答案对不上的原因。

3.3 滑动窗口题的手算与脚本互验

题目:选择重传协议,序号用 4 位,问最大发送窗口是多少?手算:选择重传窗口 ≤ 2^(n-1) = 2^3 = 8。如果题目问“后退 N 帧”,那就是 2^4 - 1 = 15。脚本里加一个函数:

def max_window(seq_bits, protocol="selective_repeat"): """根据序号位数和协议类型返回最大窗口""" if protocol == "selective_repeat": return 2 ** (seq_bits - 1) elif protocol == "go_back_n": return 2 ** seq_bits - 1 else: raise ValueError("protocol 只支持 selective_repeat 或 go_back_n") print(max_window(4, "selective_repeat")) # 8 print(max_window(4, "go_back_n")) # 15

参数说明:seq_bits是序号字段的二进制位数,不是窗口大小。如果你把窗口大小传进去就错了。这个函数我一般用来快速检查课后题答案,如果手算和脚本不一致,先检查是不是协议类型搞混了。

4. 避坑与排查:课后题对答案时最容易翻车的 5 个地方

4.1 现象:时延算出来比答案大 10 倍

原因:带宽单位没换算。题目写“10 Mbps”,你当成 10×2^20 bit/s,实际应该是 10×10^6。或者距离写“1000 km”,你直接代 1000 而不是 1e6 米。

解决:所有量先统一到 bit、s、m。我习惯在草稿纸左上角写一行“单位:bit, s, m”,每代一个数就检查一次。

4.2 现象:滑动窗口效率算出来大于 1

原因:把窗口大小和序号空间搞混,或者忘了除以 RTT。效率 = 窗口大小 × 发送时延 / (发送时延 + RTT + 处理时延),如果窗口太大,效率确实可以接近 1,但不会超过 1。如果超过 1,检查是不是把“窗口大小”当成了“序号位数”。

解决:效率公式里分子是“窗口内能连续发送的时间”,分母是“一个周期总时间”。窗口再大,分子也不会超过分母。

4.3 现象:编码波形画出来和答案反了

原因:曼彻斯特编码的 0 和 1 约定不同。有的教材写“高到低为 0”,有的写“高到低为 1”。李建东这本里你要翻到编码那一节的正文,看它怎么定义。

解决:做题前先在草稿纸上写一行“本教材约定:曼彻斯特 0 = 高到低,1 = 低到高”,然后按这个画。差分曼彻斯特同理,先确认“起始跳变表示 0 还是 1”。

4.4 现象:CRC 校验题余数算错

原因:模 2 除法里借位规则和普通除法不同,或者生成多项式少写了一位。CRC 的生成多项式最高位和最低位都是 1,比如 x^4 + x + 1 对应 10011,不是 1011。

解决:先把生成多项式写成二进制,位数是最高次幂加一。被除数后面补的 0 的个数等于生成多项式位数减一。模 2 除法每一步做异或,不借位。

4.5 现象:路由聚合题答案和邻居不一样

原因:聚合时没有取最长公共前缀,或者把不连续的地址也聚进去了。比如 192.168.0.0/24 和 192.168.1.0/24 可以聚成 192.168.0.0/23,但 192.168.0.0/24 和 192.168.2.0/24 不能直接聚成 /22,因为中间跳过了 192.168.1.0/24。

解决:把地址写成二进制,从左往右找连续相同的位数,相同位数就是聚合后的前缀长度。不连续就拆成多条。

5. 进阶技巧:用表格把课后题参数归档,考前只翻一张纸

5.1 建立自己的“题型-公式-单位”速查表

课后题做多了会发现,翻来覆去就是那些模型。我后来干脆用 Markdown 建了一张表,每做一道新题就往里加一行。考前不翻书,只看这张表。下面是我自己用的格式,你可以直接抄。

题型核心公式关键参数常见单位坑
发送时延L / RL 分组长度(bit),R 速率(bit/s)Mbps 是 10^6,不是 2^20
传播时延d / vd 距离(m),v 传播速率(m/s)km 要转 m
端到端时延发送+传播+处理+排队每跳累加发送时延算一次还是每跳算
滑动窗口效率W×Tt / (Tt+RTT)W 窗口大小,Tt 发送时延窗口和序号位数别混
后退 N 帧窗口2^n - 1n 序号位数不是 2^n
选择重传窗口2^(n-1)n 序号位数收发窗口相等
CRC 余数模 2 除法生成多项式位数补 0 个数 = 位数-1
路由聚合最长公共前缀二进制前缀不连续不能聚

这张表我一般放在错题本第一页,每次对答案对不上就回来查一行。用了大概两周,时延类题的正确率从六成提到九成以上。

5.2 用“反向验证”检查答案合理性

算完一道题,不要急着对答案,先做三件事:第一,看数量级。端到端时延如果是几十毫秒,合理;如果是几秒,肯定错了。第二,看边界。窗口大小如果是 0 或者负数,错了;效率如果大于 1,错了。第三,换一种方法算。比如时延题,你可以用脚本算一遍,再手算一遍,两个结果一致再对答案。如果脚本和手算不一致,先检查单位,再检查公式。

我有个习惯:每道计算题做完,在旁边写一行“如果带宽翻倍,时延怎么变”。如果带宽翻倍发送时延减半,但传播时延不变,总时延不会减半。这个直觉能帮你快速判断答案是不是离谱。

5.3 把错题按“错因”分类,而不是按章节

很多人错题本按章节排,第一章、第二章,结果复习时还是不知道自己的弱项在哪。我后来改成按错因排:单位错、公式错、概念错、计算错。单位错就练换算,公式错就背推导,概念错就回去看正文,计算错就放慢速度。这样复习效率高很多。

最后说一个我自己的教训:当年考研复习,我把课后题答案背得滚瓜烂熟,结果考试换了个参数,我还是按背的答案写,直接翻车。后来才明白,课后题的价值不是答案本身,而是逼你把每个公式的适用条件和参数含义搞清楚。现在我做任何通信网络的计算,都会先问自己三个问题:这个公式的前提是什么?单位统一了吗?结果在物理上合理吗?这三个问题问完,基本不会出大错。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询