期末复习计网的日子,对计科的同学来说总有点魔幻:明明是一门讲协议的课,背起来却像文科;可一到考试,满卷子都是计算题。我当年就是吃了这个亏——概念背得滚瓜烂熟,翻开“计科-计网8-计算题”这个整理文件夹,才发现CRC、香农公式、RSA这些计算题几乎没法下手。于是花了两个晚上把所有高频计算题重新过了一遍,整理出一套“看到题干就知道该套哪个公式”的做题思路,这才把分数稳住。这篇就把我的整理方法和手算过程完整写出来,适合正在学计网、准备期末或者考研复习的计科同学,尤其适合那种“公式背了但不会用”的人。
如果你非要把标题里的“计网8”对应到教材章节,大部分教材的第8章是网络安全,确实有一道镇场大题RSA;但实际考试的计算题往往从第2章物理量一路算到第8章,所以我按整个课程来整理,把所有必须会手算的题型串成一张地图。
1. 为什么“背会知识点”不等于“会做计算题”——先看计网计算题分布地图
1.1 全课程计算题分布地图
计算机网络这门课的计算题有一个很明显的规律:越偏底层的章节,计算越多;越偏应用层,越偏向流程描述。我复习时会把见过的历年真题按题型归类,大致是下面这张分布表。
| 章节/主题 | 典型计算题 | 常见考法 |
|---|---|---|
| 物理层 | 奈氏准则、香农公式、码元速率与数据速率 | 给带宽、信噪比、电平数,求极限速率 |
| 数据链路层 | CRC循环冗余校验、CSMA/CD最小帧长、滑动窗口利用率 | 手算余数、判断差错、求最大帧长 |
| 网络层 | 子网划分、CIDR聚合、最长前缀匹配、路由表更新 | 给地址块求子网范围、聚合后前缀 |
| 传输层 | 滑动窗口序号位数、信道利用率、TCP拥塞控制cwnd变化 | 给窗口大小求序号位数、画cwnd变化 |
| 网络安全 | RSA加解密与签名、报文摘要、分组密码参数 | 生成密钥、加密解密、签名验证 |
1.2 按性价比分配复习精力
我刷了几套真题之后发现,CRC、子网划分、滑动窗口这三类几乎是必考项,而且套路固定、步骤明确,属于“练熟就白给分”的题型。物理层的奈氏和香农更是送分题,难点只在于判断用哪个公式。RSA在一些学校作为压轴大题,虽然计算繁琐,但流程非常固定。反倒是TCP拥塞控制这种画图表题,有时候反而容易因为细节丢分。我的策略是先拿稳前三个高频题型,再攻RSA,最后才去啃拥塞控制那些边角料。
这背后的逻辑其实很简单:计网计算题不是在考数学,而是在考“你把协议的边界条件搞清楚没有”。理解了每个公式对应的协议机制,公式自然就记得住;死记硬背反而最容易在单位换算、边界条件上翻车。
2. 链路层最容易拿分也最怕手滑:CRC循环冗余校验完整手算流程
2.1 为什么不直接求和而要“模2除法”
CRC即循环冗余校验,数据链路层用来检测帧是否在传输中被破坏。很多人第一次看到模2除法觉得奇怪:为什么加减法都变成异或?其实很简单,CRC的数学基础是多项式除法,而模2运算天然适合硬件异或门实现,不需要考虑进位和借位。你可以把它理解为“只判断相同还是不同”:1异或1得0,0异或0得0,1异或0得1。
另一个容易混淆的点是:CRC是用“发送数据+校验位”这个整体去除一个双方约定的生成多项式,余数为0就认为没出错。这个“校验位”就是之前信息位后面补的0经过除法得到的余数,补在信息位后面一起发出去。
2.2 完整手算示例
先看一个非常典型的考试题目:待发送的数据位串 M = 1010001101,生成多项式 G(x) = x^5 + x^4 + x^2 + 1,求CRC校验位和最终发送帧。
第一步,确定校验位位数。G(x)的最高次数是5,所以校验位位数 r = 5。然后把 M 后面补5个0,得到 101000110100000。
第二步,把生成多项式的系数写出来:G(x) 对应比特串 110101,注意 x^5、x^4、x^2、x^0 的系数是1,其他是0。
第三步,做模2除法。直接用长除法的过程展示前几步:
101000110100000 ÷ 110101 被除数前6位:101000 101000 ⊕ 110101 = 011101 → 取后5位11101,拉下一位1,得111011 111011 ⊕ 110101 = 001110 → 取后5位01110,拉下一位1,得011101 011101 最高位是0,商0 → 取后5位11101,拉下一位0,得111010 111010 ⊕ 110101 = 001111 → 取后5位01111,拉下一位1,得011111 ...整个过程你不需要关心商是多少,只用把最后一次异或的结果截取 r=5 位就可以了。我完整算下来,最终余数是 01110。
第四步,把余数拼到原数据后面,发送帧就是:
1010001101 01110也就是 101000110101110。
接收端收到这个比特串后,用同一个生成多项式 110101 去除,如果余数为0,则认为帧无差错;如果余数不为0,说明有比特位在传输过程中出错,需要重传。
2.3 手算最容易翻车的三个点
我当年在这个知识点上丢过好几次分,总结下来是这三个地方:
- 余数位数不够 r 位时,必须在前面补0。比如你最后算出来余数是111,但 r=5,那就要写成00111,不能直接写111。你补到信息位后面的时候,缺一个0都是错的。
- 生成多项式的系数要写对。最高位和最低位必须是1,考试如果给的是十六进制写法,比如0x05,你要能先转化成二进制再算。
- 不要被“除法”这个说法带偏。商在计算中没用,只留余数。很多同学在考场上一味想凑商,结果把自己绕晕了。
另外提醒一句:CRC只能检错,不能定位哪个比特出错,更没有纠错能力。考题经常在选择题里把“可以纠错”作为一个干扰项,这是最典型的坑。
3. 不是只有“255.255.255.0”:子网划分与CIDR聚合的快速心算技巧
3.1 子网划分的核心:块大小
子网划分在计网计算题里几乎必考,但也是很多人的心理阴影。其实你不用死记掩码表,抓住一个核心概念就够了:块大小 = 2^(32 - 掩码长度)。这里的块大小表示这个子网包含多少个IP地址,包括网络地址和广播地址。
举个例子:把 192.168.4.0/24 分成4个等长子网。原本掩码是 /24,要分成4个子网,需要向主机位借2位,掩码变成 /26。这时块大小 = 2^(32-26) = 64,也就是每个子网有64个地址。四个子网分别是:
| 子网号 | 广播地址 | 可用主机范围 | 可用主机数 |
|---|---|---|---|
| 192.168.4.0 | 192.168.4.63 | 192.168.4.1 ~ .62 | 62 |
| 192.168.4.64 | 192.168.4.127 | 192.168.4.65 ~ .126 | 62 |
| 192.168.4.128 | 192.168.4.191 | 192.168.4.129 ~ .190 | 62 |
| 192.168.4.192 | 192.168.4.255 | 192.168.4.193 ~ .254 | 62 |
注意每个子网都要减掉网络地址和广播地址,所以可用主机数 = 块大小 - 2。很多同学算完块大小直接说“可用64个”,这是最经典的丢分位置。另外,给你任意一个IP,判断它属于哪个子网时,用IP地址与掩码按位相与就能得到网络地址;也可以直接看它落在哪个块区间里,这对快速解题更快。
3.2 CIDR聚合的“对齐”陷阱
CIDR聚合和子网划分是一体两面:子网划分是把大块拆小块,聚合是把小块合成大块。但聚合有一个隐藏条件:每一级的块边界必须对齐。不是任意两个相邻网段都能直接合并。
举个例子,192.168.24.0/24 和 192.168.25.0/24 可以聚合吗?把第三字节换成二进制:24 = 00011000,25 = 00011001。可以看到前7位完全一样,只有最后一位不同,所以这两个/24可以聚合成一个 /23,网络地址是 192.168.24.0/23,掩码是 255.255.254.0。可用地址范围是 192.168.24.1 到 192.168.25.254,总共510个。
但如果问你 192.168.25.0/24 和 192.168.26.0/24 能不能聚合成 /23?答案是“不能”。因为25 = 00011001,26 = 00011010,它们在第三字节的前7位就不一样了,强行合并成 /23 会导致前缀不能形成一个连续且对齐的地址块。这种情况下只能找更大的前缀块,比如 /22,从 192.168.24.0/22 开始才能把这两个网段同时覆盖进去。
我自己的快速判断方法是:/23 块的起始第三字节必须是偶数,/22 块的起始第三字节必须是4的倍数,/21 必须是8的倍数。这个规律在考场上非常救命,不用每次都掰二进制。
3.3 最长前缀匹配的做题套路
路由表计算题里最长前缀匹配也是常见考点。原则只有一条:多个路由表项都匹配时,选择掩码最长也就是前缀最长的那个。比如目的地址 202.113.16.150,路由表里同时有 202.113.16.0/24 和 202.113.16.128/27,后者更具体,所以走后者。
做题时先按掩码长度排序,再从最长的开始逐个判断:把目的地址和掩码相与,看落不落在对应网络地址范围内。这里特别提醒:不要上来就算二进制,先看IP的前几段,很多题目用排除法几秒钟就能出答案。
4. 滑动窗口那点事:GBN、SR和停止等待协议的窗口与序号计算
4.1 三种可靠传输协议的窗口限制
滑动窗口是传输层和链路层都爱考的计算点,核心是序列号位数的计算。背景是:发送方和接收方靠序号来区分新旧数据,如果序号不够用,就会产生歧义,所以不同协议对窗口大小有硬性限制。
- 停止等待协议:发送窗口=1,接收窗口=1,相当于最原始的“发一个等一个”。
- GBN(后退N帧):发送窗口 ≤ 2^n - 1,n是序号位数。
- SR(选择重传):发送窗口 + 接收窗口 ≤ 2^n,通常会取两边相等。
为什么GBN不是2^n而是2^n - 1?最常见的解释是:如果发送窗口等于整个序号空间,接收方发回的ACK全部丢失时,发送方超时重传的帧会让接收方无法区分“这是新帧还是重复帧”。必须空出一个序号作为边界标记来消除歧义。SR协议因为有接收窗口缓存乱序帧,所以可以让发送窗口和接收窗口加起来正好占满序号空间。
4.2 信道利用率:先算发送周期
信道利用率这道题,几乎所有学校都爱考。先记住公式框架:利用率 = 发送时间 / 发送周期。这里发送周期 = 发送时间 + 传播时间 + 确认帧的传播时间。如果题目说忽略确认帧发送时间和处理时间,那就简化成:
发送周期 = T帧 + 2 × 单向传播时延 信道利用率 = T帧 / (T帧 + 2τ)举个例子:链路数据速率 1Gbps,数据帧长 1000 字节,单向传播时延 5μs,忽略确认帧长度。那么:
- 帧长 = 1000字节 = 8000 bit
- T帧 = 8000 / 1Gbps = 8μs
- 发送周期 = 8 + 2×5 = 18μs
- 停止等待时利用率 = 8 / 18 ≈ 44.4%
如果改用发送窗口为4的GBN协议,理论利用率变成 4×8 / 18,这是一个超过1的数字。超过1说明链路已经饱和,实际最大利用率就是100%。这时候瓶颈不再是等待确认,而是发送方自身的发送速率和链路带宽。这个“超过1取100%”的细节,考场上很多同学会愣一下。
4.3 带宽时延积和序号位数
理解信道利用率之后,带宽时延积就顺理成章了。带宽时延积 = 数据速率 × 往返时间,表示“在一条链路上同时可以承载的数据量”。还是上面的例子:R×2τ = 1Gbps × 10μs = 10000bit = 1250字节。意思是即使没有任何确认机制,链路上同时传输的数据也只有1250字节。而你一个帧就有1000字节,所以停止等待协议每发一帧就有接近一半时间在空等。
序号位数题目通常是反向考法。比如:GBN协议的发送窗口大小为32,问最小需要几位序号?答案是 2^n - 1 ≥ 32,所以 n≥6。如果你直接写5,那就踩坑了,因为2^5=32,但GBN窗口最多只能到31。如果换成SR协议,发送窗口=接收窗口=32,则需要 32+32 ≤ 2^n,n≥6;如果窗口都到64,就需要n≥7。
我把这部分跟 BW(带宽时延积)联系起来复习之后,才真正理解为什么高速长距离链路上要用大窗口:窗口的本质就是“允许在RTT时间内发多少数据才能填满管道”。
5. 香农公式、奈氏准则与CSMA/CD最小帧长:两个公式一个边界
5.1 无噪声用奈氏,有噪声用香农
物理层的极限速率计算题,本质就是两个公式的取舍问题:
- 奈氏准则:C = 2W·log₂V,适用无噪声环境。W是带宽,V是信号电平数。
- 香农公式:C = W·log₂(1 + S/N),适用有噪声环境。S/N是信噪比。
判断依据很简单:题目同时给了信噪比,就用香农;题目只给带宽和电平数,就用奈氏。如果两个条件都给,通常要算两个值再取较小者,因为真实系统的速率要同时受两个因素限制。
5.2 分贝与倍数的换算坑
香农公式最大的坑不在公式本身,而在单位。题目说“信噪比为30dB”,很多同学直接把30代入公式,那会大错特错。正确的换算是:
S/N = 10^(30/10) = 1000也就是说,30dB对应的是信号功率是噪声功率的1000倍。只有题目直接写“信噪比为1000”这种无量纲比值时,才能直接代入。如果带宽为4000Hz,那么:
C = 4000 × log₂(1 + 1000) ≈ 4000 × 9.966 ≈ 39864 bps奈氏那边的典型题是:带宽3kHz,使用4电平传输,最大数据速率 C = 2×3000×log₂4 = 12000bps。这种题属于送分题,但经常有人把2倍关系忘掉,直接写成 3000×2 = 6000,反而错了。
5.3 CSMA/CD的最小帧长怎么来的
CSMA/CD的碰撞检测机制要求:发送方在发送完一帧之前,必须能检测到最远端的碰撞。因此最小帧长 = 数据速率 × 最远往返传播时延。公式就是:
Lmin = 2τ × R其中τ是单程传播时延,2τ就是往返时间,R是数据速率。道理很生活化:你说话还没说完的时候,就要听到别人反驳的声音,才知道吵架了;如果话说完了才听到,那就晚了,只能重新开始。
看一道经典题:总线长度1km,信号传播速率200m/μs,数据速率10Mbps,求最小帧长。单程时延 = 1000 / 200 = 5μs,往返10μs,最小帧长 = 10Mbps × 10μs = 100bit。这个结果只有12.5字节。而标准以太网为什么定64字节(512bit)?因为覆盖的碰撞域更大,同时留出了余量,保证快速发送时也能可靠检测碰撞。如果题目反着问“已知帧长64字节,求最大碰撞域距离”,还是一样公式:先算2τ = 512bit / 10Mbps = 51.2μs,再根据信号传播速率求距离。这个知识点很容易和CRC一起出现在第二道大题里,两类都是必须拿分的题。
6. RSA从密钥生成到加解密签名:网络安全章节的“镇场大题”
6.1 密钥生成五步走
到了网络安全这一章,计算题的核心基本就是RSA。考试不会让你处理上千比特的大素数,通常给两个小素数,考察完整流程。以最常见的教学参数 p=11、q=13 为例。
密钥生成分五步:
- 计算 n = p×q = 11×13 = 143。
- 计算欧拉函数 φ(n) = (p-1)×(q-1) = 10×12 = 120。
- 选一个公钥指数 e,要求 1 < e < φ(n),且 gcd(e, φ(n)) = 1。考试通常直接给你 e=7。
- 求私钥 d,满足 d×e ≡ 1 (mod φ(n)),也就是 7d mod 120 = 1。
- 找满足条件的d:试算到 d=103,因为 7×103 = 721,721 mod 120 = 1。
这里要注意,公钥是 (e, n) = (7, 143),私钥是 (d, n) = (103, 143)。公钥不保密,私钥绝对不能公开。考试经常在填空或选择题里考“哪一组是公钥、哪一组是私钥”,不要写反。
6.2 加密解密手算过程:别硬算大数
加密时使用公钥。假设明文 M=2,密文 C = M^e mod n = 2^7 mod 143 = 128。这里2的7次方还不算大,但解密就吓人了:M = 128^103 mod 143。如果你直接在考场上硬乘,计算器都可能溢出。正确做法是“平方-乘”法,把指数拆成二进制幂次,边算边取模。
我知道处理大数幂取模是很多人的障碍,下面把整个过程写清楚。先把 103 拆成 64+32+4+2+1,然后从128开始逐次平方取模:
128^1 mod 143 = 128 128^2 mod 143 = 82 128^4 mod 143 = 3 128^8 mod 143 = 9 128^16 mod 143 = 81 128^32 mod 143 = 126 128^64 mod 143 = 3所以:
128^103 mod 143 = 128^64 × 128^32 × 128^4 × 128^2 × 128^1 mod 143 = 3 × 126 × 3 × 82 × 128 mod 143逐步计算:
3 × 126 = 378 mod 143 = 92 92 × 3 = 276 mod 143 = 133 133 × 82 = 10906 mod 143 = 38 38 × 128 = 4864 mod 143 = 2最终得到 2,正好等于原来的明文。这一套流程练熟之后,RSA计算题其实就是“反复平方、取模、乘起来、再取模”,机械性很强,但绝对值得多写几遍。
6.3 数字签名与加密的区别:私钥公钥别反着用
RSA还有一个高频概念题:数字签名。它的本质是用私钥签名,用公钥验证;而加密是公钥加密、私钥解密。两者正好相反。签名的作用是身份认证和防抵赖:因为私钥只有发送方自己知道,所以能用私钥生成合法签名的,就证明这条消息来自发送方。而加密的作用是机密性:只有持有私钥的接收方才能解开密文。
有的题目会问:发送方想同时保证机密性和完整性,应该怎么做?标准回答是“先用自己的私钥签名,再用接收方的公钥加密”。顺序不能反过来,因为先加密再签名的话,签名本身不包含接收方身份信息,在某些场景下可能被利用。这一点不一定让你计算,但经常出现在选择填空里,顺便一起整理了。
7. 最后冲刺阶段怎么刷计算题:按题型横向刷,不按章节刷
考前最后两三天,我建议不要再看整本教材的知识点了,也别顺着章节顺序从前往后复习。我自己的方法是把所有历年真题里的计算题全部扣出来,然后按题型横向刷:一晚上只做CRC,把所有题做熟;第二天只做子网划分和CIDR;第三天集中练滑动窗口。这样做的原因是计算题考的是套路熟练度,你在短时间反复做同一类题,很容易形成肌肉记忆,考试看到题干关键词就能自动反应出公式。
按性价比我给一个刷题优先级:
- 必拿:CRC、子网划分、奈氏/香农、CSMA/CD最小帧长。这四类只要练两遍就不该再扣分。
- 多练:滑动窗口利用率和序号位数、RSA密钥与加解密。这些稍微复杂,但是步骤固定,练熟之后正确率可以很高。
- 有空再看:TCP拥塞控制的cwnd变化图、IP分片偏移量、UDP/TCP校验和计算。这类题出现频率相对低,而且容易耗时间。
考场上的检查清单也分享一下。CRC手算一定要把余数位补齐再拼到帧尾;子网划分算可用主机数一定要减2;信噪比给的是dB就必须先转倍数再代入香农;RSA算大数幂一定用平方-乘,不要硬乘;看到“最大”“最小”这种词先圈出来,再决定是套奈氏还是香农。
我个人的体会是:计网计算题真的不难,难就难在把一堆公式对应到正确的题型上。把整理好的题型模板过一遍,比单纯重看教材概念管用得多。最后一个小技巧:考前把所有公式做成一张便签,左边写公式,右边写适用场景,贴在电脑边;每做一道题之前先判断场景再动笔。这个方法帮我从“背了不会用”变成“看到题干就知道算哪里”,希望你也能用上。