
2010年408真题第34题以及围绕它出现的各种类似题是我给学生讲计算机网络时必拿出来拆的一道题。题目本身不长选项也就四个数字但它把报文交换和分组交换的核心差异——存储转发下的流水线——考得干干净净。很多同学第一次做会在80ms、80.08ms、80.16ms之间反复犹豫还有人算出235.2ms这种离谱结果其实那恰好是报文交换的答案。这篇文章就把这道题以及它的常见变体彻底拆开从公式推导到易错点从报文交换对比到复习方法一次性讲透。1. 从2010年真题34题说起报文交换和分组交换在争什么1.1 这道题到底长什么样先还原一下这道题的经典版本主流解析使用的版本历年回忆版可能有细微差别在如图所示的分组交换网络中所有链路的数据传输速率为100Mbps分组大小为1000B其中分组头大小为20B。若主机H1向主机H2发送一个大小为980000B的文件忽略分组拆装时间和传播时延则H2收到该文件所需的时间至少为多少拓扑结构H1 → S1 → S2 → H2即经过两台存储转发交换机共三段链路。选项A. 80ms B. 80.08ms C. 80.16ms D. 80.24ms这题的标准答案是C80.16ms。如果你在某个回忆版里看到答案不是这个先别急着怀疑自己大概率是图中链路数被简化了——比如中间只画了一台交换机那就是两段链路答案会变成80.08ms也就是B选项。两种版本我都见过关键不在背哪个数字而在把时延公式吃透一改链路数你自己就能换算。1.2 报文交换和分组交换的一字之差报文交换Message Switching和分组交换Packet Switching都属于存储转发家族但交换单位完全不同。报文交换把整个报文当成一个整体从源节点发出每个中间节点必须把整个报文完整收下来再往下一跳转发。中间节点在任何时刻都只处理一个完整报文不能拆不能并行。分组交换发送端先把报文切成若干个长度受限的分组每个分组都带上源地址、目的地址等控制信息独立地在网络中转发。每一跳只存储转发一个分组第一个分组到达中间节点时不需要等待后续分组都到齐可以边收边转。用人话说报文交换像一整列绿皮火车必须整列进站、整列出站分组交换像把货物拆成一节节独立车厢第一节车厢到站后立刻挂上下一趟车继续跑后面的车厢按节拍跟上整条运输线像一条流水线。408之所以把这两个概念放在同一道选择题里就是因为它们属于同一个存储转发框架却因为交换单位大小不同产生了完全不同的时延模型。这道题表面在考计算实际在考你有没有理解这层差别。1.3 为什么每年都有人在这道题上丢分我观察下来丢分的不是算不出数而是算出来的数没在选项里或者算出来之后不知道自己在算什么。常见的翻车路径有两种。第一种是把所有分组都当成独立走完全程算出N×n×T这种结果数字大到离谱第二种是把分组头和文件大小混在一起要么忘了加20B的头要么忘了980000B是数据部分的总大小导致分组数算错。这两种错误本质都是对流水线和分组开销两个概念不够熟。下面我从头梳理一遍从定义到公式到变式一条路走到底。2. 动手算之前把时延概念先钉死2.1 四大时延拆解计算机网络里一个分组从发送端到接收端的总时延由四部分组成发送时延也叫传输时延节点把数据全部送入链路所需的时间计算公式是数据长度 ÷ 发送速率。它取决于数据多大、链路多快和数据跑了多远没关系。传播时延电磁波信号在链路上从一端传到另一端的时间计算公式是链路长度 ÷ 传播速率。它取决于链路多长和数据量大小没关系。处理时延节点解析分组、查路由表、做差错校验的时间。排队时延分组在节点输出队列里等待被发送的时间。这道真题明确说了忽略分组拆装时间和传播时延而处理时延、排队时延在存储转发模型的理想化场景下也不考虑所以最后只留下发送时延一项。这也是为什么题目算出来的都是精确值而不是一个模糊的范围——而非理想化场景下排队时延是随机的没法用选择题精确计算。2.2 发送时延和传播时延很多人从第一关就开始混我见过不少学生把这两个时延混在一起以为是同一个东西。这里用个类比帮大家钉死发送时延是过收费站的时间——收费站有多少辆车排队每辆车缴费、抬杆、通过需要多久跟目的地离得多远无关。传播时延是跑高速的时间——车从收费站A开到收费站B要多久跟车上装了多少货无关。在理想化题目里如果把传播时延忽略掉就相当于假设每条链路的长度是0信号瞬间到达对端只剩过收费站的时间。2010年这道题的简化条件正是如此。等到后面变式部分我会专门演示把传播时延加回来之后该怎么算。还有一个总是被忽略的单位坑Mbps里的M是10^6不是2^20。100Mbps 100×10^6 bps 10^8 bps。如果你用100×2^20去算结果会差出一点点虽然选择题选项差距是0.08ms但在更复杂的题里这点误差可能直接让你选错。字节和比特的8倍关系也是老生常谈1000B是8000bit不是1000bit。2.3 存储转发这个前提有多重要这道题能算的前提是中间交换机采用存储转发方式也就是必须把整个分组收完才能开始向下一跳转发。这意味着什么一个分组从H1发出完整到达S1需要T发送时延S1收完后立刻转发到S2又需要TS2收到后再转发给H2还需要T。所以单个分组走完三段链路是3T。这就是存储转发带来的节拍。如果中间交换机是直通式转发cut-through收到分组头就开始转发那第一个字节进入S1后几乎立即可以被送往S2时延模型完全不同不能套用这个公式。408默认存储转发除非题目明确说直通交换否则一律按存储转发处理。3. 分组交换的80.16ms是怎么一步步算出来的3.1 拆题从文件到分组从分组到时延第一步先把题目给的数据全部统一成bit或者B别混合计算。文件大小980000B分组总长度1000B其中20B是分组头每个分组携带的数据部分1000 - 20 980B分组数980000 ÷ 980 1000个这一步最容易出错的地方主要有两个。一个是拿980000直接除以1000得到980个分组但这样等于默认每个分组的980B数据里还包含20B的分组头把头和数据混为一谈。另一个是忘了分组数必须是整数好在这里除得干干净净有些题除不干净时需要向上取整发送端必须把最后一个不足一个分组的数据也装进一个分组里发出去。第二步算单个分组的发送时延T。单个分组长度1000B 8000bit链路速率100Mbps 10^8 bpsT 8000 ÷ 10^8 8×10^-5s 0.08ms这个0.08ms非常重要后面所有计算都围绕它展开。注意这里必须用1000B而不是980B去算发送时延因为链路上实际传输的是整个分组分组头是要占用发送时间的。有些同学拿980B去算得到T0.0784ms最后算出的总时延不在任何选项里其实就是栽在这里。3.2 核心公式总时延(nN-1)T到底怎么来的这一步是整道题的灵魂我建议你先别急着记公式跟着我把小规模例子推一遍。假设现在只有3个分组链路仍是3段。时间线是这样的时间段H1→S1S1→S2S2→H20 ~ T分组1在发空闲空闲T ~ 2T分组2在发分组1在发空闲2T ~ 3T分组3在发分组2在发分组1在发3T ~ 4T空闲分组3在发分组2在发4T ~ 5T空闲空闲分组3在发注意看H1并不是把3个分组全部发完之后才开始发第二个而是第一个分组一进入链路H1立刻接着发第二个分组。三条链路在同一时刻分别处理不同分组这就是流水线的真实面貌。从这张表可以数出来3个分组走3段链路总时间是5T (33-1)T。如果把分组数改成N链路数改成n总时间就是总时延 (n N - 1) × T这个公式的直观理解是第一个分组从头走到尾需要nT从第二个分组开始每多一个分组只是因为H1在第一条链路上多发了T的时间后续各跳的流水线会自动把这个分组排到终点所以再额外加(N-1)T。合起来就是nT (N-1)T (nN-1)T。千万别算成N×n×T那意味着每个分组都等前一个分组走完全程才开始发送等于把流水线拆掉了退回到报文交换的思路。3.3 代入求解与两个常见答案的来源现在把数字代进去n 3三段链路N 10001000个分组T 0.08ms总时延 (3 1000 - 1) × 0.08 1002 × 0.08 80.16ms答案是C。那B选项80.08ms是哪来的是把n当成2算出来的(21000-1)×0.08 1001×0.08 80.08ms。如果你拿到的是只有一台中间交换机的回忆版那答案就是B。A选项80ms是把流水线的尾部排空时间(n-1)T给省了只算了N×TD选项80.24ms则是把n算成了4多算了一段链路。四个选项对应四种典型错误出题人其实把坑都摆在你面前了。4. 同样数据走报文交换为什么是235.2ms4.1 报文交换的时延公式与计算报文交换不拆分组整个980000B文件当作一个报文从H1完整传送到S1需要980000 × 8 7840000bit 7.84Mb7.84Mb ÷ 100Mbps 78.4msS1必须收完整个78.4ms的报文才能向S2转发S2同样收完78.4ms再向H2转发。所以三段链路一共需要3 × 78.4 235.2ms写成一般公式就是报文交换总时延 n × (L/R)其中L是整个报文的长度R是链路速率n是链路段数。因为每一跳都要独立传输完整个报文没有流水线可以覆盖。4.2 两相对照235.2ms vs 80.16ms交换方式时延公式代入本题结果报文交换n × L/R3 × 78.4 235.2ms分组交换(nN-1) × P/R(31000-1) × 0.08 80.16ms同样的文件、同样的链路速率、同样的存储转发节点只因为把报文拆成了1000个分组总时延降到原来的三分之一左右。这个三分之一不是巧合——当分组数N远大于链路数n时分组交换时延约等于N×T也就是把整个文件在第一条链路上发送完的时间而报文交换需要n次传输整个文件。链路越多差距越大。这里多说一句报文交换还有个隐性代价——每个中间节点需要拿出能缓存整个报文的存储空间。一个980000B的报文S1和S2都得准备接近1MB的缓冲区。换成1000个1000B的分组每个节点只需要几百KB的缓冲就能跑起来。这也是实际网络最终选择分组交换而不是报文交换的原因之一不仅快而且对节点缓存要求低得多错误重传的代价也小得多。4.3 快三倍背后的组网启示理解了公式之后你可以从这个例子里得到几个非常实用的直觉分组交换的核心优势是流水线不是拆开本身。哪怕分组不拆只要允许节点在收完一个报文之前就开始转发后续内容也能部分流水线化但那样节点就必须维护多个报文的上下文复杂度会爆炸。时延瓶颈在入口速率和链路段数的乘积关系上。第一条链路决定了分组进入网络的节拍中间链路只是把这个节拍延续下去。所以源端到第一个交换机的链路速率往往对端到端时延影响最大。报文交换只在报文很小、链路很短、节点很少时勉强有优势——因为它没有分组头开销。一旦文件变大、链路变多报文交换的劣势是指数级放大的。这些结论不只是为了做题理解之后对你后续学TCP、IP分片、MPLS这些内容都有帮助。分片也好、分组化也好本质上都是在减少单次存储转发的粒度和增加控制开销之间做权衡。5. 变式训练链路数、分组大小、传播时延一改就翻车5.1 变式一链路数减半会发生什么如果把拓扑改成H1 → S1 → H2中间只隔一台交换机也就是两段链路其他条件不变那么总时延 (2 1000 - 1) × 0.08 1001 × 0.08 80.08ms注意这里不是简单地把80.16减去0.08就完事了而是n从3变成2公式整体重算。从物理意义上看少一段链路意味着第一个分组少经过一次存储转发整个流水线的排空时间少了一个T所以总时延减少0.08ms。这也是2010年原题里B选项的来历。做题时一定要养成先数链路数的习惯。题目给的拓扑图里交换机、路由器别漏数主机到第一个交换机那段链路也要算进去。很多人只数交换机之间的链路把主机到交换机的这段漏了一漏就是0.08ms的差距。5.2 变式二分组改小为何时延反而变大假设分组总长度改成520B其中分组头仍是20B也就是每个分组携带500B数据文件还是980000B链路还是3段100Mbps不变。分组数 N 980000 ÷ 500 1960分组总长 520B 4160bit单个分组发送时延 T 4160 ÷ 10^8 4.16×10^-5s 0.0416ms总时延 (3 1960 - 1) × 0.0416 1962 × 0.0416 ≈ 81.62ms一个很有意思的结论出现了分组从1000B改小到520B总时延反而从80.16ms涨到了81.62ms。为什么因为分组虽然变小了单个发送时延变小了但分组数量从1000涨到了1960而且每个分组都要白白多付20B的分组头开销。980000B的文件装在1000B分组里总开销是1000×2020000B装在520B分组里总开销是1960×2039200B几乎多了一倍。这些开销都要占用发送时间。这个变式告诉你一个反直觉的事实分组不是越小越好。分组太小时头部开销占比高有效吞吐率下降分组太大时虽然头部开销占比低但单分组发送时间长而且一旦出错重传的代价也大。真实网络设计MTU最大传输单元就是在两端之间取平衡以太网选1500B左右不是拍脑袋定的。5.3 变式三把传播时延加回来后的正确算法真题里说忽略传播时延但408完全可能在变式题里不给这个简化条件。假设每段链路传播时延为D 0.5ms仍然忽略处理时延和排队时延。分组交换的总时延公式变成总时延 n × (T D) (N - 1) × T (n N - 1) × T n × D简单解释一下第一个分组走完三段链路每一段都要花T发送、D传播所以是3×(TD)。之后的每个分组因为H1每隔T就发出下一个分组它们在流水线上到达H2的时间间隔也是T所以再追加(N-1)×T。代入数字80.16 3 × 0.5 80.16 1.5 81.66ms。这里最容易犯的错误是N×n×D以为每个分组在每个链路都要单独加一遍传播时延。实际上传播时延只在第一个分组端到端的过程中完整叠加一次后续分组在流水线中间隔由发送时延决定传播时延并不累积到每个分组上。你可以用3个分组、2段链路的时序图验证第一个分组总时间是TDTD第二个比第一个晚T第三个比第二个晚T最后总时间是2(TD)2T(nN-1)TnD没有问题。报文交换加入传播时延后则是n × (L/R D)代入就是3 × (78.4 0.5) 236.7ms。每一跳都要完整的发送传播不存在流水线覆盖。5.4 这类题的易错点集中清单易错点错误做法正确做法分组头处理用980B算发送时延发送时延按分组总长1000B算分组数计算980000÷1000980980000÷(1000-20)1000Mbps单位当成100×2^20100Mbps10^8bps链路数只数交换机之间主机到第一台交换机也算一段共n段流水线公式每个分组走n段N×n×T总时延(nN-1)T传播时延叠加每个分组加n×D只在第一个分组端到端叠加nD报文交换套用分组交换流水线公式必须整体传输n次n×L/R这张表我建议抄在错题本上。等到第二轮复习时你只要看到存储转发时延计算忽略传播时延这些关键词直接按这张表逐项检查基本不会再错。6. 复盘把一道题变成一类题6.1 推荐的做题路径小规模画时间线如果你第一次接触这类题时没有理解公式不要硬背我的建议是把N和n都换成小数字比如3个分组、3段链路把时间线画出来。画完之后你会发现时间线的总长度就是5T然后推广到N个分组就是(N3-1)T。这个方法在考试时也救命。万一考场上忘了公式你就现场画一个3分组、3链路的时序图从图上数出5T马上就能反推出(nN-1)T这个通项。画一个3×3的表格只要半分钟比背错公式强一百倍。我给学生讲题时经常说公式是用来验证直觉的不是用来代替直觉的。你如果能用一句话讲清楚为什么时延是(nN-1)T这公式你这辈子都不会忘。6.2 用估算自检数量级对不对算完答案后建议做一个简单的数量级自检。1MB左右的文件在100Mbps链路上传输物理上至少需要约80ms因为8.4Mb÷100Mbps≈84ms考虑到分组开销是80.16ms。如果你算出8ms、800ms这种结果一定哪里算错了。报文交换在3段链路上是235.2ms约等于文件发送时间×链路数这也是合理的。选项之间相差0.08ms一个T如果你算出的结果在两个选项之间说明n数错了或者分组数错了。这种先估数量级再精确计算的习惯考场上能帮你快速排除明显不合理的选项。特别是选择题四个选项如果只有一个是80ms量级其他都是几十秒、几百秒那数量级自检直接帮你锁定答案。6.3 复习资料怎么选这道题几乎在每本408辅导书里都有王道、天勤这些主流资料覆盖得很全关键在于你怎么用它。我的建议是不要只看解析的答案要追着解析问三个问题——这个公式怎么来的如果把参数改一个数字会怎样报文字交换和分组交换换一下会不会算带着这三个问题读解析一道题顶十道。至于网上常有人问湖科大教书匠的计算机网络视频适不适合408备考我的看法是这类基础时延概念用它的视频打底子完全可以思路讲得很细适合第一轮建立直觉但到了9月以后一定要回归真题和各校模拟题的选项数字做计算因为视频讲的是懂考试要的是快、准。两个阶段目标不同别混在一起。6.4 几句实在话最后说点我个人的体会。我自己第一遍做这道题的时候也算出了80.08ms因为我把图里主机到交换机的链路给漏数了。后来把时间线画出来才意识到少一条链路就是少一个T。从那以后凡是遇到时延计算我第一反应永远是数链路、数节点、看单位先把这些硬参数钉死再动手算。这种先框定边界、再动公式的习惯对408的其他题目一样适用。计组的Cache计算、操作系统的页面置换、数据结构的复杂度分析本质上都是先找到准确的参数再套模型。题目千变万化但好学生的思路永远是同一套读题拆参数——画图找规律——归纳公式——代入验证。这道题刷完建议你顺手把历年真题里所有涉及时延计算的题都翻出来做一遍。你会惊讶地发现它们几乎都是同一道题的不同马甲区别无非是加了传播时延、改了分组大小、换了链路速率。把2010年这道34题吃透了就等于把这一整类题都吃透了。