静态路由探究

1、路由表详解

1.1 什么是路由表?

  路由表(Routing Table) 是存储在路由器或主机中的一张逻辑表,用于描述:

"去往某个目标网络 / 主机,应该从哪个接口发出,交给谁(下一跳)"

  简单一句话:

路由表决定了 IP 数据包"往哪走、从哪走、交给谁"

  路由表中保存的是网络拓扑的抽象结果,它既可以:

  • 由管理员手工配置(静态路由)
  • 也可以由路由协议自动学习(动态路由,如 OSPF、RIP、BGP)

  本文主要讨论 Linux 下的静态路由表。

1.2 Linux 中查看路由表

  在 Linux 系统中,可以使用 route 命令查看当前内核路由表:

bash 复制代码
[root@linux ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     0      0        0 eth0
0.0.0.0         192.168.10.30   0.0.0.0         UG    0      0        0 eth0

-n 表示不解析主机名和服务名,直接显示 IP,更清晰也更高效。

1.3 路由表项结构详解

  一张路由表由 多条路由表项(Route Entry) 组成。

  每发送一个 IP 报文,内核都会遍历这张表,选择一条最合适的路由。

名称 含义
Destination 目标网络或目标主机(0.0.0.0 表示默认路由)
Gateway 下一跳地址;为 0.0.0.0 表示直连网络
Genmask 网络掩码,用于匹配目标 IP
Flags 路由标志位
Metric 路由度量值(优先级参考)
Ref 被引用次数(已废弃,通常为 0)
Use 被查找使用的次数
Iface 出口网络接口

1.4 Flags 字段说明

名称 含义
U 路由已启用(Up)
H 主机路由(Host)
G 需要经过网关(Gateway)
D 动态路由生成
R 动态路由重新初始化
M 被路由守护进程修改
路由被禁用

最常见的组合是:

  • U:直连路由
  • UG:通过网关的路由(如默认路由)

1.5 两个"特殊"的路由表项

1️⃣ Gateway 为 0.0.0.0

Gateway = 0.0.0.0

表示:

目标网络与本机在同一个二层网络中,可以直接通信,不需要经过网关

此时:

  • 内核会通过 ARP 查询目标 IP 对应的 MAC 地址
  • 然后直接从 Iface 指定的网卡发出

2️⃣ Destination + Genmask 都为 0.0.0.0

0.0.0.0    192.168.10.30    0.0.0.0

这是 默认路由(Default Route),含义是:

"如果没有任何更精确的路由能匹配,就走这条路"

2 、路由表的匹配原理(核心)

1️⃣ 匹配流程

当系统需要发送一个 IP 报文时:

  1. 取出 目标 IP
  2. 用目标 IP 与每一条路由表项的 Genmask 做 按位与
  3. 将结果与 Destination 比较
  4. 相同 → 命中该路由

2️⃣ 命中后的行为

  • Gateway ≠ 0
    • 目标不在本地网段
    • 修改 目标 MAC 为网关 MAC
    • IP 目的地址不变,从 Iface 指定的网卡发送给目标主机
  • Gateway = 0
    • 目标在本地网段
    • 直接从 Iface 指定的网卡发送给目标主机

3️⃣ 没有任何匹配?

  • 查找默认路由
  • 没有默认路由 → 直接丢包

3、路由类型划分

3.1 主机路由

  指向单个 IP 地址的路由。

c 复制代码
route add -host 8.8.8.8 gw 192.168.2.1 dev eth0

特点:

  • 掩码默认为 255.255.255.255
  • 优先级 高于网络路由

3.2 网络路由

  指向一个网络段:

c 复制代码
route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.2.1 dev eth0

用于描述:

  • 可达的远端子网
  • 企业网络、跨网段通信

3.3 默认路由

  兜底方案:

c 复制代码
route add default gw 192.168.2.1 dev eth0

添加前一定要确认:网关地址可达

4、总结

4.1 路由优先级与"最长前缀匹配"

当多条路由都能匹配同一个目标 IP 时,Linux 使用:

最长前缀匹配原则(Longest Prefix Match)

优先级从高到低:

  • 主机路由 /32
  • 网络路由(掩码越长越优先)
  • 默认路由 /0

举例:

bash 复制代码
8.8.8.8/32        → 优先
8.8.8.0/24
0.0.0.0/0

4.2 一个完整的转发流程示例

对于一个跨网段的 IP 数据报:

  1. 查询路由表
  2. 命中最精确的路由项
  3. 根据路由项选择出口网卡
  4. 若需网关:
    a. 查 ARP
    b. 修改目标 MAC
  5. 发送数据包
  6. 无匹配且无默认路由 → 丢弃

4.3 路由表工作的层次

路由表工作在:

OSI 七层模型的网络层(Layer 3)

但要注意:

真正的数据转发还依赖:

  • 二层 ARP
  • 网卡驱动
  • 物理链路
相关推荐
比老马还六13 小时前
Bipes-Blockly项目二次开发/Coze智能体(十)
前端·嵌入式
RainCity2 天前
Java Swing 自定义组件库分享(十二)
java·笔记·后端
ForTime3 天前
HAL库大雷预警!STM32 HAL库CAN启动超时解决办法
嵌入式
小宇子2B3 天前
三、内核入口 el0_svc / entry_SYSCALL_64 的汇编做了什么——从异常向量到 C 函数
操作系统
大辉狼_音频架构3 天前
Vol. NXP SOF Arch
嵌入式
小宇子2B3 天前
四、从 write(1, "hello", 5) 到 ksys_write() —— sys_call_table 怎么路由的
操作系统
小宇子2B3 天前
一、printf("hello") 怎么变成 write(1, "hello", 5) —— libc 的 stdout 缓冲机制
操作系统
用户805533698035 天前
主线 U-Boot 上 RK3506:和闭源 rkbin 拔河的三个隐性契约
linux·嵌入式
荣--7 天前
在 strip 二进制 + 基址随机化的栈里做崩溃去重 —— 三阶段算法与一行 Crash Flag
嵌入式·崩溃分析·栈指纹·去重算法
释然小师弟8 天前
Android开发十年:反思与回顾
android·后端·嵌入式