408 · 计算机网络 · 第 4 章 · 分量 ★★★★★

跨过很多个网络,把分组送到目的主机

计网大题的主场。核心就是三件事:地址怎么分(子网与 CIDR)、分组怎么走(路由表与转发)、路由表怎么来(路由协议)。

这一章只要会:

  1. IP 首部字段与分片
  2. 子网划分、CIDR、路由聚合
  3. 最长前缀匹配与转发过程
  4. ARP、DHCP、ICMP、NAT 各干什么
  5. RIP、OSPF、BGP 对比
一 · 主线

地址怎么分,分组怎么走,路由表怎么来

各种网络格式不一样,怎么连起来 IP 数据报

做法
所有网络都用统一的 IP 数据报格式。某段链路装不下,就在路由器上分片

每台主机怎么标识 子网与 CIDR

分类地址
网络号长度固定为 8、16、24 位,太浪费
子网划分
从主机号里借几位当子网号
CIDR
不再分类,用"/前缀长度"表示网络号有几位,还能把多个网络聚合成一个

路由器拿到分组,往哪发 转发

做法
查路由表,选前缀匹配最长的那一项,交给对应的下一跳

光有 IP 还不够

ARP
知道 IP,要查出 MAC 才能封帧
DHCP
主机一开机,自动拿到 IP 地址
ICMP
出错了要通知源主机
NAT
地址不够用,多台主机共用一个公网地址

路由表是怎么算出来的 路由协议

做法
自治系统内部用 RIP 或 OSPF,自治系统之间用 BGP
三 · 重点

子网、CIDR、路由聚合

所有计算都是同一个动作:把 IP 地址写成二进制,按前缀长度切成"网络部分"和"主机部分"。

例:172.16.84.200/20 属于哪个网络

/20 表示前 20 位是网络号,切在第三个字节的中间 84 = 0101 | 0100 主机位全填 0 → 网络地址 0101 0000 = 80 → 172.16.80.0/20 主机位全填 1 → 广播地址 0101 1111 = 95 → 172.16.95.255 主机位 12 位 可分配地址 = 2¹² − 2 = 4094 个 子网掩码 255.255.240.0

为什么要减 2

  • 主机号全 0:表示这个网络本身
  • 主机号全 1:表示这个网络的广播地址

这两个地址都不能分给主机。路由器的接口也要占一个地址。

特殊地址

  • 127.x.x.x:环回测试,不会发到网络上
  • 0.0.0.0:本主机还没有地址时用作源地址
  • 255.255.255.255:本网络广播,路由器不转发
  • 私有地址:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16,上公网要经过 NAT

子网划分

等长:192.168.1.0/24 分成 4 个子网

4 个子网要借 2 位,前缀变成 /26 192.168.1.0/26 192.168.1.64/26 192.168.1.128/26 192.168.1.192/26 每个子网主机位 6 位 每个子网 2⁶ − 2 = 62 台

变长:分别要 100、50、20、20 台

先分最大的,每次找够用的最小块 100 台 → 7 位主机 → 192.168.1.0/25 50 台 → 6 位主机 → 192.168.1.128/26 20 台 → 5 位主机 → 192.168.1.192/27 20 台 → 5 位主机 → 192.168.1.224/27

7 位主机可容纳 126 台,6 位 62 台,5 位 30 台。

路由聚合与最长前缀匹配

聚合:找公共前缀

把 172.18.129.0/24、172.18.130.0/24、172.18.132.0/24、172.18.133.0/24 聚合成一条。

前两个字节相同,看第三个字节 129 = 10000001 130 = 10000010 132 = 10000100 133 = 10000101 公共部分 5 位,前缀 = 16 + 5 = 21 聚合结果 172.18.128.0/21

查表:选匹配最长的

目的网络下一跳
172.16.0.0/16R1
172.16.8.0/22R2
172.16.10.0/24R3
0.0.0.0/0R4(默认路由)
172.16.10.5 → 三项都匹配,选 /24 → R3 172.16.9.1 → 匹配 /16 和 /22 → R2 172.16.20.1 → 只匹配 /16 → R1 8.8.8.8 → 都不匹配 → R4
四 · 重点

一个分组是怎么走的

大题最常问:分组经过每一段链路时,帧里的 MAC 地址和 IP 地址分别是什么。

主机发送

  1. 用自己的子网掩码判断:目的 IP 和我在不在同一个网络
  2. 在:用 ARP 查出目的主机的 MAC,直接发给它
  3. 不在:用 ARP 查出默认网关的 MAC,发给网关

路由器转发

  1. 拆开帧,取出 IP 数据报
  2. TTL 减 1,重算首部检验和
  3. 查路由表(最长前缀匹配),得到下一跳
  4. 用 ARP 查出下一跳的 MAC,重新封帧发出去
H1 经路由器 R 发给 H2源 MAC目的 MAC源 IP目的 IP
H1 → R 这一段H1R 的入口H1H2
R → H2 这一段R 的出口H2H1H2

