Appearance
网络层功能:路由、转发与异构网络互联
2026 大纲 四(一)1 异构网络互连、四(一)2 路由与转发、四(一)4 拥塞控制、四(八)2 路由表与分组转发,并承载 二(一)5 数据报与虚电路(它本来就是网络层的两种服务模型,放这里才能和 IP 的无连接特性连起来讲)。
一、路由与转发:一件事为什么要拆成两件
链路层解决的是"一段链路上怎么把帧送到对面"。可一台主机要访问的机器往往隔着十几段互不相同的链路,中间没有任何一台设备知道全程长什么样。网络层要接手的就是这件事:把分组从源送到目的,跨越任意多段异构链路。
真做起来,这件事会立刻分成两个节奏完全不同的动作。一个是算路——十几台路由器互相交换信息,共同算出"去某个网络该往哪走",这要跑协议、要收敛,快则几秒慢则几十秒。另一个是送包——一个分组到了,查表、TTL 减 1、换上新的帧头发出去,这必须在微秒级完成,否则线速就跑不满。
于是网络层把它们拆开:前者叫路由(routing),在控制面,多台路由器协同;后者叫转发(forwarding),在数据面,单台路由器独立完成。
拆开的真正理由是两者的优化目标相反。 路由表要便于按拓扑整体重算,所以它保存的是"目的网络 → 下一跳"这种便于协议更新的映射;转发表要便于极快查找,所以它还要预先填好出端口、下一跳的 MAC 等"完成转发所必需的信息"。谢希仁书上把这层意思说得很直白:路由表总是用软件实现,而转发表可用专用硬件实现。
边界:讨论路由选择原理时,两者常被笼统地都叫路由表——这不是错,是省略。但一旦题面把"路由表"和"转发表"并列写出来,就必须严格区分。同样,"转发"仅仅涉及一台路由器,"路由选择"则涉及很多台。
二、异构网络互连:IP 抹平了什么,没抹平什么
要把帧格式、寻址方式、MTU 都不同的链路缝成一张网,历史上有两条路。翻译式是在每两种网络的交界处放一个协议转换器,
IP 统一了三件事:统一的地址格式、统一的分组格式、统一的尽力而为语义。它没有统一的是"链路究竟怎么把这个分组搬过去"——而恰恰是这个没统一的部分,逼出了网络层三个配套机制:
| IP 没抹平的差异 | 谁来抹平 |
|---|---|
| 各链路 MTU 不同 | IP 分片,见IP 分片 |
| IP 地址 ≠ 链路层地址 | ARP,见ARP 地址解析协议 |
| 链路类型不同、帧格式不同 | 路由器在出接口重新封装 |
为什么统一层非得放在网络层,不能放在链路层? 因为链路层的帧只在一段物理链路内有意义,跨链路必须整个剥掉重封。只有 IP 地址端到端始终不变,才能当那个"全程通用的门牌号"。这也顺带解释了一个初学时常觉得别扭的事实:一个分组从北京到广州,每过一跳帧头都被换掉一次,可 IP 首部里的源地址和目的地址从头到尾一个字节都没动。
这就是沙漏模型:下面链路技术百花齐放,上面应用协议百花齐放,中间腰部只有 IP 一根——腰细,才换来两头都能自由演化。SDN 对这条主线的改造(控制面被抽出来集中到控制器)见 SDN。
三、数据报与虚电路:分歧只有一个根
网络层可以提供两种服务模型,教材上列出的差异有七八条,但它们全部是从同一个技术抉择派生出来的:
转发决策,是每个分组各做一次,还是在连接建立时一次做完?
选"每个分组各做一次",就是数据报;选"建立时一次做完",就是虚电路。
| 维度 | 数据报(Datagram) | 虚电路(Virtual Circuit) |
|---|---|---|
| 是否建立连接 | 不需要,随到随发 | 需要:建立 → 数据传输 → 释放 三阶段 |
| 分组头带什么 | 完整的目的 IP 地址 | 只带一个虚电路号 VCID(短得多) |
| 路由决策时机 | 每个分组各查一次表 | 建立连接时定死,之后照走 |
| 路径 | 同一对主机的分组可走不同路 | 同一条 VC 的分组必走同一条路 |
| 中间节点是否有状态 | 无(每包独立) | 有,每条 VC 一行状态 |
| 是否会失序 | 可能失序 | 不会(同路径先进先出) |
| 节点故障影响 | 只丢经过该节点的少量分组,其余自动绕行 | 整条 VC 失效,必须重建 |
| 差错与流量控制 | 交给端系统(传输层) | 可以由网络负责 |
| 代表 | IP 网络 | X.25、帧中继、ATM |
每一行都能从那个根推回去:决策一次做完,就必须先建连接(要有个时机去做这次决策)、就必须在中间节点留状态(决策结果得存下来)、路径就固定了(决策不再重做)、也就不会失序了(同路径 FIFO);反过来,节点一坏这条 VC 的状态就没了,只能整条重建。
VCID 为什么能比 IP 地址短这么多:它是局部标识。路由器按「入接口 + 入 VCID」查表,输出时换成「出接口 + 出 VCID」,同一条虚电路在不同链路段上的 VCID 可以完全不同。局部标识只要在一条链路上唯一,十几位就够;全局地址必须全网唯一,就得 32 位。
有一条最容易记反:虚电路固定的是路径,不是带宽。 链路带宽在虚电路网络里仍然是统计复用的——多条 VC 共享同一条链路,谁有数据谁发。"预分配带宽""独占信道"是电路交换的性质,不是虚电路的。把两者混为一谈,就会得出"虚电路不会拥塞"这种明显错误的推论。
还有一条边界值得点明:数据报"可能失序"不等于"经常失序"。但只要理论上允许失序,传输层就必须准备好处理——这才是 TCP 需要序号和重排缓存的根本原因。
可靠交付该由谁负责:那场争论与它的完整后果链
这两种服务模型的分歧,源头是一场长期争论——在计算机通信中,可靠交付应当由谁来负责?是网络,还是端系统?
主张"由网络负责"的一方借鉴电信网:传统电信网用面向连接的通信方式让网络向用户提供可靠传输,放到分组交换里就是先建立一条虚电路 VC 再传数据。

