【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重定向信息,减少了内存使用和无效化代价。

➡️

继续阅读