IP 地址从头到尾不变,MAC 地址每一段都换。唯一的例外是经过 NAT 时,源 IP 会被换成路由器的公网地址。

五 · 四个配套协议

每个记住"干什么 + 怎么发"

ARP:IP 地址 → MAC 地址

  • 请求是广播,响应是单播
  • 只能在同一个局域网内使用,不能跨路由器
  • 目的主机在别的网络时,ARP 查的是网关的 MAC

DHCP:自动分配 IP 地址

  • 四步:发现 → 提供 → 请求 → 确认
  • 应用层协议,基于 UDP(服务器 67,客户 68)
  • 客户机还没有地址,所以用广播:源 0.0.0.0,目的 255.255.255.255

ICMP:报告差错、探测网络

  • 直接封装在 IP 数据报里(协议字段 = 1)
  • 差错报文:终点不可达、时间超过(TTL 减到 0)、参数问题、改变路由
  • ping 用的是回送请求和回答;traceroute 靠 TTL 逐次加 1 触发"时间超过"

NAT:私有地址 ↔ 公网地址

  • NAT 表记录"内网 IP + 端口 ↔ 公网 IP + 端口"
  • 出去时换源地址和源端口,回来时按表换回去
  • 要改端口,所以它同时用到了网络层和传输层的信息
六 · 重点

三个路由协议

RIPOSPFBGP
用在哪自治系统内部自治系统内部自治系统之间
算法距离向量链路状态路径向量
和谁交换只和相邻路由器向本区域所有路由器洪泛相邻自治系统的发言人
交换什么自己的整张路由表自己和各个邻居之间的链路状态到各网络的完整路径
什么时候每 30 秒一次链路状态变化时有变化时
用什么传UDP直接用 IPTCP
特点以跳数为距离,最多 15 跳,16 表示不可达;好消息传得快,坏消息传得慢每个路由器都有全网拓扑,用 Dijkstra 算最短路径;收敛快只求能到达且不兜圈子,不求最优

RIP 怎么更新路由表

收到邻居 X 发来的路由表后,先把每一项的距离加 1、下一跳改成 X,再逐项和自己的表比较:

  1. 自己没有这个目的网络 → 添加
  2. 有,而且下一跳本来就是 X → 无条件替换(以最新消息为准,哪怕距离变大)
  3. 有,下一跳不是 X → 新距离更小才替换

例:路由器 B 收到邻居 C 的路由表

目的网络B 原来的C 发来的(加 1 后)B 更新后原因
N17,经 A没有7,经 A没有新消息
N22,经 C55,经 C下一跳相同,必须更新
N3没有99,经 C新的目的网络
N68,经 F55,经 C距离更小
N84,经 E44,经 E距离一样,不换
N94,经 F64,经 F距离更大,不换
七 · 易错速记

选择题直接对表

一总、八片、首四总长度 1 B,片偏移 8 B,首部长度 4 B。
可分配主机数要减 2去掉全 0 的网络地址和全 1 的广播地址。
IP 不变,MAC 每段换经过 NAT 时源 IP 才会变。
ARP 不能跨网络目的在别的网络,帧的目的 MAC 是默认网关的。
分片可以在路上做,重组只在终点做每个分片都有完整的 IP 首部。
检验和只管首部数据部分对不对,由传输层自己检查。
RIP 用 UDP,OSPF 直接用 IP,BGP 用 TCPRIP 和 BGP 在应用层,OSPF 在网络层。
RIP 下一跳相同就无条件更新哪怕新距离更大,因为这是最新的消息。
路由器不转发的分组目的地址是 255.255.255.255 的广播;互联网上的路由器也不转发目的地址是私有地址的分组。
默认路由是 0.0.0.0/0前缀长度为 0,永远能匹配,但优先级最低。
八 · 看一眼就行

这些不用花时间

九 · 自测

先自己做,再点开看

主机 IP 地址是 192.168.5.130/26。它所在网络的网络地址、广播地址、可分配主机数各是多少?
130 = 10 | 000010 网络地址 192.168.5.128 广播地址 192.168.5.191 可分配 2⁶ − 2 = 62 个
一个总长 3020 B(首部 20 B)的数据报,经过 MTU 为 1020 B 的链路。分成几片?每片的片偏移和 MF 是多少?
数据 3000 B,每片最多 1000 B → 3 片 片偏移:0、125、250 MF:1、1、0
把 10.1.8.0/24、10.1.9.0/24、10.1.10.0/24、10.1.11.0/24 聚合成一条路由。
8 = 000010|00,11 = 000010|11,公共 6 位 聚合结果 10.1.8.0/22
主机 A 给另一个网络里的主机 B 发数据。A 发出的帧,目的 MAC 地址和目的 IP 地址分别是谁的?

目的 MAC 是默认网关的,目的 IP 是主机 B 的。

RIP:路由器 R 到网络 N 的距离是 5,下一跳是 X。现在收到 X 的通告,说 X 到 N 的距离是 7。R 怎么处理?

下一跳本来就是 X,无条件更新:距离改为 8,下一跳仍是 X。