【Linux 网络子系统深度拆解】路由子系统深度拆解:FIB、策略路由与路由缓存
💡
原文中文,约16500字,阅读约需40分钟。
📝
内容提要
本文深入探讨了Linux内核中IP路由的实现,包括发包和收包的路径、路由表结构、最长前缀匹配算法、策略路由机制、ECMP负载均衡及现代nexthop对象管理。重点分析了路由查找流程和优化,介绍了通过策略路由和ECMP实现高效网络数据转发的方法。
🎯
关键要点
- IP包从目的IP到发出网卡和网关的路径包括多个步骤,如ip_route_output_flow、fib_lookup等。
- FIB表是路由信息的容器,Linux默认维护三张路由表:local、main和default。
- LC-trie用于执行最长前缀匹配,查找时间复杂度约为O(W),W为IPv4地址位数。
- fib_info结构存储一条路由的完整信息,包括协议来源、度量值和下一跳列表。
- 策略路由通过遍历规则链实现,默认规则链包括local、main和default表的查找。
- ECMP实现多路径负载均衡,通过哈希选路和加权ECMP来选择下一跳。
- nexthop对象将下一跳信息解耦为独立管理的资源,支持弹性哈希以减少流迁移。
- FNHE机制替代全局路由缓存,缓存PMTU发现结果和ICMP重定向信息。
- dst_entry和rtable是路由缓存的载体,提供协议无关的路由信息。
- IPv6路由使用radix tree实现,具有与IPv4路由不同的数据结构和锁保护机制。
❓
延伸问答
Linux路由子系统的发包路径是怎样的?
发包路径包括多个步骤,从ip_route_output_flow开始,经过fib_lookup、策略路由、最长前缀匹配、ECMP选择下一跳,最终构造rtable并设置输出接口。
什么是FIB表,它在Linux路由中有什么作用?
FIB表是路由信息的容器,Linux默认维护local、main和default三张路由表,用于存储和查找路由信息。
策略路由是如何实现的?
策略路由通过遍历规则链实现,默认规则链包括local、main和default表的查找,允许根据不同条件选择路由表。
ECMP负载均衡是如何工作的?
ECMP通过哈希选路和加权ECMP来选择下一跳,确保同一流的所有包走同一个下一跳,以避免乱序。
nexthop对象在Linux路由中有什么优势?
nexthop对象将下一跳信息解耦为独立管理的资源,允许在不影响其他路由的情况下修改下一跳,提高了灵活性和效率。
FNHE机制是什么,它解决了什么问题?
FNHE机制替代全局路由缓存,缓存PMTU发现结果和ICMP重定向信息,减少了内存使用和无效化代价。
➡️