一篇講解IPv4路由表!
如下IP命令添加路由表項(xiàng),默認(rèn)情況下路由添加在main路由表中:
也可指定路由表,如下在local/default表中添加相同目的網(wǎng)絡(luò),但是網(wǎng)關(guān)不同的路由項(xiàng):
下面使用ping命令測(cè)試到目的網(wǎng)段192.2.0.0/16,可見其使用的是local表中的路由項(xiàng),而不是main表中項(xiàng):
以下刪除local表中添加的路由,再執(zhí)行ping操作,這次是main表中的路由生效,網(wǎng)關(guān)使用的是192.168.1.106:
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個(gè)人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實(shí)戰(zhàn)項(xiàng)目及代碼)? ? ?


最后,刪除main中的路由,
路由表創(chuàng)建
在添加表項(xiàng)時(shí),沒有指定路由表ID,或者指定的表ID等于0,內(nèi)核使用main表RT_TABLE_MAIN,函數(shù)fib_trie_table分配一個(gè)新的fib_table結(jié)構(gòu),代表一個(gè)新的路由表。對(duì)于main表,將其制賦值給命名空間中的fib_main成員。最后將其鏈接到哈希桶fib_table_hash的對(duì)應(yīng)鏈表中。
如果指定的路由表ID等于RT_TABLE_LOCAL,但是此命名空間中沒有配置過IPv4策略路由,也使用main路由表,作為alias,參見fib_trie_table。這種情況下,fib_new_table會(huì)在調(diào)用自身,參數(shù)ID使用RT_TABLE_MAIN,獲取main表的結(jié)構(gòu),賦值與alias。
對(duì)于default表,目前不太清楚其使用情況,在創(chuàng)建之后,內(nèi)核將其賦值給命名空間的fib_default成員。
對(duì)于main路由表,以及其它路由表,fib_trie_table的參數(shù)alias為空;但是對(duì)于local路由表,alias執(zhí)向main表結(jié)構(gòu),就不用重新分配trie結(jié)構(gòu)了。對(duì)于所有的路由表,都需要分配一個(gè)fib_table結(jié)構(gòu)。
對(duì)于local路由表,其數(shù)據(jù)字段指向main路由表的數(shù)據(jù)字段。可見local表不是一個(gè)完全單獨(dú)的路由表,其數(shù)據(jù)與main表是公用的。所以local路由表不需要進(jìn)行以下對(duì)數(shù)據(jù)字段的初始化操作。
路由查找
如下內(nèi)核的路由查詢?nèi)肟诤瘮?shù)fib_lookup,可見其查詢順序?yàn)椋郝酚刹呗?>main路由表->default路由表。對(duì)local路由表的查詢包含在main路由表查詢中。
由函數(shù)fib_insert_alias可知,在trie樹葉子節(jié)點(diǎn)中,路由表項(xiàng)時(shí)按照表ID由大到小排列的,如果local和main表中存在相同的路由,優(yōu)先選擇的是local表中的路由,宏RT_TABLE_LOCAL(255)大于RT_TABLE_MAIN(254)。
