news 2026/5/30 18:46:16

网络包匹配路由的原则是啥 从 01 与啥的运算讲起

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
网络包匹配路由的原则是啥 从 01 与啥的运算讲起

明白了,你想从最基础的二进制位运算原理讲起,理解网络包是如何匹配路由的。我们一步步来,先从 IP 路由的核心概念讲起:


1️⃣ IP 路由匹配的基本原则

网络路由匹配,实际上是把目标 IP 地址与路由表里的目的网络地址 + 子网掩码做比较,来决定使用哪条路由。核心原则是:

  1. 先按最长前缀匹配(Longest Prefix Match, LPM)

    • 路由表里可能有多条能匹配的路由,但选择掩码最长的那条
    • 因为掩码越长,匹配越精确。
  2. 匹配是通过按位与运算(AND)实现的

    • IP 与子网掩码按位与得到网络地址。
    • 如果这个网络地址和路由表的目的网络地址相同,就算匹配成功。

2️⃣ 按位与运算原理

按位与运算符号是&,规则如下:

ABA & B
000
010
100
111

也就是说:

  • 只有两个操作数都是1的位才会输出1
  • 其他情况输出0

在 IP 路由里,它的作用是把目标 IP 截掉子网外的部分,只保留网络地址部分。


3️⃣ 路由匹配公式

假设目标 IP 是目标IP,路由表里有条路由:

目的网络: 192.168.1.0 子网掩码: 255.255.255.0

匹配条件是:

目标IP & 子网掩码 == 目的网络地址

例子:

  • 目标 IP:192.168.1.45 → 二进制:11000000.10101000.00000001.00101101
  • 子网掩码:255.255.255.0 → 二进制:11111111.11111111.11111111.00000000

按位与运算:

11000000.10101000.00000001.00101101 (目标IP) AND 11111111.11111111.11111111.00000000 (掩码) = 11000000.10101000.00000001.00000000 (结果)

转换回十进制 →192.168.1.0
匹配成功 → 使用这条路由。


4️⃣ 多条路由冲突时如何选择

假设路由表里有:

目的网络子网掩码下一跳
192.168.0.0255.255.0.0R1
192.168.1.0255.255.255.0R2

目标 IP = 192.168.1.45

  • 192.168.0.0/16:匹配成功(掩码前 16 位相同)
  • 192.168.1.0/24:匹配成功(掩码前 24 位相同)

原则 →选择最长前缀

  • 192.168.1.0/24 的掩码更长 → 选择下一跳 R2

5️⃣ 总结

  • 路由匹配就是目标 IP & 子网掩码与路由表目的网络比对
  • 运算方式是按位与 (AND)
  • 如果多条路由匹配 → 选择最长前缀

如果你愿意,我可以画一张图解按位与运算 + 路由匹配流程图,让你一眼看懂整个匹配过程。

你希望我画吗?

二、还有个问题请教啊 就是一个包去找路由表的时候 是从第一条依次往后查吗 还是有规则查

明白,你这个问题是关于Linux 内核查路由表的机制,尤其是route -n显示的静态路由表是如何匹配的。不要以为它是顺序扫描,实际有讲究。我们细讲下。


1️⃣ 路由匹配不是从第一条开始线性扫描

Linux 内核查路由表不是简单的从上到下扫描,而是有一套优先级/规则系统,具体包括:

  1. 最长前缀匹配(Longest Prefix Match, LPM)

    • 内核会选择掩码最长的路由与目标 IP 匹配。

    • 举例:

      10.0.0.0/30 -> nic1 10.0.0.0/16 -> nic1 via 10.0.0.1

      如果目标 IP 是10.0.0.1

      • /30前缀更长(30位) → 匹配这条
      • /16前缀短 → 备选,不用
  2. 路由表索引与优先级(Metric)

    • 如果有多个掩码长度相同的匹配路由,内核会选metric 最小的

    • 在你的例子里:

      0.0.0.0/0 via 10.0.92.10 metric 20 10.60.0.0/16 via 10.0.0.1 metric 20

      metric 可以理解成“成本”,越小越优先。

  3. flags 决定可达性

    • U→ 这条路由是 up
    • G→ 需要网关

