我們都知道路由表通常使用Radix樹來存儲,可是你又沒有想過如下路由怎麼處理呢:
(這裡拿127.0.0.0作為前綴只是個例子,無實際意義)
Destination/Mask Proto Pre Cost Flags NextHop Interface
127.0.0.0/8 Static 60 0 RD 10.0.0.2 Ethernet0/0/0
127.0.0.0/16 Static 60 0 RD 10.0.0.3 Ethernet0/0/0
127.0.0.0/24 Static 60 0 RD 10.0.0.4 Ethernet0/0/0
這三條路由前綴都是127.0.0.0,但粒度不同。根據最長匹配原則,如果要去127.0.0.1,第一條路由最優,第二條次之,第三條是“無奈之舉”。
路由在Radix樹中大略像下圖那樣組織。
我們可以看到前綴127.0.0.0的路由在紅框處,上圖只有一條該前綴的路由,我們的疑問是三條怎麼辦?
翻閱了那本該死的《TCP/IP協議詳解卷二:實現》,裏面洋洋灑灑地說了一大堆,無非就是說單純用Radix樹也搞不定,只有在這個前綴下做個鏈錶,把所有同前綴的路由掛上去,順序從掩碼最精確到最不精確。教授我想了半天也沒什麼好方法。見下圖:
Radix樹來存儲路由有很多細節,如果不動手做一把,大概不會體味到。教授大人生來厭惡Linux、BSD等等,從看它們的實現,看也看不懂。中國人的編程習慣是與洋人不同的。有那功夫自己都搞成了。