從現在開始學習路由相關的**,在分析**之前, 我們還是先分析資料結構,把資料結構之間的關係理解了以後,再理解**就相對輕鬆多了。本小節先分析路由相關的資料結構。核心裡面大多模組定義的資料結構之間一般都是使用鍊錶或者hash
表實現連線操作。
對於路由表,相關的資料結構有fib_table
、fn_hash
、fn_zone
、fib_node
、fib_alias
、fib_info
、fib_nh
等, 下面分別介紹這幾個資料結構
路由表結構,該結構為乙個路由表的抽象,包括路由表的id
、路由新增函式、路由查詢函式、路由刪除函式等
struct fib_table ;
該結構主要用於描述以掩碼劃分的區域結構以及掩碼區域之間的關係
對於ipv4
來說,掩碼可以為
0-32共33
種可能,因此對於乙個
fn_hash
來說,則
定義了乙個包含33
個fn_zone
的陣列,而鍊錶
fn_zone_list
,主要是將乙個路由表裡的
fn_zone鏈結在一起
(以掩碼大小的順序排列,主要是在路由查詢時,先匹配最長掩碼對應的路由,以提高路由匹配的精確度)。
struct fn_hash ;
以掩碼劃分的區域結構抽象,將掩碼長度相同的所有路由放在同乙個fn_zone
中hash
表中。
struct fn_zone ;
抽象為乙個目的網路位址相同的所有路由項的基礎結構,其中的fn_alias
,表示該結構所包含的已存在的路由項的鍊錶,
fn_key
為該結構對應的目的網路位址值,
用於和掩碼長度相同的其他
fib_node
區分,對於同乙個
fn_zone
裡的fib_node
,都鏈結到
fn_zone->fz_hash
中相應的
hash表中
struct fib_node ;
該結構可以理解為乙個路由項的抽象。
當路由項的目的網路位址相同時,可以根據這個結構變數區分不同的路由項。包括tos
、type
、scope
、state
以及fib_info
來區分乙個路由項
方法:
1.首先根據
tos、
type
、scope
等確定乙個
fib_alias
2.當fib_alias
確定以後,再根據
priority
等值確定乙個
fib_info,
3.根據
fib_info
確定出口裝置與下一跳閘道器的
ip位址。
struct fib_alias ;
而fa_scope
表示路由的
scope
,取值範圍如下:
rt_scope_universe:該選項用於所有通向非直連目的地的路由表項,即
應用層建立的路由中包含via
的路由
rt_scope_link:該選項用於目的位址為本地網路的路由項
rt_scope_host:該選項用於路由為本機介面,
rt_scope_nowhere:該選項用於路由不可到達
enum rt_scope_t
;
功能:主要是用來獲取出口裝置以及下一跳閘道器的資料結構,以及路由項的優先順序,路由建立協議
fib_protocol
(rtproto_kernel
、rtproto_boot
、rtproto_static
等取值)。而
fib_hash
與fib_lhash
則是將fib_info
鏈結到對應的
hash
鍊錶fib_info_hash
與fib_info_laddrhash
中去的。
struct fib_info ;
包含下一跳閘道器及出口裝置的結構
struct fib_nh ;
而nh_hash
是用來將
fib_nh
變數鏈結到對應的
fib_info_devhash
鍊錶中的。
以上就是相應的資料結構分析,下面是這些資料結構之間的邏輯關係。沒有給出fib_info_hash
、fib_info_laddrhash
與fib_info
之間的,也沒有給出
fib_nh
與fib_info_devhash
之間的關係
Pushlet 學習 一 相關資料蒐集
這兩天突然對伺服器推送技術產生了濃厚的興趣,經過這兩天的google baidu蒐集到一些資訊,對伺服器推送技術有了一定的了解。1.了解什麼是pushlet,以及他所用到的技術 thinki in pushlet pushlet 的中文版,文中的時序圖貼反了,英文版可參照 中的 white 2.什麼...
Docker學習筆記1 相關命令操作
docker映象就是乙個唯讀模板。映象可以用來創造docker容器,乙個映象可以建立很多容器。倉庫是集中存放映象檔案的場所。阿里雲映象加速器 幫助命令 sudo docker versionsudo docker infosudo docker help 映象命令 a.sudo docker ima...
PyQt5相關筆記
顯示 triggered self.show self.quit action qtwidgets.qaction 退出 self.tray menu.addaction self.show action self.tray menu.addaction self.quit action self....