標籤:lin 動態路由 引用 存在 路由 產生 nod 相同 資訊
一、Linux核心中路由相關的主要資料結構
- struct fib_result:對路由表尋找後返回該結構,它的內容並不是簡單的包含下一跳資訊,而且包含其他特性,例如策略路由所需的更多參數。
- struct fib_rule:表示由策略路由在路由流量時選擇路由表的規則
- struct fib_node:一條路由表項。例如,該資料結構用於儲存由route add或ip route add命令添加一條路由時產生的資訊。
- struct fn_zone:一個zone表示子網路遮罩長度相同的一組路由
- struct fib_table:表示一張路由表
- struct fib_info:不同路由表項之間可以共用一些參數,這些參數被儲存在fib_info資料結構中,當一個新的路由表項所用的參數與一個已經存在的路由表項所用的參數匹配時,則重複使用已經存在的fib_info結構。一個引用技術用於跟蹤該結構重複使用的次數
- struct fib_alias:達到相同網路的路由,因為其他一些參數而不同,例如TOS,不同的路由是通過fib_alias執行個體來區分的
- struct fib_nh:表示下一跳
- struct fn_hash:該結構包含指向33個fn_zone鏈表頭的指標,以及一個鏈表。這個鏈表將活動的zone(active zone,即那些至少有一個元素的zone)連結在一起,鏈表中的元素按照子網路遮罩長度的降序排列
- struct fn_zone_list:非空的fn_zone bucket被連結在一起,該鏈表的頭儲存在fn_zone_list中
- struct fib_info_hash:所有fib_info結構被插入到這個hash表中,用fib_find_info函數來尋找該表
- 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結構相關聯,該結構儲存著真實路由資訊(即如何到達目的地)。
二、路由表初始化
- 在系統啟動時總是建立下面兩個路由表,它們與核心配置選項無關:
- ip_fib_local_table:核心將本地地址的路由放在該表中,包括到相關的子網網路地址以及子網廣播位址的路由。使用者不能直接配置該路由表。
- ip_fib_main_table:所有其他的路由表項(包括使用者配置的靜態路由,路由協議產生的動態路由)都放在該表內。
《深入理解Linux網路技術內幕》閱讀筆記 --- 路由