图源:谢希仁《计算机网络》(第 8 版)图 4-1(a),印刷版 p115
互联网选了相反的思路,理由在两种端系统的能力差别上。电信网的端系统是电话机——简单,没有智能,更没有差错处理能力,可靠性只能由网络负责,代价是中间要放昂贵复杂的程控交换机。计算机网络的端系统是计算机——有很强的差错处理能力,可靠性完全可以交给它,中间的路由器于是可以做得比较简单、价格低廉。

图源:谢希仁《计算机网络》(第 8 版)图 4-1(b),印刷版 p115
所以互联网的设计思路是:网络层要设计得尽量简单,向其上层只提供简单灵活的、无连接的、尽最大努力交付的数据报服务。
这个选择推出了一整条后果链:① 发送分组不需要先建立连接;② 每个分组独立发送,与其前后的分组无关(不进行编号);③ 网络层不提供服务质量的承诺——所传送的分组可能出错、丢失、重复和失序,也不保证交付的时限;④ 于是路由器可以做得比较简单、价格低廉;⑤ 主机进程之间若需要可靠通信,由主机中的运输层负责。
这条链解释了 408 里一连串看似孤立的结论:为什么 TCP 需要序号(因为会失序、会重复)、为什么 TCP 需要确认与重传(因为会丢失)、为什么校验和只覆盖 IP 首部(因为 IP 本来就不打算保证数据正确)、为什么路由器丢包不是 bug。它们全都是"可靠性下放给端系统"这一个决定的推论。
顺着这条链还能一并厘清 IP"不可靠"的准确含义:不是"经常出错",而是丢了不重传、也不通知。拥塞时路由器主动丢分组因此是正常行为不是故障——而且这个动作还兼任向端系统传递拥塞信号的职能,这一点第五节会展开。
四、路由表与分组转发
路由表的核心字段是目的网络 + 掩码(写成 192.168.1.0/24)、下一跳、出接口、度量值 metric。围绕它,408 只反复考两条规则:查表时怎么选,建表时怎么合。
最长前缀匹配:先筛命中,再比长度
规则本身分两步,次序不能颠倒:
① 先做"目的 IP AND 掩码 = 目的网络",筛出所有命中项; ② 再在命中项里取掩码位数最大的那条。
颠倒过来——先按掩码长度排序、逐条试——就会把根本没命中的长掩码项错当答案。
"最长"为什么代表优先,道理不在"更精确"这种模糊说法,而在包含关系:/27 的地址块是 /24 的子集。管理员既然特意为这个子集写了一条细路由,就说明这一小块要走别的路。粗路由是兜底,细路由是特例,特例优先。
同一句话也解释了默认路由:0.0.0.0/0 不是一个特殊分支,它参与同一次匹配,只是掩码位数为 0 所以永远排在最后。不存在"先查普通路由、查不到再查默认路由"的两趟流程。
拿一张自造的路由表把两步走一遍:① 0.0.0.0/0 → R0;② 202.114.0.0/16 → R1;③ 202.114.32.0/20 → R2;④ 202.114.40.0/21 → R3;⑤ 202.114.44.0/24 → R4。前两个字节都一样,只需盯第三个字节:/16 不管第三字节,/20 管前 4 位,/21 管前 5 位,/24 管全 8 位。
查 202.114.44.130,第三字节
| 记录 | 与掩码相与后的第三字节 | 记录要求的值 | 命中? |
|---|---|---|---|
② /16 | 不比较 | — | ✅ |
③ /20 | 32 | ✅ | |
④ /21 | 40 | ✅ | |
⑤ /24 | 44 | ✅ |
四条全中,取掩码最长的 ⑤ → 下一跳 R4。
再查 202.114.46.7,第三字节 46:⑤ 要求第三字节恰好 44,一位不同就出局 ❌;④ 得 40 ✅;③ 得 32 ✅。最长命中是 ④ → R3。44 和 46 只差 2 却分道扬镳,这就是"细路由的适用范围极窄"的具体含义。
最后查 202.114.20.9,第三字节 20:⑤ ❌;④ 得 16 ≠ 40 ❌;③ 得 16 ≠ 32 ❌;只剩 ② → R1。若目的换成 203.1.1.1,连 ② 都不命中,落到 ① 默认路由 → R0。
路由聚合:两个条件缺一不可
把多条细路由合并成一条粗路由,可以缩短路由表、加快查表。但合并有硬条件,两条都得满足:
① 下一跳与出接口相同——否则合并后无法决定往哪边送; ② 前缀全同 + 低位取遍所有组合——恰好填满一个对齐块,不多不少。前一半保证"是一块",后一半保证"填满不留洞"。
能聚合的情形:192.168.8.0/24、192.168.9.0/24、192.168.10.0/24、192.168.11.0/24 下一跳都是 R2。第三字节分别是 00001000、00001001、00001010、00001011——前 6 位全同(000010),第 7、8 位取遍 00/01/10/11 四种组合。共同前缀 192.168.8.0/22;回头校验它覆盖 192.168.8.0~192.168.11.255,正好是四个 /24 的并集,不多不少 ✅。
不能聚合的情形:把第四条换成 192.168.12.0/24(00001100)。只有前 5 位全同(00001),第 6 位上 8/9/10 是 0 而 12 是 1,共同前缀只剩 21 位。强行写成 /21 会覆盖第三字节 8~15,比实际持有的多出 11、13、14、15 四块。正确做法是拆成三条:192.168.8.0/23(含 8、9)+ 192.168.10.0/24 + 192.168.12.0/24。
边界(很多人会漏):聚合后多覆盖一些地址块本身不一定立刻出错——如果这些多出来的块在本路由器上没有任何其他路由声明,用
/21一起吸收进来,只会让本该走默认路由的分组走到 R2 后被丢弃,结果和不聚合时一样是不可达。真正的问题在于:一旦192.168.13.0/24在别处另有一条下一跳不同的路由,/21就会与它争夺流量——/24比/21长,最长前缀匹配会让它仍然走对,但路由表已经变成一个靠优先级救场的脆弱结构。工程与考试的口径都取严格版:只有恰好填满一个对齐块时才聚合。
五、拥塞控制(网络层视角)
拥塞的定义式很短:
拥塞也不是一个稳态,而是正反馈——重传并不缓解拥塞,反而加剧拥塞。这条环路一旦转起来,没有机制去掐断它,网络就会一路滑向死锁:
这里有一句必须按住的话:分组丢失是征兆,不是原因。 把它记反,就会本能地想到"加大缓存"——而加大缓存只是把丢包换成无限期排队 + 重传泛滥,浪费得更彻底:
| 单点加资源 | 结果 |
|---|---|
| 加大缓存 | 排队时延无限增长 → 分组还没轮到发送,发送端的重传定时器早已超时 → 重传泛滥 |
| 提高处理机速率 | 瓶颈转移到链路或缓存,总体没变好 |
| 换更高速的链路 | 瓶颈转移到处理机或对端 |
三行是同一句话的三种说法:问题的实质是整个系统各部分不匹配,只有所有部分都平衡了才会解决。 提升单个部件只会让瓶颈搬家。
拥塞控制和流量控制的分野也常被混。前者是全局问题,端点只知道"某处堵了"、不知道堵在哪;后者是两方的端到端问题,接收端明确告诉发送端"我还能收多少"。有个一试就灵的判别法:把接收端换成无限快、缓存无限大的机器,问题还在就是拥塞,消失了就是流量控制。
教材给的两个反例比任何定义都管用。只需流量控制的:某光纤网络链路速率 1000 Gbit/s,一台巨型机以 1 Gbit/s 向一台个人电脑传文件——带宽绰绰有余,不可能拥塞,但巨型机必须经常停下来等个人电脑处理。只有拥塞的:另一网络链路速率 1 Mbit/s,接了 1000 台大型计算机,其中 500 台各以 100 kbit/s 向另外 500 台发文件,总需求 50 Mbit/s 是链路容量的 50 倍——问题根本不在接收端来不及收。
控制方法分两类。开环是在设计时就把发生拥塞的因素考虑周到,运行时无反馈(容量规划、接入控制、流量整形)——注意"开环不是没有控制"。闭环是"监测 → 传信息 → 调整"三步走。第 ② 步的三种做法代价差别很大:发抑制分组的问题在于通知拥塞的分组本身会使网络更加拥塞;在正常转发的分组里捎带一个比特几乎零额外开销(这就是 ECN 的思路);周期性发探测分组有固定开销且有延迟。第 ③ 步的时机最难拿捏——动作太频繁会产生不稳定的振荡,太迟缓又没有实用价值,而选择正确的时间常数是相当困难的。教材在这里还点名警告过一句:甚至正是拥塞控制机制本身,成为引起网络性能恶化甚至死锁的原因。
吞吐量-负载曲线怎么读(想把拥塞控制的一般原理补齐时展开)