2️⃣ 内核路由查找流程(简化版)

假设目标 IP =10.77.92.140,流程大概是:

  1. 内核查看路由表里有没有精确匹配的 host 路由(掩码 /32)。

    • 你的路由表里有:

      10.77.92.140 0.0.0.0 255.255.255.252 U

      ✅ 完全匹配 → 直接走 swp32

  2. 如果没有 host 路由 → 内核找最长前缀匹配的网络路由

    • 按掩码长度排序,匹配成功就用
  3. 如果有多条相同前缀长度 → 比较metric,选最小的

  4. 如果都没有 → 走默认路由0.0.0.0/0

🔑 所以,不是从上到下顺序查表,而是按掩码长度 → metric → flags决定,内核用高效数据结构(radix tree/trie)来快速查找。


3️⃣ 你的路由表分析

Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.0.92.10 0.0.0.0 UG 20 0 0 nic2 10.0.0.0 0.0.0.0 255.255.255.252 U 0 0 0 nic1 10.60.0.0 10.0.0.1 255.255.0.0 UG 20 0 0 nic1 10.0.92.12 0.0.0.0 255.255.255.252 U 0 0 0 nic2

举例匹配目标 IP:

  1. 目标 IP =10.0.92.10

    • 完全匹配/30(前 30 位是 1 → /30)host 路由 → swp32
  2. 目标 IP =10.60.1.5

    • 匹配10.60.0.0/16→ next hop 10.0.0.1
  3. 目标 IP =8.8.8.8

    • 匹配默认路由0.0.0.0/0→ next hop 10.0.92.10

所以即使 host 路由在表的最后一行,也不会影响匹配,因为 Linux 内核会按掩码长度优先查找。


如果你想,我可以画一张Linux 内核路由查找树 + LPM 匹配流程图,让你一眼看懂查找顺序和原理。

你希望我画吗?

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/28 18:42:21

新手教程:利用向导工具生成常见IC封装

新手也能快速上手:用EDA封装向导高效生成IC封装 你是不是也经历过这样的场景? 选好了一颗关键芯片,兴冲冲打开EDA软件准备画PCB,结果发现—— 库里没有这个封装 。翻出几十页的数据手册,盯着机械图发愁:…

作者头像 李华
网站建设 2026/5/30 4:49:46

SkyWalking 接口超时监控告警完整指南

目录 一、SkyWalking 简介 二、安装部署 三、告警配置 四、管理维护 五、最佳实践 六、故障排查 一、SkyWalking 简介 1.1 什么是 SkyWalking SkyWalking 是一个开源的 APM(应用性能监控)系统,专为微服务、云原生和容器化架构设计。 核心功能: 📊 分布式追踪:完整的调…

作者头像 李华
网站建设 2026/5/28 21:01:54

拒绝尬聊死循环:开发者视角下的“社交冷启动”算法优化

为什么你的社交“冷启动”总是 Timeout?做开发的同学都知道,系统初始化最怕的就是死循环。很多兄弟在面对刚加上的微信好友时,聊天逻辑极其简陋:While(true) { Send("在吗"); Wait(86400); }这种低效的请求不仅拿不到正…

作者头像 李华
网站建设 2026/5/30 17:41:18

Leetcode—3314. 构造最小位运算数组 I【简单】

2025每日刷题&#xff08;240&#xff09; Leetcode—3314. 构造最小位运算数组 I实现代码 func minBitwiseArray(nums []int) []int {ans : make([]int, 0)for _, x : range nums {if x 2 {ans append(ans, -1)} else {for i : 1; i < 32; i {if x >> i & 1 0…

作者头像 李华
网站建设 2026/5/29 2:04:34

USB-Serial Controller D驱动下载工具推荐(初学者适用)

为什么你的开发板连不上电脑&#xff1f;一文搞懂 USB转串口驱动安装&#xff08;新手避坑指南&#xff09; 你有没有遇到过这样的场景&#xff1a; 刚买回来一块 Arduino Nano&#xff0c;兴冲冲插上电脑&#xff0c;打开 IDE 准备烧程序——结果提示“找不到串口”。 设备…

作者头像 李华