简介:这是一份以计算机网络典型计算题为线索的复习文档,适合备考期末、考研复习或需要补基础算法能力的读者。文档按题型串联零散公式,覆盖电路交换与分组交换的时延比较、发送与传播时延分析、香农公式求信道容量、传输效率计算、光波频带宽度、CRC差错检验、PPP帧解析、码分多址等常见考点;每一题均给出已知条件、推导过程和结论,便于对照练习和自查。压缩包内仅含1个docx文件,共57KB,内容轻量,可直接阅读或打印。当前已有217人学习。通过梳理这些题目的解题思路,读者能清楚理解分组交换存储转发延迟与电路建立时间的关系、总时延中发送时延与传播时延的主导条件、信噪比与带宽的换算关系,以及应用层数据长度对传输效率的影响,同时掌握CRC校验余数计算和码分多址信号分解方法,从而提升综合计算能力和解题准确率。
1. 这份计算机网络计算题文档:考前最后三天靠它突击够不够
期末周刷题的时候,最容易翻车的不是概念题,而是那些看着简单、一按计算器就错的时延、子网掩码和 CRC 余数。这份《计算机网络计算题》文档,从电路交换与分组交换的时延比较,一路做到距离向量算法下路由表的逐条更新,基本把谢希仁教材里能出计算题的知识点都按题号收进来了。如果你正在准备计算机网络期末复习、考研 408 或自考,又不想从厚厚的教材里自己抠题,这份题集就是现成的刷题清单。别急着从头看到尾,我建议你按「先做一遍 → 对答案 → 找自己错在哪一章」的顺序用,因为它每道题都给了完整解答过程,连中间步骤都没跳。适合的人很明确:考前需要集中火力把计算题题型过一遍的考生,以及想对照标准解题过程查漏补缺的从业者。
2. 时延与传输效率:把公式抄对,更要学会处理单位
2.1 电路交换与分组交换的时延比较:一个不等式定胜负
第 11-10 题是经典的方案选型题:要传送的报文共 x bit,从源点到终点经过 k 段链路,每段链路传播时延为 d 秒,数据率为 b b/s。电路交换需要额外的电路建立时间 s 秒,分组交换则把报文切成 p bit 的分组。
电路交换的总时延是三段相加:电路建立时间 s、整份报文的发送时间 x/b、以及 k 段链路的传播时延 kd。也就是s + x/b + kd。分组交换没有电路建立时间,但多了存储转发延迟:发送时延是(x/p) * (p/b),也就是分成 x/p 个分组、每个分组花 p/b 秒发送;真正容易漏的是(k-1) * (p/b),这表示第一个分组到达目的节点之前,后面的分组还在中间节点逐跳排队转发的额外时间。
# 用于比较两种交换方式总时延的简单验算脚本 def circuit_total(x, k, d, b, s): """电路交换总时延:建立时间 + 发送时延 + 传播时延""" return s + x / b + k * d def packet_total(x, k, d, b, p): """分组交换总时延:发送时延 + 存储转发时延 + 传播时延""" return (x / p) * (p / b) + (k - 1) * (p / b) + k * d # 参数示例:报文 10000 bit,3 段链路,每段传播时延 0.001s,数据率 1000 b/s # 分组长度 500 bit,电路建立时间 0.05s x, k, d, b, p, s = 10000, 3, 0.001, 1000, 500, 0.05 print("电路交换时延:", circuit_total(x, k, d, b, s)) print("分组交换时延:", packet_total(x, k, d, b, p))代码里的packet_total把(x/p)*(p/b)拆开写,是为了直观看出「分成多少组 × 每组发送时间」。实际做题时建议直接把公式合并为kd + x/b + (k-1)*(p/b)。推导结论是:当s > (k-1)*(p/b)时,分组交换时延更小;当报文很长且分组很短时,电路交换的建立时间成本就显得更突出。这个条件想不明白的话,画一条 k 段链路的草图,数一数中间有几个存储转发节点,答案立刻就出来了。
2.2 发送时延和传播时延:数据长度与速率谁说了算
第 1-17 题给了两组对照数据:距离 1000km,传播速率 2×10⁸ m/s。第一组数据长度 10⁷ bit、发送速率 100 kb/s;第二组数据长度 10³ bit、发送速率 1 Gb/s。计算发送时延就是「数据长度 ÷ 数据率」,传播时延是「距离 ÷ 传播速率」。
第一组发送时延 100 秒,传播时延 0.005 秒,发送时延占了绝对主导;第二组发送时延 1 微秒,传播时延仍是 0.005 秒,这时传播时延成了主要成分。很多初学者在这道题上翻车,原因不是公式不会,而是把 100 kb/s 当成 100 字节每秒,或者把 10⁷ bit 当成 10 MB。记住一句话:凡是做时延计算,统一先把单位换成 bit 和 b/s,最后再决定要不要换算成更高单位。这道题的核心结论很简单:数据长、速率低,发送时延主导;数据短、速率高,传播时延主导。做网络性能分析时,这个判断决定了你要优化链路带宽还是优化传输距离。
2.3 数据传输效率:分层首部开销是怎么吃掉带宽的
第 1-19 题给了个特别直观的例子:100 字节应用层数据,加 20 字节 TCP 首部、20 字节 IP 首部、18 字节以太网首部尾部,总开销 58 字节。传输效率就是 100 除以 158,约 63.3%。同样的数据变成 1000 字节后,效率升到 94.5%。这个计算本身不难,但背后有个考试常问的点:每一层加的首部都是独立叠加的,不是只加一次。TCP 加 20、IP 再在 TCP 报文上加 20、以太网再在最外层加 18,这是「洋葱模型」的字节开销。
另外一个高频易错点:算效率时分子分母都要用同一单位,并且分母要把所有层的首部都加进去。如果题目说应用层数据 1000 字节,结果有人只加了 IP 首部没加 TCP 首部,算出来自然是错的。这类题出现在期末试卷里,通常不是考你除法,而是考你层与层之间的封装关系是否理解。平时做题建议自己列一张表:应用层数据多少、经传输层后多少、经网络层后多少、经链路层后多少,每一步都写清楚,考场上才不会漏项。
3. 物理层计算:香农公式、光波频带与 CDMA 码片的判定思路
3.1 香农公式与信噪比倍数:别把分贝和倍数混一起
第 2-09 题是香农公式 C = W log₂(1+S/N) 的经典考法。信道带宽 3100Hz,当前最大传输速率 35 kb/s,要让速率增加 60%,问 S/N 增大到多少倍。解法是把 C/W 作为指数:SN1 = 2^(35000/3100) - 1,SN2 = 2^(1.6×35000/3100) - 1,两者比值约为 100 倍。这里有个坑,很多人算到这一步就拿着 100 去选答案,没注意题目问的是「信噪比增大到多少倍」,不是「速率增大多少倍」——虽然题面数值恰好暗示了倍数关系,但换个参数就必须老实算指数差。
这道题的后续追问更关键:在刚才基础上把 S/N 再增大 10 倍,最大信息速率只能再增加约 18.5%,而不是 20%。原因是指数函数里 S/N 是以对数形式进入的,基数越大,同等信噪比提升带来的速率增益越小。这个特性也解释了工程上为什么不会无限堆信噪比来提高信道容量——边际收益递减明显。做题时建议把香农公式变形为C1/W = log2(1+S/N),这样所有比较都转化成指数运算,不容易乱。
3.2 光波频带宽度:先统一单位再除
第 2-12 题给的是 1200nm 到 1400nm、1400nm 到 1600nm 两个波长范围,光在光纤中传播速率 2×10⁸ m/s。频带宽度公式是 B = V/L1 - V/L2,也就是用传播速率分别除以两个边界波长再相减。1200nm 范围的带宽约 23.8 THz,1400nm 范围约 17.86 THz。这题单位换算容易看走眼:nm 先转成 m,1nm = 10⁻⁹ m,然后代入 2×10⁸。很多人在这一步把 1200nm 直接写成 1200,算出的数量级差十万八千里。
还有个细节值得注意:题目给的传播速率是 2×10⁸ m/s,这是光纤中的速率,不是真空光速 3×10⁸ m/s。考试换个数考你时,传播速率务必以题目给定值为准。这道题在考研题目里不算难,但它是「物理层计算题」里为数不多需要把物理单位从头捋到尾的题,建议按「波长转米 → 分别求频率 → 相减」三步固定下来。
3.3 CDMA 码片序列识别:内积为 0 就是静默
第 2-16 题给四个站的码片序列 A、B、C、D,以及接收到的混合序列 S,问哪个站发了数据、发的是 0 还是 1。解法是逐个做内积:S·A = 1,说明 A 发了 1;S·B = -1,说明 B 发了 0;S·C = 0,说明 C 静默;S·D = 1,说明 D 发了 1。码分多址的核心是正交码:每个站和自己的码片内积归一化为 1,与其他站内积为 0。
# CDMA 内积判定:1 表示发送 1,-1 表示发送 0,0 表示未发送 import numpy as np S = np.array([-1, 1, -3, 1, -1, -3, 1, 1]) stations = { 'A': np.array([-1, -1, -1, 1, 1, -1, 1, 1]), 'B': np.array([-1, -1, 1, -1, 1, 1, 1, -1]), 'C': np.array([-1, 1, -1, 1, 1, 1, -1, -1]), 'D': np.array([-1, 1, -1, -1, -1, -1, 1, -1]), } for name, code in stations.items(): result = int(np.dot(S, code) / 8) # 除以码片长度做归一化 print(name, result)这里有个易错点:内积算出来要先除以码片长度再做判断,因为码片序列长度为 8,直接累加得到的是 8、-8 或 0,需要归一化到 1、-1、0。不少参考答案直接写除以 8,就是这个原因。这个脚本里np.dot(a, b)是对应位相乘再求和,除以 8 是为了映射到三个离散状态;实际考试手算时,就老老实实把两个八维向量逐位相乘再相加,先不除 8,然后统一判断正负零,更不容易出错。
4. 链路层计算:CRC 余数、PPP 填充与 CSMA/CD 的争用期
4.1 CRC 校验:模 2 除法怎么算,余数怎么补位
第 3-07 题是 CRC 的典型计算:要发送的数据 1101011011,生成多项式 P(X) = X⁴ + X + 1,对应的二进制除数是 10011。计算过程是在原数据后补 4 个 0(因为多项式最高次数是 4),然后做模 2 除法,等价于按位异或,不借位不进位。得到的余数是 1110,这就是要添加的帧检验序列 FCS。考试答案里唯一可能被扣分的是补零个数:最高次是几次,就补几个 0。P(X) = X⁴+X+1 是 4 次多项式,所以补 4 个 0;P(X) = X³+1 就补 3 个 0。
def crc_remainder(data: str, divisor: str) -> str: """模 2 除法求 CRC 余数,data 已包含补零""" data = list(data) n = len(divisor) for i in range(len(data) - n + 1): if data[i] == '1': for j in range(n): data[i+j] = str(int(data[i+j]) ^ int(divisor[j])) return ''.join(data[-(n-1):]) print(crc_remainder('11010110110000', '10011')) # 预期 1110 print(crc_remainder('101110000', '1001')) # 预期 011这个实现的逻辑是:从左往右扫描,遇到当前位为 1 就和除数做异或,扫完剩下的尾部就是余数。data[-(n-1):]取的是最后 n-1 位,因为余数位数比除数少一位。第 3-08 题用除数 1001 对 101110000 做同样操作,余数是 011,注意余数位数不足时要补前导 0 写成三位。两道题做完你会发现,CRC 的「发现错误」能力针对的是突发错误,但这不意味着链路层就可靠了——第 3-07 题最后问得很刁:CRC 能发现错误,数据链路层的传输是否就变成可靠了?答案是否定的,差错检测只能丢弃错帧,可靠传输还需要确认、重传、序号这些机制。把它答成「是」的,基本是对可靠性的理解不到位。
4.2 PPP 填充:字节填充和零比特填充分别怎么还原
第 3-09 题给了一串十六进制的 PPP 帧数据7D 5E FE 27 7D 5D 7D 5D 65 7D 5E,要还原真正的数据。PPP 字节填充的规则是:0x7E 转义成 0x7D 0x5E,0x7D 转义成 0x7D 0x5D。所以还原时看到 7D 5E 就换回 7E,看到 7D 5D 就换回 7D。实际答案是7E FE 27 7D 7D 65 7E。做这类题别急着从头扫到尾,先在草稿纸上把每一对 7D 开头的两字节圈出来,再逐一替换,能避免漏掉中间的 7D 5D。
第 3-10 题是同步传输下的零比特填充:发送端每遇到连续 5 个 1,就自动在后面插入一个 0。发送比特串0110111111111100,中间有连续 10 个 1,前 5 个 1 后插 0 变成 6 个 1 后跟 0,紧接着的 5 个 1 再插一个 0,最后结果要仔细一位一位数。接收端删除规则正好相反:每看到连续 5 个 1 后的那个 0 就删掉。题目里给的接收串0001110111110111110110,删除插入的零比特后要恢复成原数据。我见过不少人在这题上犯错,是因为把「连续 5 个 1 后插 0」理解成了「每 5 个 1 就补一个 0」,实际是只要出现连续 5 个 1 就插入,连续 10 个 1 要插两次。
4.3 CSMA/CD:争用期决定最短帧长,退避时间按争用期数来算
第 3-20 题和 3-22 题是 CSMA/CD 计算的两块硬骨头。第 3-20 题:1km 长的网络,数据率 1 Gb/s,信号传播速率 200000 km/s,单程传播时间 5 微秒,往返 10 微秒。CSMA/CD 要求发送时间至少不小于往返传播时间,否则发送方发完帧还没检测到碰撞,无法确定是否冲突。所以最短帧长 = 1 Gb/s × 10μs = 10000 bit,即 1250 字节。第 3-22 题是退避时间:10 Mb/s 以太网争用期 51.2 微秒,随机数 r = 100,等待 5.12ms;100 Mb/s 以太网争用期 5.12 微秒,等待 512 微秒。
第 3-24 题更刁,问 A 在发送完毕之前能否检测到碰撞。这题的考点有两个:一是最短帧要算上前同步码和帧定界符,即 64 字节数据 + 8 字节前导,总共 72 字节 = 576 比特时间;二是 A 和 B 之间传播时延 225 比特时间,只要 B 在 A 发完之前发帧,A 就能在发完前检测到碰撞。不少答案只算 64 字节,漏了 8 字节前导,得出结论就完全反了。第 3-28 题则是送分题,但考概念:10 个站接集线器,共享 10 Mb/s;接 100 Mb/s 集线器,共享 100 Mb/s;接交换机,每个站独享 10 Mb/s。集线器是物理层设备,所有端口在一个冲突域;交换机隔离冲突域,每端口独立带宽。这个区分在期末选择题里反复出现。
5. 网络层计算:从 IP 分类、分片到子网划分的完整链路
5.1 IP 地址分类与分片计算:片偏移按 8 字节计,不是按字节计
第 4-10 题考 IP 地址类别判断。第一字节 1~126 是 A 类,128~191 是 B 类,192~223 是 C 类。文档里给的那六组地址,21.12.240.17 和 89.3.0.1 是 A 类,128.36.199.3 和 183.194.76.253 是 B 类,192.12.69.248 和 200.3.6.2 是 C 类。这类题基本没什么计算量,关键是边界:127 开头的环回地址不算 A 类常规地址,224 以上是 D/E 类,做题时遇到 192 开头别惯性往 B 类写。
分片计算是网络层计算题的常客。一个 3200bit 的 TCP 报文,加 160bit IP 首部,要去一个 MTU 数据部分只有 1200bit 的局域网。这里有个隐蔽的坑:IP 分片的片偏移字段是以 8 字节(64bit)为单位的。虽然数据部分最多 1200-160=1040bit,但拆片时每个数据片必须按 64bit 对齐,所以实际每片数据部分最大只能到 1024bit。3200bit 报文要分 4 片,第二个局域网向上层传送的总比特数是 3200 + 4×160 = 3840bit。第 4-22 题是 4000 字节报文、MTU 1500 字节、固定首部 20 字节,分成三片:1480、1480、1020 字节,片偏移分别是 0、185、370。185 这个数来自 1480÷8,很多人想不通为什么不是按字节直接写 1480,因为片偏移字段本身只有 13bit,最大只能表示 8191 个 8 字节单元,所以 IP 协议强制用 8 字节为单位。
5.2 子网划分的逆推:知道主机数,怎么挑掩码
第 4-21 题是实际的网络规划题:一个 B 类地址 129.250.0.0,4000 台机器分布在 16 个地点,平均每个地点 250 台。如果用 255.255.255.0 这个 /24 掩码,每个子网可用主机数是 2⁸-2 = 254,够 250 台;子网数 2⁸-2 = 254,也远大于 16。于是每个地点分一个子网号,从 129.250.1.0 到 129.250.16.0,主机范围都是 x.x.x.1~x.x.x.254。这题要理解的关键是「-2」:全 0 是网络地址,全 1 是广播地址,都不能分配给主机。B 类地址原本的默认掩码是 255.255.0.0,划成 255.255.255.0 相当于从主机位借了 8 位做子网位。做题时首先确认 2ⁿ-2 ≥ 需求数,再去选掩码,就不会出现选了 /24 结果主机数不够的尴尬。
第 4-29 题的地址块分配比上面更接近真实网络规划:自治系统分到 30.138.118/23,下面挂 5 个局域网,LAN2 到 LAN5 主机数分别是 91、150、3、15,LAN1 至少需要 3 个地址给路由器用。分配原则是「先分大的,再分小的」:150 台最少需要一个 /24;91 台用一个 /25(126 可用)足够;15 台用 /27(30 可用)比 /26 更省;3 台用 /29(6 可用)。文档给了两组答案,区别就在 LAN1 的地址块是从哪段切出来的。这题不用死记答案,只要按主机数排序、从小到大分配前缀,并且保证各子网不重叠,就算对。另外注意 /23 表示网络位 23 位,整个块总共只有 512 个地址,所有子网加起来的可用地址不能超这个数。
5.3 CIDR 聚合与前缀匹配:看二进制,别瞪着十进制看
第 4-26 题是 CIDR 路由聚合:212.56.132.0/24、133.0/24、134.0/24、135.0/24 四个块能不能聚成一个。把第三字节 132~135 写成二进制:132 = 10000100,133 = 10000101,134 = 10000110,135 = 10000111。它们的高 6 位完全一样(100001),加上前两个字节共 22 位相同,所以聚合结果是 212.56.132.0/22。做聚合题的硬性规则是:地址块必须连续且数量是 2 的幂,四个 /24 能聚合的前提是它们正好构成连续的 4 个块。
前缀匹配题则反着来:给你一个前缀,判断哪个地址匹配。第 4-31 题 86.32/12 的前 12 位是01010110 0010,四个候选地址第二字节前 4 位分别是 0010、0100、0011、0100,只有第一个 86.33.x.x 匹配。第 4-33 题更综合:152.7.77.159 和 152.31.47.252 都匹配的前缀是 152.0/11。152 的二进制前 8 位是 10011000,152.7 第二字节是 00000111,152.31 第二字节是 00011111,前 3 位都是 000,所以一共 11 位相同。这类题的做题顺序我建议固定:先把前缀写成二进制,再逐位比较候选地址,不要试图在十进制里找规律。
6. 避坑自查:四个高频丢分点与一道路由更新题的验算习惯
先说四个我在批改和自测里反复见到的丢分点。第一条,单位换算:发送时延用 bit 除以 b/s 得到秒,有人把 100 kb/s 当成 100 字节每秒,错。第二条,bit 和字节混用:以太网最短帧 10000 bit 写成 10000 字节,错;PPP 帧长度算出来是字节就写字节,是 bit 就写 bit,别混。第三条,片偏移单位:分片偏移量除以 8 才是字段值,直接写原始字节数,错。第四条,CDMA 内积忘了除以码片长度:算出来 8 就说发送 8,错。每条都是「现象 → 原因 → 解决」的结构:看到答案数量级不对,回去查单位;看到分片偏移超过 8191,回去看是不是忘了除以 8;看到 CDMA 结果落在 ±8,回去补一步归一化。
路由表更新题是文档最后第 40、41 题的题型,也是距离向量算法最常考的验算场景。接到邻居 C 发来的路由信息,先对每个「距离」加 1(因为从 C 到目的网络还要经过本路由器一跳),然后逐条和现有表项比:目的网络不在表中,添加;在表中但下一跳就是 C,无论距离变大变小都更新;下一跳不同,只在新距离更短时更新;距离相同或更长,保持原表项不动。我自己的验算习惯是拿尺子挡住答案,逐条写「加 1 → 比较 → 写动作」,做完再放开答案比对,十次有九次能提前抓住漏项。这份文档我刷了两轮,最大的教训是:计算题丢分往往不是不会公式,而是没把单位换算和边界条件当回事。从那以后我每道题做完都强制自己检查一遍「单位是不是 bit、补零个数是不是等于最高次、片偏移是不是除以 8」,这套习惯帮我期末多拿了十几分。希望帮到你。
本文还有配套的精品资源,点击获取