首页 > 代码库 > 《深入理解Linux网络技术内幕》阅读笔记 --- 路由

《深入理解Linux网络技术内幕》阅读笔记 --- 路由

一、Linux内核中路由相关的主要数据结构

  1. struct fib_result:对路由表查找后返回该结构,它的内容并不是简单的包含下一跳信息,而且包含其他特性,例如策略路由所需的更多参数。
  2. struct fib_rule:表示由策略路由在路由流量时选择路由表的规则
  3. struct fib_node:一条路由表项。例如,该数据结构用于存储由route add或ip route add命令添加一条路由时生成的信息。
  4. struct fn_zone:一个zone表示子网掩码长度相同的一组路由
  5. struct fib_table:表示一张路由表
  6. struct fib_info:不同路由表项之间可以共享一些参数,这些参数被存储在fib_info数据结构中,当一个新的路由表项所用的参数与一个已经存在的路由表项所用的参数匹配时,则重复使用已经存在的fib_info结构。一个引用技术用于跟踪该结构重复使用的次数
  7. struct fib_alias:达到相同网络的路由,因为其他一些参数而不同,例如TOS,不同的路由是通过fib_alias实例来区分的
  8. struct fib_nh:表示下一跳
  9. struct fn_hash:该结构包含指向33个fn_zone链表头的指针,以及一个链表。这个链表将活动的zone(active zone,即那些至少有一个元素的zone)链接在一起,链表中的元素按照子网掩码长度的降序排列
  10. struct fn_zone_list:非空的fn_zone bucket被链接在一起,该链表的头保存在fn_zone_list中
  11. struct fib_info_hash:所有fib_info结构被插入到这个hash表中,用fib_find_info函数来查找该表
  12. struct fib_info_laddrhash:只有在路由表项有一个首选源地址时,才将fib_info结构插入到这个表中。这个hash表主要是为了方便地删除由于删除了本地配置IP地址而影响的路由

每个单独的子网对应一个fib_node实例,用变量fn_key识别,它的值就表示该子网。例如,对于子网10.1.1.0/24,fn_key为10.1.1。目的子网相同的不同路由(即fn_key相同)共享同一个fib_node。每条路由有自己的fib_alias结构。每个fib_alias实例都与一个fib_info结构相关联,该结构保存着真实路由信息(即如何到达目的地)。

 

二、路由表初始化

  1. 在系统启动时总是创建下面两个路由表,它们与内核配置选项无关:
    1. ip_fib_local_table:内核将本地地址的路由放在该表中,包括到相关的子网网络地址以及子网广播地址的路由。用户不能直接配置该路由表。
    2. ip_fib_main_table:所有其他的路由表项(包括用户配置的静态路由,路由协议生成的动态路由)都放在该表内。

 

《深入理解Linux网络技术内幕》阅读笔记 --- 路由