计算机网络大题拿分攻略:CRC、CSMA/CD、IP分片与TCP拥塞控制套路全解析
离期末还有三天同学问我计算机网络后面那些大题怎么拿分我说你先别问怎么拿分你先告诉我你丢分丢在哪。十个人里八个丢在同一个地方不是不会算是不知道每道题背后都有固定套路。CRC、CSMA/CD、子网划分、路由表更新、IP分片、TCP拥塞控制……这些题型翻来覆去就那几种套路吃透剩下全是计算和细心问题。这篇总结主要服务两类人一类是期末考前突击的本科生一类是准备考研408或保研面试、正在刷王道和谢希仁教材的人。我按数据链路层、网络层、传输层、应用层的顺序把最常考的大题逐个拆开给出可以直接照做的解题步骤以及我在实际做题和讲题中总结出来的易错点。文章不贪多只讲“能上考场的干货”。1. 一张图看清计算机网络大题考什么1.1 期末和考研的命题差异计算机网络这门课的特点是“广而不深”但大题偏偏喜欢盯住几个点反复出。期末试卷和考研408的命题侧重点不太一样期末更看重“给你一个场景你能算出正确数字”比如CRC校验码、最小帧长、子网掩码、TCP轮次变化考研408则更偏爱“多协议联动”的综合题比如以太网帧 IP分片 TCP端口凑在一起让你判断整个过程。所以复习前先做一件事找到你们学院近三年的期末真题横向对比一次。如果发现某类题连续出现两三次那基本就是老师的“题库锚点”优先搞清楚它。不要按教材目录从第一章开始平推时间不允许效率也太低。1.2 高频大题题型速查表我这些年给学生做考前辅导把计算机网络里最常出现的计算型大题整理成了一张表。刷题时看到类似题型直接对上号就行。章节高频大题常见考法必背公式/规则物理层信道容量计算给带宽、信噪比、电平数求最大速率香农公式、奈奎斯特公式数据链路层CRC校验给数据和生成多项式求FCS模2除法数据链路层CSMA/CD最小帧长给距离、速率、传播速度求帧长冲突检测窗口数据链路层网桥转发表给端口序列判断转发/丢弃/泛洪自学习算法网络层IP分片给数据报长度和MTU求片偏移、MF8字节对齐网络层子网划分 / CIDR聚合给主机数求掩码给多个前缀求聚合借位规则网络层路由表更新距离向量RIP收到邻居表后更新Bellman-Ford规则网络层链路状态算法给图求最短路径Dijkstra填表传输层TCP三次握手/四次挥手求序号、确认号、状态变化SYN/FIN/ACK机制传输层拥塞控制给轮次画cwnd曲线或填表慢开始/拥塞避免/快恢复应用层DNS解析流程递归与迭代过程描述域名层次结构应用层HTTP传输时间结合RTT求响应时间非持久/持久连接1.3 复习顺序与资料搭配建议我的建议顺序是先攻数据链路层和网络层因为这两章题型固定、计算套路强拿分最快然后看传输层TCP拥塞控制这是大题“必争之地”最后再补应用层和物理层的小计算。这个顺序也符合记忆曲线前面算熟了后面理解起来不费劲。资料方面谢希仁《计算机网络》和王道考研辅导书都适合作为主参考湖科大教书匠的系列视频适合用来理解协议动机。如果你时间紧张至少要把每章课后与计算相关的题刷两遍再配合往年真题练手感。2. 数据链路层大题CRC、CSMA/CD、网桥转发表怎么拿满分2.1 CRC循环冗余校验的完整计算流程CRC是数据链路层最经典的“送分题”但每次总有人在“除数对齐”和“余数位数”上翻车。先记住题目里的约定发送数据通常是二进制序列生成多项式会写成G(x)x^4x1这种形式对应二进制除数10011r4表示后面要补4个0。举个例子。假设要发送的数据D1101011011生成多项式G10011求CRC校验码和最终发送帧。第一步在数据后补r4个0得到11010110110000。第二步用这个加零后的序列对10011做模2除法所谓模2除法就是不进位的异或运算。第三步除到最后得到的4位余数就是校验码FCS。我直接给结果余数R1011。所以最终发送的数据帧是11010110111011也就是11010110111011。考试时这道题最常见的丢分点有两个一是模2除法过程中中间每一步如果最高位是0要一口气补位到最高位为1或不足除数位数才能停下很多人在这一步少写一位二是最终余数的位数必须等于生成多项式的最高次数r不是看你的心情少补前导0都算错。我后来总结了一个省事办法先在草稿纸上把异或对齐写成竖式再用“上商0/1”的方式逐步推进清晰度会高很多。2.2 最小帧长与冲突检测的计算逻辑CSMA/CD的最小帧长计算本质上是在问发送方在把帧发完之前能不能听到自己发出的信号和别人撞了。如果帧太短发送方早就发完了就算发生了冲突也发现不了这时候协议就失效了。所以最小帧长必须保证“发送完最后一比特前至少能等到一个冲突信号回来”。公式就一个最小帧长(bit) 争用期 × 数据传输速率 争用期 2 × 最大传播时延 2 × (最大距离 / 信号传播速度)很多教材里传播速度默认取2×10^8 m/s如果题目不特殊说明就用这个值。例如两端相距2km数据速率为100Mbps那么RTT 2×2000/(2×10^8)2×10^-5s20μs最小帧长 20μs × 100Mbps 2000bit。也就是说帧长必须大于等于2000bit否则检测不到冲突。考试常设陷阱是把“单向传播时延”当成“往返时延”记住冲突检测用的是2倍别只乘一次。2.3 网桥转发表的“学习—寻址—转发”三步法网桥转发表的题几乎是数据链路层的必考简答。题目通常会给你一个网络拓扑然后依次给出一系列帧的发送情况问网桥从哪个端口转发、是否丢弃。解题只用记住三步第一学习。收到帧之后把“源MAC地址 收到该帧的端口”写入转发表这就是自学习过程。第二查表。看目的MAC地址是否已经在转发表中。第三决定动作。如果目的MAC未知则从除接收端口外的所有端口泛洪如果目的MAC已知且对应端口等于接收端口直接丢弃如果对应端口不等于接收端口仅从该端口转发。关键坑点在于时间顺序。转发表是按时间累积的前面帧学到的地址后面会用上。所以做题一定要一帧一帧往后推边推边更新表不要上来就凭直觉判断。还有一个细节如果题目里同一MAC地址在不同端口出现多次以最近一次接收到的帧为准因为网桥认为最新信息更能反映真实位置。3. 网络层大题IP分片、子网划分、路由算法3.1 IP分片计算偏移和MF位别搞反IP分片题在期末和考研里都是高频计算。题目会给一个IP数据报总长度、IP首部长度和MTU要求计算分片的各字段。记清楚一个原则除最后一个分片外每个分片的“数据部分长度”必须是8字节的整数倍因为片偏移字段的单位是8字节。例题IP数据报总长度3800字节其中IP首部20字节MTU1400字节。先算数据部分3800-203780字节。每个分片最多携带的数据长度是1400-201380字节但1380不是8的倍数1380除以8等于172余4所以要向下取整到172×81376字节。于是分片1携带1376字节数据分片2也携带1376字节剩下3780-27521028字节给分片3。三个分片的IP首部总长度分别是1396、1396、1048。片偏移分别是0、172、344注意偏移单位是“8字节组”不是字节也不是分片序号。MF标志位分片1和分片2都是1表示后面还有分片分片3是0。如果题目还要求DF标志那在分片时DF一定为0。这么写基本能拿全分。3.2 根据主机数倒推子网掩码子网划分题有很多种出法最常见的是“某个网络需要划分若干子网每个子网必须满足N台主机求子网掩码”。别一上来就背/24 /25 /26先理解主机位数量决定可用IP数。可用主机数 2^k - 2其中k是主机位位数减二是去掉网络地址和广播地址。设每个子网需要30台主机那么2^k - 2 ≥ 30最小k5因为2^5-230刚好够。如果原网络是202.13.12.0/24主机位原本8位现在要拿出8-53位作为子网位所以掩码变为/27子网掩码是255.255.255.224能产生2^38个子网满足“5个子网”的业务需求。每个子网的地址范围用“块大小”来推。对于/27块大小是32所以子网依次是.0/27、.32/27、.64/27、.96/27……考试时一定把广播地址也标出来比如/27子网的广播是.31下一个子网从.32开始。这种题容易被人忽略的是“每个子网最多容纳的主机数”是否满足题目要求很多人光算了子网数就交卷结果主机位不够整道题全错。3.3 CIDR路由聚合的公共前缀技巧路由聚合本质是找多个IP前缀的“最长公共前缀”。把需要聚合的网络地址都写成二进制然后从高位开始逐位比较直到某一位出现不同公共部分就是聚合后的网络号。比如要聚合192.168.1.0/26、192.168.1.64/26、192.168.1.128/26、192.168.1.192/26。这四个地址的第三个一样最后一个字节分别是00000000、01000000、10000000、11000000公共前缀是前两位00。加上前三个字节的24位公共前缀共26位不对这里要小心这四个子网的最后一个字节公共前缀是前2位所以聚合前缀是192.168.1.0/26让我换一个更清晰的例子。如果给的是192.168.1.0/26、192.168.1.64/26它们的最后一个字节二进制分别是00000000和01000000公共前缀是01不对00和01的公共前缀只有第一位0所以聚合为192.168.1.0/25能覆盖0~127恰好包含两个/26子网。如果四个/26都给出公共前缀是前两位不对00000000、01000000、10000000、11000000这四者的公共前缀是0位但若只聚合前两个就是/25后两个聚合也是/25再往上聚合只能到192.168.0.0/23因为它把0~255都覆盖。考试常给能完美聚合的题目只要你会数“公共位数”就不会错。做这类题建议把二进制写全不要只写十六进制。数公共位时从最左边开始数一旦某一位不一致聚合前缀就到上一位为止。3.4 距离向量RIP算法收到邻居表后怎么更新距离向量算法的题目给一张路由表再给邻居发来的路由表问更新后的路由表。核心规则是如果某条路由的下一跳就是这个邻居那么无论邻居报的距离变大还是变小都必须采用新值如果下一跳不是这个邻居只有在新路径更短时才更新如果距离相同且原路由不是该邻居通常保持原表不变。我举一个经典例子。假设B的当前路由表中有一条NET2距离2下一跳C。现在C发来自己的路由表其中NET2距离3。B收到后将C的所有距离加1得到NET2距离4。由于这条路由的下一跳正是C虽然距离变大也必须更新为4。这正是RIP“好消息传得快坏消息传得慢”的体现也是防环机制要处理的问题。反过来如果B有一项NET1距离4下一跳AC报来的NET1经加1后为5因为下一跳不是A这里要明确只要下一跳不同且新距离不小于原距离就不更新。考试时最好把“加1之后的结果”和“对比后是更新/不更新/新增”都写在答题区让阅卷老师看到你的判断过程。3.5 Dijkstra算法的填表式解法链路状态算法最喜欢考Dijkstra。题目给一张无向图要求从某个源点出发求到各节点的最短路径。我的建议是不要画一堆乱七八糟的箭头直接用“表格法”一步一步填。例如这样一个网络源点u节点为u、v、w、x、y、z。边权如下u-v2u-w5u-x1x-y1x-v2v-w3w-y1w-z5y-z2。求u到各节点的最短路径。第一步初始化dist(v)2dist(w)5dist(x)1dist(y)∞dist(z)∞已确定集合{u}。第二步选择距离最小的未确定节点xdist(x)1将x加入集合。第三步检查x的邻居到y的距离 112更新dist(y)2到v的距离 123比原来的2大不更新。第四步选择下一个最小节点vdist(v)2将v加入集合经v到w 235与原来的5持平可以保留原路径也可以选新路径但不再减小。第五步选ydist(y)2加入集合经y到w 213小于原来的5更新dist(w)3经y到z 224更新dist(z)4。第六步选wdist(w)3经w到z 358大于4不更新。最后选z。在答题纸上把“当前已确定节点、各节点当前距离”列成一个表每选一个节点填一行最后在表下写出每个目的节点的最短路径比如u→x→y→z距离4。这样逻辑清晰步骤分也跑不掉。4. 传输层大题TCP连接管理与拥塞控制4.1 三次握手和四次挥手序号确认号必须会推TCP三次握手的大题一般给你客户端的初始序号让你推导整个过程的SEQ和ACK。记住两条铁律SYN报文本身消耗一个序号ACK报文如果不携带数据不消耗序号但确认号依然会加。假设客户端初始序号是1000第一次握手客户端发SYN1, seq1000。服务器收到后回SYN1, ACK1, seq5000, ack1001。这个ack必须等于客户端序号加1因为它是在确认收到客户端的SYN。第三次握手客户端发ACK1, seq1001, ack5001。到了四次挥手时逻辑类似主动关闭方发FIN对方回ACK然后对方也发FIN最后再回ACK。两次FIN各占一个序号所以最后确认号要加2。考试中常见陷阱是问“为什么第三次握手还要发ACK”因为服务器要确认客户端的收到能力同时也让客户端知道服务器已经就绪避免历史连接请求造成的资源浪费。类似“两次握手行不行”的简答题思路就从“防止失效的连接请求突然传送到服务器”展开。4.2 慢开始与拥塞避免画cwnd趋势图TCP拥塞控制是期末大题的高频主角。题目通常给初始拥塞窗口cwnd、慢开始阈值ssthresh然后要求填表或画图描述每个传输轮次后cwnd怎么变化。慢开始阶段每经过一个RTTcwnd翻倍当cwnd达到或超过ssthresh时进入拥塞避免阶段之后每个RTT只加1。比如ssthresh16初始cwnd1则第1轮到第4轮分别是1、2、4、8第5轮达到16然后第6轮17、第7轮18……如果题目问“当cwnd24时发生超时接下来怎么变化”记住写法先更新阈值new_ssthresh 24/2 12然后把cwnd置为1重新进入慢开始。如果发生的是“三次重复确认”而不是超时不同教材的后续处理不同TCP Reno会把cwnd设为新的ssthresh即12并从拥塞避免开始TCP Tahoe以及部分教材会直接让cwnd1重新慢开始。答题前先看你们教材用哪个版本这个差异每年都坑人。4.3 快重传与快恢复不同教材的差异不能踩雷很多人把快重传和快恢复当成一回事其实它们是两套机制。快重传解决的是“如何更快发现丢包”发送方只要连续收到同一个序号的3个重复ACK就立即重传丢失报文不等超时。快恢复解决的是“重传之后如何调整窗口”既然还能收到重复ACK说明网络还能维持一部分包通过没必要像超时那样直接降到1。不同教材在快恢复后的cwnd取值上写法不同。王道408和谢希仁教材整体偏向Reno把ssthresh减半cwnd直接等于ssthresh。但有些国外教材使用自顶向下风格会强调快恢复阶段cwnd先加1再减半。我的经验是考前把你主用教材上的例题原封不动做一遍记住它的表述考试按它的来不要混用。这类题还喜欢混着“滑动窗口”考让你区分发送窗口和拥塞窗口。发送窗口是接收方通过TCP头里的窗口字段通告的限制的是发送方的流量拥塞窗口是发送方自己根据网络拥塞程度调整的。实际可用窗口取两者较小值。很多人在填表时只写其中一个丢掉一半分题目里问什么就填什么多看一眼“发送窗口”和“拥塞窗口”的区别。4.4 滑动窗口协议比较表链路层的滑动窗口题和传输层的滑动窗口题原理互通。停止等待、GBN、SR这三类协议的区别是期末简答和选择的常客也是大题里“给窗口大小判断协议类型”的基础。协议发送窗口接收窗口核心特点停止等待11发一个等一个利用率低GBN后退N帧11出错后从出错帧开始全部重传SR选择重传11只重传出错的帧接收方缓存乱序帧题目如果给你“发送窗口4接收窗口1”那就是GBN如果接收窗口也大于1就是SR。GBN的接收方不需要缓存乱序帧只要收到乱序帧就直接丢弃并给发送方返回最后一个正确收到的帧的ACK。SR则必须缓存。另外有个结论值得背发送窗口最大不能超过2^(n-1)其中n是序号位数这是为了防止新旧窗口重叠。有的计算题会考这个上限别只知道一半。5. 应用层与综合计算信道容量、时延、吞吐量5.1 香农公式与奈奎斯特公式的适用场景物理层的信道容量题难点不是公式而是判断用哪个公式。无噪声环境用奈奎斯特公式C 2W log2 VW是带宽V是信号电平数。有噪声环境用香农公式C W log2(1 S/N)注意这里的S/N是功率比值不是分贝。分贝换算必须练熟X(dB) 10 log10(S/N)所以30dB对应S/N1000。给一个经典题带宽4kHz信噪比30dB求最大数据速率。用香农公式C 4000 × log2(11000) ≈ 4000 × 9.97 ≈ 39860 bps。有的题目会接着问“若要达到这个速率需要多少电平数”那就用奈奎斯特公式反推39860 2×4000×log2 V算出来V ≈ 32。这两类题的常见错误有三个一是忘了把dB换算成比值直接把30代入二是误把奈奎斯特公式用到有噪声场景三是电平数V没取整数。记住公式的适用条件这几分不难。5.2 总时延计算先画时间线再套公式时延计算几乎每年都出现考点是把发送时延、传播时延、排队时延和处理时延分清楚。前三者常考后面两个题目一般会直接给或者忽略。发送时延 数据帧长度 / 信道带宽传播时延 链路长度 / 信号传播速度。一个常见错误是算总时延时漏掉“往返”两个字。如果题目问“收完整个文件需要多少时间”可能只要单程如果问“确认机制下总耗时”那就要在发送时延基础上加2倍传播时延。举个例子数据长1MB信道带宽100Mbps链路长度2000km传播速度2×10^8m/s。发送时延 8×10^6 bit / 10^8 bps 0.08s传播时延 2000×10^3 / 2×10^8 0.01s。如果是一次性发完且不要确认总耗时0.09s如果要等对方确认还要再加0.02s的往返传播时间。我习惯先画一条时间轴把“发送开始、发送结束、第一位到达、最后一位到达、确认返回”这几个点标出来一眼就能看出要不要乘2。这类题型还会结合“数据分帧后连续发送”来考例如把一个大文件分成多个帧首帧到达后接收方边收边确认这时候总时间基本等于“最后一个比特到达时间 最后一个确认返回时间”算起来要小心重叠部分。遇到这种题画时间线比空想更稳。5.3 HTTP传输时间和TCP握手RTT的换算应用层综合题最爱用“RTT”作为时间单位。题目会让你计算用户在浏览器输入网址到完整加载一个包含多个小图片的页面共需要多少个RTT。不同教材对RTT的定义细微有差常见的默认假设是TCP三次握手需要1.5个RTT也就是SYN占0.5RTT、SYNACK占0.5RTT、最后ACK占0.5RTT但有些教材直接算2个RTT所以先看清楚题目给的条件。如果题目说“DNS解析1个RTTTCP连接建立1.5个RTT请求并获取基础HTML页面1个RTT此后每获取一个嵌入对象需要1个RTT”那一个页面带3张图片按非持久连接串行下载的总时间就是1 1.5 1 3 6.5个RTT。如果改成持久连接TCP连接建立后可以复用后面3张图片都在同一条连接上串行获取总时间会变成1 1.5 1 3 6.5不对持久连接只需一次握手但图片依然需要逐个请求所以是1 1.5 1 3 6.5个RTT。区别在于减少了重复建连的开销。真正做题时不要套我的数字严格按照题目给的“每步占几个RTT”来加通常最后一步是图片全部下载完毕的时间。5.4 DNS递归与迭代的答题模板DNS解析流程题常常以简答或描述形式出现要求说明“递归查询”和“迭代查询”的区别。你可以把域名系统想象成一个全国范围内的物流分拨中心根域名服务器是总调度顶级域名服务器是省调度权威域名服务器是具体仓库本地域名服务器是离你最近的代收点。答题时用这套模板主机首先向本地域名服务器发起查询本地域名服务器若没有缓存就代替主机向根域名服务器查询根域名服务器返回顶级域名服务器的地址本地域名服务器再向顶级域名服务器查询得到权限域名服务器地址最后向权限域名服务器查询得到IP地址并返回给主机。这个过程里如果每层服务器都替查询者继续往下查叫递归查询如果每次只是“告诉你去哪查”让查询者自己一路追问叫迭代查询。本地域名服务器与主机之间一般用递归本地域名服务器与其它域名服务器之间常用迭代。考试中还可能问“DNS使用什么传输层协议”记住DNS既能用UDP也能用TCP正常查询用UDP端口53响应超过512字节改用TCP区域传送也必须用TCP。大题里给你“DNS响应很大”的场景要能反应过来为什么切TCP。6. 考场排雷这些坑我当年一个个踩过6.1 单位换算的隐形坑计算机网络计算题最容易在单位上扣分。带宽里的M可能是10^6也可能是2^20取决于题目用的是通信领域还是存储领域。网络题默认用十进制所以100Mbps就是100×10^6 bps而文件大小1MB通常是1×2^20字节先把两边的bit统一再算时延。CRC里的“位串长度”也要数清楚别把起始的1漏了。还有一个经典坑传播速度如果题目写“光速的2/3”那就是2×10^8m/s别误用3×10^8去乘。我的习惯是在草稿纸开头先写一行“统一单位×××”把bps、bit、字节、km全部标注清楚再做计算。这样即使最后结果错了老师也能看到你不是不懂只是换算失误。6.2 分片、子网、拥塞容易丢分的细节IP分片题的丢分点主要在两个地方分片后每个分片的数据部分必须是8的倍数以及片偏移的单位是8字节。很多同学把偏移写成“第几片”0、1、2这是错的。子网划分题最容易丢分的是“每子网可用地址数”——以为2^k就行忘了减网络地址和广播地址。只有主机位大于等于2才真的可用因为至少留一个网络地址和一个广播地址。拥塞控制题容易丢分的是“超时”和“三次重复确认”后的处理不同以及画图时横轴单位到底是一个传输轮次还是一个RTT。考试时题目如果给了“RTT5ms”这样的数值说明它想让你把时间轴算成具体时间如果只给轮次编号就直接用轮次表示别自己加单位。6.3 大题的规范书写姿势考前我反复和学生强调计算大题不能只写答案。假设一道子网划分10分网络地址怎么借位、掩码怎么变、可用主机范围是多少每一步都要写出来。阅卷是按步骤给分的结果错了步骤对也能拿一半。你要是只写一个/27顶多两分。推荐的答题格式是先写已知条件再写关键公式然后代入数据最后写结论。比如时延题先写发送时延数据长度/带宽代入数字再写传播时延距离/速度代入数字最后写总时延。TCP状态题则先画出状态迁移简图再文字解释这样看起来非常清爽。我个人建议考前用A4纸把每类大题的“公式陷阱答题模板”手抄一遍不用背抄完基本就有肌肉记忆了。计算机网络大题看起来花样多剥开之后其实是数学计算加固定协议逻辑的重复。把上面这些题型练熟了考场上看到题的第一反应不是“我不会”而是“这题我见过按套路来就行”。