news 2026/3/3 3:28:45

网络包匹配路由的原则是啥 从 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/3/3 3:27:34

Prim 最小生成树算法(MST)

Prim算法是贪婪算法,类似于Kruskal算法。该算法始终从单个节点出发,经过多个相邻节点,以探索沿途所有连接的边。 该算法从一个空生成树开始。 其理念是维持两组顶点。第一组包含已包含在MST中的顶点,另一组包含尚未包含的顶点。 …

作者头像 李华
网站建设 2026/2/27 5:38:23

opencv基础(轮廓检测、绘制与特征)

一、轮廓检测轮廓定义:图像中具有相同颜色 / 灰度的连续像素点连接形成的闭合曲线,代表前景与背景的边界,与边缘(单像素灰度突变)不同,轮廓更强调整体外形与连通性。cv2.findContours 是 OpenCV 用于从二值…

作者头像 李华
网站建设 2026/2/28 14:05:46

汇编语言全接触-100.拾取密码框中的密码

概述:其实早有所闻 Windows 的马虎,Windows打星号的密码框中的密码实际上是很容易得到的,我以前看到过的资料说是检索屏幕上的窗口,找到有 ES_PASSWORD 风格的就向它发送取消 ES_PASSWORD 的消息,然后刷新它&#xff0…

作者头像 李华
网站建设 2026/3/3 1:00:10

28.C++进阶:map和set封装|insert|迭代器|[]

封装红⿊树实现mymap和myset 源码及框架分析 SGI-STL30版本源代码,map和set的源代码在map/set/stl_map.h/stl_set.h/stl_tree.h等⼏个头⽂件中。 map和set的实现结构框架核⼼部分截取出来如下: // set #ifndef __SGI_STL_INTERNAL_TREE_H #include &…

作者头像 李华
网站建设 2026/2/25 23:00:46

全国现代物业管理人才培养赋能新质生产力发展研讨会 (MPMTT 2026)

全国现代物业管理人才培养赋能新质生产力发展研讨会(MPMTT 2025)将于2026年3月13日-15日在中国昆明隆重举行。MPMTT 2025 由昆明理工大学津桥学院主办,将针对物业管理的相关研究领域展开探讨,旨在为相关领域的专家学者&#xff0c…

作者头像 李华