可以把网络世界想象成一张巨大的交通网,路由就是这张网里的导航系统。
第一部分:基础概念------路由是什么,为什么需要它?
1.1 没有路由,寸步难行
你的电脑(192.168.1.5)想给公司服务器(10.0.0.20)发一个"你好"的数据包。它们不在同一个"小区"(网络)里。
-
你的电脑只知道自己的小区:它会检查目标地址10.0.0.20,发现这不是我们小区的(不在192.168.1.0/24网段)。
-
直接喊话没用:在局域网里靠吼(ARP广播)能找到同小区的伙伴,但服务器不在,喊破喉咙也没人应。
-
必须有人指路 :这时需要一个懂路况的家伙站出来,告诉你:"去那个地方,得先经过我。" 这个家伙就是网关,通常是路由器在你这里的接口。
1.2 路由的核心定义
路由就是为数据包选择一条从源地址到目的地址的传输路径,并交给下一站的过程。拆开看两个动作:
1)、寻径(Routing / Route Selection)------解决"走哪条路最好"
目的 :明确数据包从源到目的地址应走的最优路径,这是路由决策的第一步。
定义要点:
-
寻径 = 判定到达目的地址的最佳路径。
-
实现方式:由路由选择算法完成。
-
关键依赖:必须启动并维护路由表,该表包含网络拓扑与下一跳的匹配信息。
-
数据来源:路由选择算法收集网络中各种路由信息,动态填充路由表。
-
工作机制:路由器收到IP数据报 → 解析目的IP地址 → 查路由表 → 匹配"目的网络 + 下一跳" → 做出路由决策。
-
协议支持:不同路由器间通过路由选择协议交换信息,保持路由表同步更新,以适应网络变化。
-
典型协议举例:RIP、OSPF(开放式最短路径优先)、BGP(边界网关协议)等。
2)、转发(Forwarding / Packet Forwarding)------解决"怎么把包送出去"
目的:依据已确定的最佳路径,将数据分组实际传送至下一跳(路由器或主机)。
课本定义要点:
-
转发 = 沿已判定好的最佳路径传送信息分组。
-
工作流程:
① 路由器查路由表 → 判断是否知道如何送达下一跳;
② 若不知 → 通常丢弃分组;
③ 若知道 → 按路由表对应条目,将分组发送至下一跳;
④ 若目的网络直连 → 直接发送给目的主机。
-
协议归属:这一过程属于路由转发协议(Routed Protocol),如IP协议本身。
-
与寻径关系:
→ 路由转发协议使用路由选择协议维护的路由表;
→ 路由选择协议依赖转发协议传递自己的控制报文(如Hello包、LSA、Update等)。
二、路由表深度剖析
路由表是路由器中至关重要的一部分,它就像一张"地图",决定了数据包在网络中的传输路径。
3.1 什么是路由表?
路由器的主要工作就是为经过路由器的每个数据包寻找一条最佳路径,并将该数据包沿着最佳路径有效地传送到目的站点。为了完成这项工作,路由器中保存着各种传输路径的相关数据------路由表,供路由选择时使用。
值得注意的是,不仅是路由器,Internet中的每一台主机都有路由表。
3.2 路由表的分类
根据其生成方式,路由表可以分为静态路由表和动态路由表两种:
(1)静态路由表
由系统管理员事先设置好的固定的路由表称为静态路由表。它一般在系统安装时,根据网络的配置情况预先设定好,不会随未来网络结构的改变而改变。
特点:
-
手动配置
-
固定不变
-
适合网络结构简单、稳定的环境
(2)动态路由表
动态路由表是指路由器根据网络系统的运行情况自动调整的路由表。路由器根据路由选择协议提供的功能,自动学习和记忆网络运行情况,在需要时自动计算数据传输的最佳路径。
特点:
-
自动学习和更新
-
能适应网络拓扑变化
-
适合大规模、复杂网络
(3)直连路由:天然知道
接口配好IP并激活,路由器就知道自己直连的网络怎么走。
特点:优先级最高,最可信。在表中用 Direct 或 C 表示。
3.3 路由表的结构与字段详解
路由表的基本字段
| 字段 | 含义 | 说明 |
|---|---|---|
| 目的网络 | 目标网络的ID或网络地址 | 标识数据包要去往的网络 |
| 子网掩码 | 32位二进制数 | 与IP地址进行"与"运算来区分网络地址和主机地址 |
| 网关 | 下一跳路由器的入口IP地址 | 数据包下一步要到达的设备 |
| 接口 | 本地路由器的出口IP地址 | 通过哪个接口发送数据 |
| 标志 | 路由状态标识 | U=激活,UG=网关路由,UGH=网关+主机路由 |
| Metric | 跳数/度量值 | 路由首选项,值越小优先级越高 |
关于Metric(跳数)的重要说明
Metric是路由首选项的度量值。通常情况下,如果有多条到达相同目的地址的路由记录,则路由器会采用Metric值最小的那个路由。路由器根据跳数来决定存储在路由表中的路由表项。
3.4 路由表能力
路由表的能力是指路由表中所有路由表项数量 的极限。由于Internet中执行BGP的路由器通常拥有数十万条路由表项,所以该项目也是路由器能力的重要体现。
3.5 直连网络的路由表实现
下面通过表8-3所示的直连网络的路由表实现来介绍如何读懂路由表。
表8-3 直连网络的路由表实现
| 目的网络 | 子网掩码 | 网关 | 标志 | 接口 |
|---|---|---|---|---|
| 201.66.37.0 | 255.255.255.0 | 201.66.37.74 | U | eth0 |
| 201.66.39.0 | 255.255.255.0 | 201.66.39.21 | U | eth1 |
解析:
-
如果一个主机有多个网络接口,当向一个特定的IP地址发送分组时,它根据路由表决定使用哪个接口
-
所有目的网络为
201.66.37.0的主机(IP地址为201.66.37.1~201.66.37.254)的数据通过接口eth0(IP地址为201.66.37.74)发送 -
所有目的网络为
201.66.39.0的主机(IP地址为201.66.39.1~201.66.39.254)的数据通过接口eth1(IP地址为201.66.39.21)发送 -
标志 U 表示该路由状态为up(即激活状态)
3.6 远程网络的路由表实现
表8-3中的主机有两个网络接口:eth0和eth1,IP地址分别为201.66.37.74和201.66.39.21。这两个网络接口分别处在不同的LAN内,而它们所在网络的地址恰恰就是表中第一列中显示的地址(把201.66.37.74和255.255.255.0进行"与"运算可得到201.66.37.0,同理可得201.66.39.0)。
那么,远程网络的路由条目如何表示呢?假如通过IP地址为201.66.37.254的网关连接到网络73.0.0.0,那么可以在路由表中增加以下表项:
表8-4 远程网络的路由表实现
| 目的网络 | 子网掩码 | 网关 | 标志 | 接口 |
|---|---|---|---|---|
| 73.0.0.0 | 255.0.0.0 | 201.66.37.254 | UG | eth0 |
表8-5 远程主机的路由表表项
| 目的网络 | 子网掩码 | 网关 | 标志 | 接口 |
|---|---|---|---|---|
| 91.32.74.21 | 255.255.255.0 | 201.66.37.254 | UGH | eth0 |
标志UG 表示该路由为激活状态的网关路由,UGH表示激活状态下的网关+主机路由。
3.7 默认路由和环回路由
表8-6 默认路由和环回路由的路由表表项
| 目的网络 | 子网掩码 | 网关 | 标志 | 接口 |
|---|---|---|---|---|
| 127.0.0.0 | 255.0.0.0 | 127.0.0.1 | UG | lo0 |
| Default | 0.0.0.0 | 201.66.39.254 | eth1 |
环回接口(lo0)
第一项是环回接口 ,用于主机给自己发送数据,通常用于测试和运行于IP之上的需要本地通信的应用。这是到环回地址127.*.*.*的主机路由,接口lo0是IP栈内部的"假"网卡。
默认路由(Default)
第二项是一个默认路由。如果在路由表中没有找到与目的地址相匹配的项,则该分组被送到默认网关。
3.8 重叠路由与最长前缀匹配
有时路由表中可能会有重叠项,如下表所示:
表8-7 路由表中出现重叠项
| 目的网络 | 子网掩码 | 网关 | 标志 | 接口 |
|---|---|---|---|---|
| 1.2.3.4 | 255.255.255.255 | 201.66.37.253 | UGH | eth0 |
| 1.2.3.0 | 255.255.255.0 | 201.66.37.254 | UG | eth0 |
| 1.2.0.0 | 255.255.0.0 | 201.66.39.253 | UG | eth1 |
| Default | 0.0.0.0 | 201.66.39.254 | UG | eth1 |
问题 :这4条路由记录都含有地址1.2.3.4。如果向IP地址为1.2.3.4的主机发送数据,路由器会选择哪条路由记录?
答案 :路由器会选择第一条路由记录 ,通过网关201.66.37.253发送数据。
原则 :选择具有最长(最精确)网络前缀 的一项。因为255.255.255.255是最精确的掩码(主机路由),优先级最高。
类似的:
-
对于发往
1.2.3.5的数据,路由器会选择第二条路由记录(掩码255.255.255.0) -
1.2.4.5则会匹配第三条(掩码255.255.0.0) -
都不匹配则走默认路由
1.理解"含有地址"的含义
这句话中的"含有地址"并不是说目的网络等于
1.2.3.4,而是说对于一个给定的目标IP1.2.3.4,在这4条路由表中,它都能被其中任何一条目的网络+掩码所匹配。逐条分析:
目标IP:
1.2.3.4
第一条路由 :
1.2.3.4/32(掩码 255.255.255.255)
这是主机路由,精确匹配
1.2.3.4这一个主机。匹配吗?是的 ,目标IP正好等于
1.2.3.4,完全匹配。第二条路由 :
1.2.3.0/24(掩码 255.255.255.0)
匹配从
1.2.3.0到1.2.3.255的所有地址。目标IP
1.2.3.4在这个范围内吗?是的 (1.2.3.4是1.2.3.0/24网段内的一个IP)。所以也能匹配。
第三条路由 :
1.2.0.0/16(掩码 255.255.0.0)
匹配从
1.2.0.0到1.2.255.255的所有地址。目标IP
1.2.3.4在这个范围内吗?是的 (因为前16位是1.2)。所以也能匹配。
第四条路由 :默认路由
0.0.0.0/0
匹配所有地址(任何IP都能匹配)。
目标IP
1.2.3.4匹配吗?当然能。从集合的角度看,这4条路由的目的网络范围是嵌套的:
1.2.3.4/32(单个地址)⊆
1.2.3.0/24⊆
1.2.0.0/16⊆
0.0.0.0/0(全集)当IP是
1.2.3.4时,它在所有这些网络地址集合中。2.路由器如何选择
根据最长前缀匹配 原则,路由器会选择子网掩码最长 、即最精确的路由。
比较它们的网络前缀长度(掩码中1的位数):
第一条:
/32(最长,最精确)第二条:
/24第三条:
/16第四条:
/0(最短)所以发往
1.2.3.4的数据会选第一条(主机路由)。
一、目标IP 为什么要去和 "目的网络 + 掩码" 匹配?答:因为路由器要判断"这个数据包该发往哪个方向",必须通过"目的IP"与"路由表中每个目的网络+掩码"进行逻辑运算,计算出"这个IP属于哪个网段",从而决定走哪条路。
路由器不直接认识"IP地址",它认识的是"网络段"(即目的网络+子网掩码计算出的网络地址)。所以它必须:
取目标IP(如 1.2.3.4)
与路由表中每一行的"目的网络 + 子网掩码"做 **"按位与运算"**
得到"目标IP所属的网络地址"
与该行"目的网络"比对 → 若相等 → 就匹配上了!
例:
目标IP = 1.2.3.4
路由表某行:目的网络=1.2.3.0,掩码=255.255.255.0
→ 1.2.3.4 & 255.255.255.0 = 1.2.3.0
→ 与目的网络 1.2.3.0 相等 → 匹配!
二、匹配的条件是什么?
答:只要目标IP 与某条路由条目的 "目的网络地址" 相等,就算匹配成功。而"目的网络地址"是通过 "目标IP 与 子网掩码 按位与" 得到的。
🔹 匹配公式:
目标IP & 子网掩码 == 路由表中的"目的网络" → 匹配成功
路由条目 目的网络 子网掩码 目标IP=1.2.3.4 与掩码按位与结果 是否匹配 1.2.3.4/32 1.2.3.4 255.255.255.255 1.2.3.4 & 255.255.255.255 = 1.2.3.4 → 等于目的网络 ✅ 是 1.2.3.0/24 1.2.3.0 255.255.255.0 1.2.3.4 & 255.255.255.0 = 1.2.3.0 → 等于目的网络 ✅ 是 1.2.0.0/16 1.2.0.0 255.255.0.0 1.2.3.4 & 255.255.0.0 = 1.2.0.0 → 等于目的网络 ✅ 是 0.0.0.0/0 0.0.0.0 0.0.0.0 任意IP & 0.0.0.0 = 0.0.0.0 → 等于目的网络 ✅ 是 三、目的网络为什么可以包含"从1.2.3.0到1.2.3.255的所有地址"?难道不能没有吗?
答:因为这是子网划分的本质 ------ 目的网络是"网段"的抽象,不是"单个IP"。只要子网掩码允许,它天然覆盖该网段内所有主机IP。这是IP地址设计的底层逻辑,不能"没有",因为它是路由工作的基础。
举例:1.2.3.0/24
子网掩码 255.255.255.0 → 前24位是网络号,后8位是主机号。
所以这个网段中:
网络地址 = 1.2.3.0(不可用作主机)
广播地址 = 1.2.3.255(不可用作主机)
可用主机地址 = 1.2.3.1 ~ 1.2.3.254
→ 因此,路由表中"目的网络=1.2.3.0/24"这一条,就是代表"所有属于1.2.3.x的主机"都要走这条路。
为什么"不能没有"?
因为如果路由表只能写单个IP(如1.2.3.1、1.2.3.2...),那全球几十亿IP,每条都要存一条路由 ------ 路由表会爆炸,根本不可行。
所以用"网段"来聚合,一个条目管一堆IP ------ 这就是路由设计的精髓:聚合 + 层次化 + 匹配计算
→ 所以,"目的网络"天然就是"一段地址范围",不是"单个地址",除非是主机路由(如 /32)。
3.9 一个经典的CIDR应用场景
假设ISP1被赋予256个C类网络,从213.79.0.0到213.79.255.0。该ISP外部的路由表只用一个表项就描述了所有的路由:网络号为213.79.0.0,子网掩码为255.255.0.0。
现在有一个用户从ISP1处申请到一个网络地址213.79.61.0,假设现在想从ISP1移到ISP2:
-
传统做法的问题:必须从新的ISP处取得新的网络地址,这意味着必须重新配置每台主机的IP地址,改变DNS设置等
-
解决办法 :原来的ISP1保持路由
213.79.0.0(子网掩码255.255.0.0),新的ISP则把路由213.79.61.0(子网掩码255.255.255.0)广播给外部路由器
用户想从 ISP1 移到 ISP2
解决思路:
让用户不换 IP 地址 ,继续用
213.79.61.0/24,但把网络接入点从 ISP1 换到 ISP2。这需要通知互联网的其他路由器 :以后访问
213.79.61.0/24的数据包,请发给 ISP2,而不是 ISP1。
ISP1 的路由保持不变:
在外部(其他自治系统)路由表中,仍有一条
213.79.0.0/16指向 ISP1,这是"聚合路由",包含了
213.79.61.0/24在内。ISP2 额外广播一条更具体的路由:
ISP2 向其他路由器通告一条
213.79.61.0/24的路由,并且声明"我是下一跳"(去往213.79.61.0/24的数据包)。外部路由器遵循"最长匹配"原则:
目标 IP 属于
213.79.61.x时,同时匹配:
213.79.0.0/16(下一跳 ISP1)
213.79.61.0/24(下一跳 ISP2)因为
/24比/16更精确(子网掩码更长),所以优先选 ISP2 的路由。结果
用户网络
213.79.61.0/24的流量,会走 ISP2 这条新路径。而 ISP1的其他 255 个 C 类网络(如
213.79.62.0/24等)的流量,仍走 ISP1。用户不用改 IP 地址,只是换了一个服务商接入。
表8-8 重叠路由
| 目的网络 | 子网掩码 | 网关 | 标志 | 接口 |
|---|---|---|---|---|
| 213.79.0.0 | 255.255.0.0 | 201.66.37.254 | UG | eth0 |
| 213.79.61.0 | 255.255.255.0 | 201.66.39.254 | UG | eth1 |
这里利用了最长前缀匹配 原则:访问213.79.61.0/24的流量会被精确匹配到第二条路由,而其他213.79.x.x的流量则走第一条。
3.10 接口配置特例
把同一主机的两个接口定义在同一子网中在很多路由协议中是不允许的。
表8-9 接口配置特例
| 接口 | IP地址 | 子网掩码 |
|---|---|---|
| eth0 | 201.66.37.1 | 255.255.255.0 |
| eth1 | 201.66.37.2 | 255.255.255.0 |
这里将两个接口配置在同一个网络 中,用于实现网络的负载均衡,但必须有路由协议的支持。
一、为什么能断定是"同一台主机"?
依据:接口命名规则 + 子网归属。
1. 看"身份证"(接口名)
在任何一个网络设备(路由器、服务器、Linux主机)内部:
eth0、eth1、eth2... 是设备给自己网卡编的内部号。关键 :
eth0和eth1能出现在同一张配置表里,说明它们属于同一个系统 。如果是两台不同主机,它们的配置表是独立的,不会把另一台机器的eth0写进来。因为不同主机的配置是独立的,它们之间不存在"共享接口命名"的情况。所以,当你看到"eth0 + eth1 + 同一IP段"的配置表,第一反应是:
"这是在一台设备上给两个网卡配了IP,且这两个IP在同一个网段。"
2. 看"住址"(IP 网段)
eth0 :
201.66.37.1/24→ 在201.66.37.0小区eth1 :
201.66.37.2/24→ 也在201.66.37.0小区结论 :一台设备(主机)的两个"门"(接口),开在了同一个"小区"(子网)里。(或者说:两者网络地址完全相同,说明它们属于同一个广播域(网段))
二、为什么说这是"特例"?
这里容易绕晕,我们区分一下**"物理连接"** 和**"路由逻辑"**。
正常情况(不允许)
在大多数路由协议(如 OSPF、RIP)看来:
同一台设备的两个接口如果在同一网段,设备会"精神分裂":
- 它发个数据包,不知道该从
eth0出去还是eth1出去(因为都在一个网段,路由表里这两条路优先级一样)。这会导致路由环路 或逻辑混乱,所以通常被禁止。
特例情况(允许,但需支持)
目的 :为了实现负载均衡(让流量分摊走两条线)。
虽然物理上两个口在同一个网段,但通过特殊的路由协议或配置(如 ECMP 等价多路径),强行告诉设备:"这两条路都可以走,你轮着用。"
"必须有路由协议的支持" 这句话的意思就是:普通家用路由器干不了这事,得用能跑高级路由协议(如 OSPF、BGP)的专业设备来"兜底"这个逻辑。
3.11 总路由表示例
此时,主机的总路由表包含以下11个表项:
表8-10 总路由表
| 目的网络 | 子网掩码 | 网关 | 标志 | 接口 |
|---|---|---|---|---|
| 127.0.0.0 | 255.0.0.0 | 127.0.0.1 | U | lo0 |
| 201.66.37.0 | 255.255.255.0 | 201.66.37.74 | U | eth0 |
| 201.66.39.0 | 255.255.255.0 | 201.66.39.21 | U | eth1 |
| Default | 0.0.0.0 | 201.66.39.254 | eth1 | |
| 73.0.0.0 | 255.0.0.0 | 201.66.37.254 | UG | eth0 |
| 91.32.74.21 | 255.255.255.0 | 201.66.37.254 | UGH | eth0 |
| 1.2.3.4 | 255.255.255.255 | 201.66.37.253 | UGH | eth0 |
| 1.2.3.0 | 255.255.255.0 | 201.66.37.254 | UG | eth0 |
| 1.2.0.0 | 255.255.0.0 | 201.66.39.253 | UG | eth0 |
| 213.79.0.0 | 255.255.0.0 | 201.66.37.254 | UG | eth0 |
| 213.79.61.0 | 255.255.255.0 | 201.66.39.254 | UG | eth1 |
3.12 另一种路由表示例(Windows风格)
不同的路由器使用的路由表可能有一些差异。例如,路由表的接口表项会关联接口的IP地址,而不使用eth0、eth1这样的标识。有时,各表项的排列顺序也不尽相同。
表8-11 Active Routes(活动路由表)
| Network Destination | Netmask | Gateway | Interface | Metric |
|---|---|---|---|---|
| 0.0.0.0 | 0.0.0.0 | 192.168.123.254 | 192.168.123.88 | 1 |
| 127.0.0.0 | 255.0.0.0 | 127.0.0.1 | 127.0.0.1 | 1 |
| 192.168.123.0 | 255.255.255.0 | 192.168.123.68 | 192.168.123.68 | 1 |
| 192.168.123.0 | 255.255.255.0 | 192.168.123.88 | 192.168.123.88 | 1 |
| 192.168.123.88 | 255.255.255.255 | 127.0.0.1 | 127.0.0.1 | 1 |
| 192.168.123.255 | 255.255.255.255 | 192.168.123.68 | 192.168.123.68 | 1 |
| 192.168.123.255 | 255.255.255.255 | 192.168.123.88 | 192.168.123.88 | 1 |
| 224.0.0.0 | 224.0.0.0 | 192.168.123.88 | 192.168.123.88 | 1 |
| 255.255.255.255 | 255.255.255.255 | 192.168.123.88 | 192.168.123.88 | 1 |
表8-11解析:
| 字段 | 含义 |
|---|---|
| Network Destination | 网络目的地址 |
| Netmask | 子网掩码 |
| Gateway | 下一跳路由器的入口IP地址,也称网关 |
| Interface | 到达该目的地的本地路由器的出口IP地址 |
| Metric | 跳数,越小越优先 |
💡 这里的Interface和Gateway是同一网段的,路由器通过Interface和Gateway定义了到达下一个路由器的链路。
特殊路由项说明
在表8-11中,有几个值得注意的特殊项:
- 包含网络地址
224.0.0.0的两项 :表示对组播的处理路由
组播是将数据包发送给一组特定主机的通信方式,适用于视频会议、在线直播等应用。它与单播(一对一)和广播(一对所有)不同,仅对加入特定组播组的主机进行传输,从而节省网络带宽。路由表中的组播项(如224.0.0.0相关项)用于指导路由器如何转发组播数据包。
-
主机有两个接口 :IP地址分别为
192.168.123.88和192.168.123.68,且处在同一个网段192.168.123.0中,用于实现网络负载均衡 -
255.255.255.255:表示有限广播地址的路由
四、route命令
route命令主要用于手动配置和显示静态路由表。路由表可以由用户手动执行route命令来配置,也可以通过rc脚本在启动时执行;也可以由路由器使用其支持的路由协议提供的功能,根据网络拓扑结构的变化自动生成。
4.1 显示路由表信息
route print
执行后可以显示本机的路由表信息。
输出字段含义:
| 字段 | 含义 |
|---|---|
| 网络目的地址 | 主机路由的网络ID 或网络地址 |
| 子网掩码 | 4字节(32位)的二进制数,用十进制表示;掩码位为1对应IP地址的网络部分,为0对应主机部分 |
| 网关 | 主机或路由器直接连接的网络,转发地址可能是连接到网络的接口地址 |
| 接口 | 将数据包转发到网络ID时所使用的网络接口地址 |
| 跳数 | 路由首选项的度量值,跳数最小的路由是首选路由 |
4.2 常用route命令示例
| 操作场景 | 命令 |
|---|---|
| 显示特定开头的路由 | route print 192.* |
| 添加路由 | route add 10.41.0.0 mask 255.255.0.0 10.27.0.1 |
| 删除指定路由 | route delete 127.0.0.0 |