网络层转发分组的过程
前两页的地址、掩码、前缀,最后都要落到一件事上:一个分组到了一台主机或路由器手里,下一步交给谁。 本页把这件事写成完整的算法,并补上两种特殊路由(特定主机路由、默认路由)。
这是本章综合题的主干。 历年大题几乎都包含”主机该把分组直接发给目的主机还是发给网关、帧里的目的 MAC 地址填谁”这一步,本页的错题正是这一步。
机制
转发表里只有两样东西
分组转发都是基于目的主机所在网络的,这是因为互联网上的网络数远小于主机数,这样可以极大地压缩转发表的大小。当分组到达路由器后,路由器根据目的 IP 地址的网络前缀来查找转发表,确定下一跳应当到哪个路由器。因此,在转发表中,每条路由必须有下面两条信息:
采用 CIDR 编址时,若一个分组在转发表中可以找到多个匹配的前缀,则应当使用最长前缀匹配。为了更快地查找转发表,可以按照前缀的长短,将前缀最长的排在第 1 行,按前缀长度的降序排列。这样,从第 1 行最长的开始查找,只要检索到匹配的,就不必再继续查找。
两种特殊的路由
- 特定主机路由(2009):对特定目的主机的 IP 地址专门指明一个路由,以方便网络管理员控制和测试网络。若特定主机的 IP 地址是 a.b.c.d,则转发表中对应项的目的网络是 a.b.c.d/32。/32 表示的子网掩码没有意义,但这个特殊的前缀可以用在转发表中。
- 默认路由(2009、2014):用特殊前缀 0.0.0.0/0 表示默认路由,全 0 掩码和任何目的地址进行按位与运算,结果必然为全 0,即必然和前缀 0.0.0.0/0 相匹配。只要目的网络是其他网络(不在转发表中),就一律选择默认路由。默认路由通常用于路由器到互联网的路由:互联网包括无数的网络集合,不可能在路由表项中一一列出,因此只能采用默认路由的方式。
特定主机路由条目的匹配优先级最高,默认路由条目的匹配优先级最低。 这正是最长前缀匹配的两个端点:/32 最长,/0 最短。
路由器的分组转发算法
- 从收到的 IP 分组的首部提取目的主机的 IP 地址
(目的地址)。 - 若查找到特定主机路由(目的地址为
),则按照这条路由的下一跳转发分组;否则从转发表中的下一条(按前缀长度的顺序)开始检查,执行步骤 3。 - 将这一行的子网掩码与目的地址
逐位”与”。若运算结果与本行的前缀匹配,则查找结束,按照”下一跳”指出的进行处理(或者直接交付本网络上的目的主机,或通过指定接口发送到下一跳路由器);否则,若转发表还有下一行,则对下一行进行检查,重新执行步骤 3;否则,执行步骤 4。 - 若转发表中有一个默认路由,则把分组传送给默认路由;否则,报告转发分组出错(由 ICMP 向源主机发送终点不可达报文,4.2.7)。
flowchart TD S["取出目的地址 D"] --> H{"有特定主机路由 D/32?"} H -- 是 --> F1["按该路由的下一跳转发"] H -- 否 --> L{"按前缀长度降序逐行:<br/>D AND 掩码 = 本行前缀?"} L -- 匹配 --> F2["直接交付,或发往下一跳"] L -- 全部不匹配 --> Dft{"有默认路由 0.0.0.0/0?"} Dft -- 是 --> F3["发往默认路由的下一跳"] Dft -- 否 --> E["丢弃,报告转发出错"]
值得注意的是,转发表(或路由表)并没有给分组指明到某个网络的完整路径(先经过哪个路由器,后经过哪个路由器等)。转发表指出,到某个网络应当先到某个路由器(下一跳路由器),到达下一跳路由器后,再继续查找其转发表,知道再下一步应当到哪个路由器。这样一步一步地查找下去,直到到达目的网络。
主机一侧:直接交付还是交给默认网关
主机没有完整的转发表,它做的是转发算法的一个简化版:用自己的子网掩码分别与自己的 IP 地址和目的 IP 地址相与——
- 结果相同:目的主机在本子网,直接交付,帧的目的 MAC 地址是目的主机的 MAC 地址;
- 结果不同:目的主机不在本子网,交给默认网关,帧的目的 MAC 地址是默认网关(路由器接口)的 MAC 地址,IP 数据报的目的地址仍是最终的目的主机。
IP 地址不变,MAC 地址逐跳改变
得到下一跳路由器的 IP 地址后,并不是直接将该地址填入待发送的数据报,而是将该 IP 地址转换成 MAC 地址(通过 ARP,4.2.5),将此 MAC 地址填入 MAC 帧首部,然后根据这个 MAC 地址找到下一跳路由器。在不同网络中传送时,MAC 帧的源地址和目的地址要发生变化;IP 数据报首部中的源地址和目的地址则自始至终不变(NAT 除外,4.2.2)。
边界
判断”是否同一子网”用的是发送方自己的掩码。 题目通常只给出发送方的地址和掩码,不必知道对方的掩码;把两个地址与同一个掩码相与即可。
同一子网的判断看的是整个网络前缀,不是前三个字节。 掩码是 255.255.240.0 时,前缀只有 20 位,第三字节只看高 4 位;第三字节的值不同,两台主机也可能在同一子网里。
错题复盘:掩码 255.255.240.0 下,211.71.136.23 与 211.71.130.25 在同一子网,帧直接发给乙
王道 4.2.8 第 43 题:某以太网中,甲的 IP 地址为 211.71.136.23,子网掩码为 255.255.240.0,已知网关地址为 211.71.136.1。若甲向乙(IP 地址为 211.71.130.25)发送一个 IP 分组,则(A. 该分组封装成帧后直接发送给乙,帧中目的 MAC 地址为网关的 MAC 地址 B. 该分组封装成帧后直接发送给乙,帧中目的 MAC 地址为乙的 MAC 地址 C. 该分组封装成帧后交由网关转发,帧中目的 MAC 地址为网关的 MAC 地址 D. 该分组封装成帧后交由网关转发,帧中目的 MAC 地址为乙的 MAC 地址)。答案 B。
先判断乙和甲是否在同一个子网内。掩码第三字节 240 = 11110000,只看第三字节的高 4 位:136 = 10001000,130 = 10000010,高 4 位相同。甲、乙的网络前缀都是 211.71.128.0/20,在同一个子网内,直接交付,无须经过网关,帧的目的 MAC 地址为乙的 MAC 地址。
网关地址 211.71.136.1 与甲的前三个字节相同,而乙的第三字节是 130,这是诱导选 C 的地方。A、D 本身就前后矛盾:直接发给乙却填网关的 MAC 地址,交给网关却填乙的 MAC 地址。
下一跳地址不写进 IP 数据报。 它只用来经 ARP 求出 MAC 地址,然后写进帧首部。
默认路由匹配任何地址,但只在其他表项都不匹配时才用。 它的前缀长度为 0,在最长前缀匹配中永远排最后。
口径差异:路由器怎样查最长前缀
教材口径:把转发表按前缀长度降序排列,从第 1 行开始逐行”与”掩码、比较,第一个匹配的就是最长前缀匹配。
工程口径:逐行比较只是原理说明。高速路由器用二叉线索(及其压缩变体)或专用的三态内容寻址存储器(TCAM)在一次查找中得出最长匹配,查找时间与表项数无关(线卡上的实现见 4.7.2)。
做题时按教材的逐行法手算即可,结果与硬件实现一致。
对照速查
| 说法 | 对错 |
|---|---|
| 转发表中每条路由至少包含目的网络地址和下一跳地址 | ✅ |
| 转发表指明了到达目的网络的完整路径 | ❌ |
| 特定主机路由的前缀是 /32 | ✅ |
| 默认路由的前缀是 0.0.0.0/0,匹配优先级最高 | ❌(最低) |
| 多个表项匹配时选前缀最长的 | ✅ |
| 下一跳路由器的 IP 地址要写入 IP 数据报首部 | ❌(经 ARP 求 MAC,写入帧首部) |
| 分组经过路由器后,IP 数据报的源地址和目的地址不变 | ✅(不经过 NAT 时) |
| 分组经过路由器后,MAC 帧的源地址和目的地址不变 | ❌ |
| 目的主机不在本子网时,帧的目的 MAC 地址是目的主机的 MAC 地址 | ❌(默认网关的) |
考点
- 转发表项 =(目的网络,下一跳);最长前缀匹配
- 特定主机路由 /32(2009);默认路由 0.0.0.0/0(2009、2014)
- 四步转发算法;找不到又无默认路由则报错
- 主机:同子网直接交付,否则交给默认网关
- IP 地址端到端不变,MAC 地址逐跳改变
链接
- 🏠 返回总览:计算机网络第 4 章:网络层总览
- ⬅️ 上一节:4.2.3 CIDR 与路由聚合
- ➡️ 下一节:4.2.5 地址解析协议 ARP
- 🔗 4.2.3 子网掩码与默认网关
- 🔗 4.7.3 路由表与分组转发
- 📖 名词库:第 4 章名词库