图源:谢希仁《计算机网络》(第 8 版)图 5-23,印刷版 p240
两根坐标轴:横轴提供的负载是单位时间内输入给网络的分组数目,纵轴吞吐量是单位时间内从网络输出的分组数目。
| 曲线 | 形状 | 含义 |
|---|---|---|
| 理想的拥塞控制 | 先 45° 直线,饱和后转水平 | 饱和前"输入多少就输出多少",一个不丢;饱和后受资源上限约束,吞吐量保持在最大值不下降 |
| 实际的拥塞控制 | 增速逐渐放缓,趋于一个低于理想值的水平 | 还没到饱和,就已经有一部分输入分组被丢弃 |
| 无拥塞控制 | 先升,到峰值后掉头向下 | 负载继续加大,吞吐量反而下降 |
| 死锁 | 曲线落到零 | 负载大到某个值,网络完全无法工作 |
图上还标了两个区间:轻度拥塞(吞吐量已明显低于理想值,但还在随负载增长)与拥塞(吞吐量随负载增大反而下降,这才是严格意义的拥塞区)。
为什么"理想拥塞控制"饱和之后是水平而不是下降? 因为理想控制会在入口处就把超额负载挡住,网络内部始终工作在满载而不过载的状态。水平线的高度 = 网络资源允许的最大吞吐量——拥塞控制的全部目标就是让实际曲线尽量贴近这条水平线,并且绝不允许掉头向下。
和 TCP 拥塞控制是什么关系
同一个目标,不同的层、不同的信息量。 网络层在路由器上,直接看得到自己的队列长度与丢弃率,手段是丢弃分组、显式标记(ECN)、调度整形、接入控制;TCP 在端主机上,只能靠"迟迟收不到确认"去猜,手段是调节拥塞窗口 cwnd。因特网的路线是:网络层保持简单,把拥塞控制的主要责任交给端系统的 TCP。
所以"IP 不可靠"和"因特网有拥塞控制"并不矛盾。恰恰相反,IP 的"丢了就丢了、不重传不通知"正是拥塞信号的载体——如果网络层自己把丢的包补回来,端系统就永远收不到拥塞信号了。四个具体算法与 cwnd 的逐轮演变见 TCP 拥塞控制。
丢哪一个、什么时候丢
既然丢包是信号,就有发得好不好的问题——丢哪一个分组、什么时候丢全在路由器手里,这是网络层的决定,不是 TCP 能管的。
路由器的队列通常按先进先出 FIFO 处理到来的分组,队列长度总是有限的,于是最简单的做法是队列已满时,以后再到达的分组全部丢弃,这叫尾部丢弃策略。它的问题不在"丢",而在"一丢就丢一串":
这个现象叫全局同步。 它的根因值得说准:不是"丢得多",也不是"很多连接碰巧一起变慢",而是成片地丢——队列里的分组分属很多条 TCP 连接,尾部丢弃"来了就丢",一次溢出同时打击几十上百条连接,把相位本来互不相干的它们敲齐了。后果是吞吐量在高低之间大幅摆动,链路平均利用率上不去——丢包总量不见得多,浪费却很大。
这里补上"加大缓存解决不了拥塞"的另一半:队列管得不好,同样解决不了拥塞。缓存大小和队列策略是两个独立的旋钮,把前一个拧到底不解决问题,真正有效的是后一个。
主动队列管理 AQM 的"主动"就是针对尾部丢弃的"被动"来的:不要等到队列长度已经达到最大值时才不得不丢弃,应当在队列长度达到某个值得警惕的数值时(即拥塞刚有征兆时)就主动丢弃到达的分组。注意"主动"指提前动手,不是丢得更多——收益在早(早提醒发送方)和散(只惊动个别连接)。
RED 的三条规则与它的现状(想把 AQM 的具体实现看一遍时展开)
随机早期检测 RED 是流行多年的一种 AQM 实现:路由器维持队列长度最小门限与最大门限两个参数,每来一个分组先按规定算法算出当前的平均队列长度,然后三选一——
| 平均队列长度 | 动作 |
|---|---|
| 小于最小门限 | 放入队列正常排队 |
| 超过最大门限 | 丢弃新到达的分组 |
| 介于两个门限之间 | 按某一丢弃概率 |
三个设计要点:① 判据是"平均"队列长度,不是瞬时长度——瞬时长度会因突发流量剧烈抖动,拿它做判据会把正常的短暂排队误判成拥塞,取平均等于加了个低通滤波;② 中间区间必须是"随机"的——若改成"一律丢"就等于把尾部丢弃的门限提前、全局同步照样发生,随机地丢才能让被惊动的连接分散开,而且一条连接占的流量越大、分组越多,被选中的概率越高,惩罚天然按流量分摊;③ 丢弃概率
多年的实践证明 RED 的使用效果并不太理想,RFC 7567 已把过去的 RFC 2309 列为"陈旧的"并不再推荐使用 RED;但对路由器进行主动队列管理 AQM 仍然是必要的,替代算法尚无一种成为 IETF 标准。被否掉的是 RED 这个具体算法,不是 AQM 这个思路。
落点是:尾部丢弃发出的是"又猛又集中"的信号,AQM 发出的是"又早又分散"的信号。TCP 的四个算法一个字都没改,仅仅换一下路由器的丢弃策略,全网的表现就会明显不同——这是"拥塞控制是全局问题、涉及所有路由器"最具体的一个例证。
六、路由协议两大类(通论)
前面第四节讲的是"路由表怎么用",路由表本身是谁算出来的,就是路由协议的事。按算法思路分三类,后面几篇分别展开:
| 类型 | 思路一句话 | 代表 | 收敛 | 适用 |
|---|---|---|---|---|
| 距离向量 DV | 邻居告诉我"它到目的多远",我加上"到邻居多远"再取最小 | RIP | 慢,有无穷计数 | 小型 AS |
| 链路状态 LS | 每台把自己的链路状态洪泛到全域,各自跑 Dijkstra | OSPF | 快 | 中大型 AS |
| 路径向量 PV | 不只带距离,还带完整的 AS 序列,用来防环和做策略 | BGP | 慢但稳 | AS 之间 |
本节小结
- 网络层把"送分组"拆成两个时间尺度:路由在控制面、多台协同、秒级;转发在数据面、单台查表、微秒级——理由是两者的数据结构优化目标相反。IP 用"统一地址 + 统一分组格式 + 统一尽力而为语义"抹平底层差异,配合分片、ARP、重新封装;统一在网络层而非链路层,是因为只有 IP 地址端到端不变。
- 数据报与虚电路分歧的技术根是"转发决策每包做一次还是建连时做完",头部长度、有无状态、会不会失序、故障影响范围的全部差异都由它派生;虚电路固定路径但不预留带宽。互联网把可靠性下放给端系统这一个决定,推出了 TCP 的序号、确认重传、IP 校验和只覆盖首部、路由器丢包不算 bug 这一整串结论。最长前缀匹配先"与"筛命中项、再取掩码最长;聚合要求下一跳相同、前缀全同且低位取遍所有组合。
- 拥塞是"需求之和 > 可用资源"的全局现象,核心洞见是分组丢失是征兆不是原因——加大缓存只会把丢包换成无限排队加重传泛滥,提升单个部件只会让瓶颈搬家。拥塞控制与流量控制的分野是"全局 vs 两方",方法分开环与闭环。因特网把网络层做薄、由 TCP 承担主要责任,路由器丢包就是发给端系统的隐式拥塞信号;而"什么时候丢、丢谁"是网络层能调的旋钮——尾部丢弃成片地丢造成全局同步,AQM 提前而分散地丢是解法。
考点速记
本节在真题里被考过的形式有六种,其中四种围绕同一个动作:拿目的地址去路由表里比一遍。
① 路由器功能里混进一条假的(cn-2012-37)。四个陈述选正确的组合,答案是 Ⅰ、Ⅱ、Ⅳ。要判掉的是 Ⅲ——"对收到的 IP 分组头进行差错校验,确保传输的 IP 分组不丢失"。前半句对(IP 首部确实有校验和,路由器逐跳重算),后半句直接违背 IP 的尽力而为语义:校验只保证首部没被改错,校验失败的处理恰恰是丢弃,而不是保证不丢。Ⅱ"监测到拥塞时合理丢弃 IP 分组"反而是对的——丢分组是拥塞控制的正常动作。
② 虚电路的哪条叙述是错的(cn-2020-34)。四个选项里三条都对(保证顺序、建立时要选路、按 VCID 转发),错的是"需要为每条虚电路预分配带宽"。虚电路固定路径不固定带宽,带宽仍是统计复用——这正是第三节反复按住的那条。
③ 三条路由同时命中走哪个接口(cn-2015-38)。路由表里有 169.96.40.0/23、/25、/27 三条前缀相同、长度不同的路由,外加一条 0.0.0.0/0,问目的地址 169.96.40.5 走哪个接口。第四字节 /27 的第一个块(0~31)内,三条全部命中,取最长的 /27 → S3。这道题把默认路由也放进来,就是在验"默认路由不是另开一趟查询"。
④ 缺一条路由该补什么(cn-2011-37)。R1 只有到 192.168.1.0/24 的路由,R2 后面挂着 192.168.2.0/25 和 192.168.2.128/25 两个子网,问 R1 该加哪一条。两个 /25 前 24 位全同、第 25 位取遍 0 和 1,恰好可以聚合成 192.168.2.0/24,所以掩码填 255.255.255.0。下一跳必须填 192.168.1.2(R2 在共享网段上的接口),不是 192.168.1.1(R1 自己的接口)——四个选项正是按"掩码对不对 × 下一跳填谁"两两组合出来的。
⑤ 给一张拓扑,写出整张路由表(cn-2009-47,9 分)。这道题把网络层的三种表项一次考全:先把 202.118.1.0/24 按"每个局域网 ≥ 120 个地址"划成两个 /25(0.0.0.0/0 默认路由去互联网。第 (3) 问反过来考聚合:两个 /25 在 R2 侧下一跳相同,合并成一条 202.118.1.0/24。
⑥ 链路断了以后重算,充分聚合后剩几条(cn-2026-37)。这道题把"最短路径重算"和"聚合的两个条件"叠在一起。R1–R2 断开后重跑 Dijkstra,四个子网的下一跳变成 .0/27 → R3、.32/27 → R3、.64/27 → R4、.128/25 → R4。逐对检查:前两条下一跳相同、且 .0 与 .32 在 /26 下正好填满 → 合成 199.10.20.0/26;后两条下一跳虽然也相同,但 .64 与 .128 中间隔着 .96~.127,不连续,不能合。于是聚合后 3 条 + 默认路由 1 条 + S4 上那台主机的 /32 特定主机路由 1 条 = 5 条。
易错:"路由器对首部做差错校验"不等于"保证分组不丢失"。 校验失败的处理就是丢弃。凡是把 IP 说成"确保""保证"的选项,先怀疑。
易错:虚电路固定路径,不预留带宽。 预分配带宽、独占信道是电路交换的性质。
易错:最长前缀匹配的两步不能颠倒。 先"与"出命中项,再比掩码长度;不是先按长度排序再逐条试。
易错:默认路由
0.0.0.0/0参与同一次匹配,只是掩码长度为 0 排最后,不是"查不到再查它"的第二趟。
易错:下一跳填的是对端路由器的接口地址,不是本机接口地址。 这是路由表题最集中的失分点。
易错:聚合要同时满足"下一跳相同"和"前缀连续且填满"。
.64/27和.128/25下一跳相同也合不了——中间空着.96~.127,强行合并等于宣称一段并不存在的网络可达。
易错:统计路由条目数时别漏掉默认路由和特定主机路由。 拓扑图里画了云形的 Internet,就意味着有一条
0.0.0.0/0。
易错:分组丢失是拥塞的征兆不是原因,加大缓存换来的是无限排队加重传泛滥,提升单个部件只会让瓶颈搬家。
易错:全局同步的根因是"成片地丢",不是"丢得多"。 一次队列溢出同时打击几十条 TCP 连接,把它们的相位敲齐。
教材出处
- 谢希仁《计算机网络》(第 8 版)5.8.1 拥塞控制的一般原理,印刷版 p238–p241:
- 拥塞的定义与不等式见 p238——"若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏。这种情况就叫作拥塞(congestion)"。
- "简单地扩大缓存的存储空间同样会造成网络资源的严重浪费,因而解决不了网络拥塞的问题",同页 p238;同页还给出"问题的实质往往是整个系统的各个部分不匹配。只有所有的部分都平衡了,问题才会得到解决",以及"拥塞引起的重传并不会缓解网络的拥塞,反而会加剧网络的拥塞"。
- 拥塞控制与流量控制的区别见 p238–p239——"拥塞控制是一个全局性的过程,涉及所有的主机、所有的路由器,以及与降低网络传输性能有关的所有因素";"流量控制往往是指点对点通信量的控制,是个端到端的问题(接收端控制发送端)"。1000 Gbit/s 光纤配巨型机与个人电脑、1 Mbit/s 网络接 1000 台计算机这两个反例同在 p239。
- 吞吐量-提供的负载曲线(图 5-23)与轻度拥塞 / 拥塞 / 死锁三个区段的解读见 p239–p240——"当提供的负载达到某一数值时,网络的吞吐量反而随提供的负载的增大而下降,这时网络就进入了拥塞状态";"网络的吞吐量就下降到零,网络已无法工作,这就是所谓的死锁(deadlock)"。
- 开环控制与闭环控制的划分、闭环三步骤、监测指标(被丢弃分组百分数、平均队列长度、超时重传的分组数、平均分组时延、分组时延的标准差)、以及"分组的丢失是网络发生拥塞的征兆而不是原因",全部在 p240;"过于频繁地采取行动……会使系统产生不稳定的振荡"与"选择正确的时间常数是相当困难的"在 p241。
- 谢希仁《计算机网络》(第 8 版)5.8.3 主动队列管理 AQM,印刷版 p245–p246:
- 尾部丢弃的定义在 p245——"路由器的队列通常都按照'先进先出'FIFO(First In First Out)的规则处理到来的分组。由于队列长度总是有限的,因此当队列已满时,以后再到达的所有分组……将都被丢弃。这就叫作尾部丢弃策略(tail-drop policy)";该节开头也点明"网络层的策略对 TCP 拥塞控制影响最大的就是路由器的分组丢弃策略"。
- 全局同步的完整推理在 p246——"路由器的尾部丢弃往往会导致一连串分组的丢失,这就使发送方出现超时重传,使 TCP 进入拥塞控制的慢开始状态……若发生了路由器中的尾部丢弃,就可能会同时影响到很多条 TCP 连接,结果使这许多 TCP 连接在同一时间突然都进入到慢开始状态。这在 TCP 的术语中称为全局同步(global synchronization)";"全局同步使得全网的通信量突然下降了很多,而在网络恢复正常后,其通信量又突然增大很多"。
- AQM 的"主动"与 RED 的三条规则同在 p246——"所谓'主动'就是不要等到路由器的队列长度已经达到最大值时才不得不丢弃后面到达的分组……应当在队列长度达到某个值得警惕的数值时(即当网络拥塞有了某些拥塞征兆时),就主动丢弃到达的分组";"实现 RED 时需要使路由器维持两个参数,即队列长度最小门限和最大门限。当每一个分组到达时,RED 就按照规定的算法先计算当前的平均队列长度",随后给出低于最小门限排队、超过最大门限丢弃、介于两者之间按概率
丢弃三条;"让拥塞控制只在个别的 TCP 连接上进行,因而避免发生全局性的拥塞控制"。 - RED 的现状同在 p246——"多年的实践证明,RED 的使用效果并不太理想。因此,……公布的 RFC 7567 已经把过去的 RFC 2309 列为'陈旧的',并且不再推荐使用 RED。对路由器进行主动队列管理 AQM 仍是必要的";"最难处理的就是丢弃概率
的选择,因为 并不是个常数"。
- 谢希仁《计算机网络》(第 8 版)4.1.1 网络层提供的两种服务,印刷版 p115–p116:
- 争论的实质在 p115——"在计算机通信中,可靠交付应当由谁来负责?是网络还是端系统?";同页说明主张由网络负责的一方"借助于电信网的成功经验……当两台计算机进行通信时,也应当先建立连接(但在分组交换中是建立一条虚电路 VC)"。
- 互联网相反选择的理由与后果在 p116——"计算机网络的端系统是有智能的计算机。计算机有很强的差错处理能力(这点和传统的电话机有本质上的差别)";"互联网采用的设计思路是这样的:网络层要设计得尽量简单,向其上层只提供简单灵活的无连接的、尽最大努力交付的数据报服务";"每一个分组(也就是 IP 数据报)独立发送,与其前后的分组无关(不进行编号)。网络层不提供服务质量的承诺。也就是说,所传送的分组可能出错、丢失、重复和失序(即不按序到达终点),当然也不保证分组交付的时限";"这就使网络中的路由器比较简单,且价格低廉……如果主机(即端系统)进程之间需要进行可靠的通信,那么就由主机中的运输层负责(包括差错处理、流量控制等)"。
- 图 4-1「网络层提供的两种服务」在 p115,书上带 (a)(b) 两幅,本篇两幅都用了。
- 谢希仁《计算机网络》(第 8 版)4.6.5 路由器的构成,印刷版 p176:转发表与路由表的区别——"路由表一般仅包含从目的网络到下一跳(用 IP 地址表示)的映射,而转发表是从路由表得出的。转发表必须包含完成转发功能所必需的信息",并说明"路由表总是用软件实现的,但转发表则可用特殊的硬件来实现";同页还给出"'转发'仅仅涉及一个路由器,但'路由选择'则涉及很多路由器"。
相关知识
网络体系结构与参考模型|三种交换方式|路由算法:距离向量 vs 链路状态|路由器与三层转发|IP 编址与子网划分|SDN 软件定义网络|TCP 拥塞控制