0×1.路由表結構
首先如下圖所示配置R1和R2;R1上面有4個回環接口,其中Lo3的子網掩碼長度是26,在R1上有一條默認路由指向R2的s0/1接口IP,R2上面有一條靜態路由指向R1的s0/0接口IP:

R1配置:
01
R1(config)#
int
s 0/0
02
R1(config-if)#
ip
add
12.1.1.1 255.255.255.0
03
R1(config-if)#
no
shut
04
R1(config-if)#
int
lo
0
05
R1(config-if)#
ip
add
172.16.1.1 255.255.255.0
06
R1(config-if)#
no
shut
07
R1(config-if)#
int
lo
1
08
R1(config-if)#
ip
add
172.16.2.1 255.255.255.0
09
R1(config-if)#
no
shut
10
R1(config-if)#
int
lo
2
11
R1(config-if)#
ip
add
172.17.1.1 255.255.255.0
12
R1(config-if)#
no
shut
13
R1(config-if)#
int
lo
3
14
R1(config-if)#
ip
add
172.17.2.1 255.255.255.192
15
R1(config-if)#
no
shut
16
R1(config-if)#
exit
17
R1(config)#
ip
route
0.0.0.0 0.0.0.0 12.1.1.2
18
R1(config)#
end
R2配置:
1
R2(config)#
int
s 0/1
2
R2(config-if)#
ip
add
12.1.1.2 255.255.255.0
3
R2(config-if)#
no
shut
4
R2(config-if)#
int
lo
0
5
R2(config-if)#
ip
add
192.168.2.1 255.255.255.0
6
R2(config-if)#
no
shut
7
R2(config-if)#
exit
8
R2(config)#
ip
route
172.16.0.0 255.254.0.0 12.1.1.1
9
R2(config)#
end
配置完成后查看R1和R2的路由表:
01
/查看R1路由表/
02
R1#
show
ip
route
03
04
172.17.0.0/16 is variably subnetted, 2 subnets, 2 masks
05
C 172.17.1.0/24 is directly connected, Loopback2
06
C 172.17.2.0/26 is directly connected, Loopback3
07
172.16.0.0/24 is subnetted, 2 subnets
08
C 172.16.1.0 is directly connected, Loopback0
09
C 172.16.2.0 is directly connected, Loopback1
10
12.0.0.0/24 is subnetted, 1 subnets
11
C 12.1.1.0 is directly connected, Serial0/0
12
S* 0.0.0.0/0 [1/0] via 12.1.1.2
13
14
/查看R2路由表/
15
R2#
show
ip
route
16
17
12.0.0.0/24 is subnetted, 1 subnets
18
C 12.1.1.0 is directly connected, Serial0/1
19
C 192.168.2.0/24 is directly connected, Loopback0
20
S 172.16.0.0/15 [1/0] via 12.1.1.1
對于這個路由表的結構可能大家會有疑問,為什么R2中像"172.16.0.0/15 [1/0] via 12.1.1.1"和"192.168.2.0/24 is directly connected, Loopback0"這樣的路由只顯示成一行,而"12.0.0.0/24 is subnetted, 1 subnets"卻顯示了兩行?上面這種輸出格式,是路由級別決定的,那什么是路由級別呢?請看下面的詳細說明。
a.級別1路由(Level 1 Route)
級別1路由是指一條路由使用的子網掩碼小于或等于有類網絡的默認子網掩碼(什么是"有類網絡的默認子網掩碼"?例如在IPv4中,192.168.1.0/24就是一個C類網絡,C類網絡的默認子網掩碼長度就是24)。
級別1路由包括:
網絡路由:一條路由使用的子網掩碼等于有類網絡默認的子網掩碼,比如R2上的192.168.2.1/24;超網路由:一條路由使用的子網掩碼小于有類網絡默認的子網掩碼,比如R2上的172.16.0.0/15;默認路由:比如R1上的0.0.0.0/0;
對于上面列出的三種路由,在路由表中只顯示成一行。
b.父路由(Parent Route)
注意上面R2的路由表中"12.0.0.0/24"就是一條父路由,父路由不包括下一跳地址或本地路由的外出接口;父路由實際上只是一個頭部,暗示后面還有級別2的路由,級別2的路由也稱為子路由。
無論什么時候,只要路由表中出現一條子網掩碼長度大于默認有類網絡子網掩碼的路由,父路由就會被創建。
在R2的路由表中"12.0.0.0/24 is subnetted, 1 subnets"表示的是父路由,子網掩碼的位數是24,該主類網絡在路由表中有一個子網。
R1的路由表中的"172.17.0.0/16 is variably subnetted, 2 subnets, 2 masks"也是一條父路由,因為子路由擁有不同的子網掩碼,所以父路由的子網掩碼使用主類網絡默認的子網掩碼16。"variably subnetted"表示是變長子網,有兩個子網,有兩種掩碼,不同的子網掩碼在子路由中分別表示。
R1中的"172.16.0.0/24 is subnetted, 2 subnets"也是一條父路由,因為兩個子路由的掩碼長度都相同,所以在父路由中用/24表示出來,父路由中已經表示了子網掩碼長度,子路由就不必再表示了。
c.子路由(Child Route)
子路由中明確的標出了下一跳的IP地址或本路由的外出接口;如果所有子路由的子網掩碼相同,相同的子網掩碼將在父路由中表示出來,子路由中就不再顯示子網掩碼長度了,比如R1中的"172.16.1.0 is directly connected, Loopback0"和"172.16.2.0 is directly connected, Loopback1";
如果子路由擁有不同的子網掩碼長度,子網掩碼將在每個子路由中單獨表示出來,而父路由則使用默認主類網絡掩碼表示,如R1中的"172.17.1.0/24 is directly connected, Loopback2"和"172.17.2.0/26 is directly connected, Loopback3"。
d.最終路由(Ultimate Route)
所謂的最終路由是指路由條目中包含下一跳路由器的IP地址或本路由的外出接口;除父路由外,所有級別1的路由和子路由都是最終路由。
0×2.路由查找過程
當一個路由器收到一個IP報文時,檢查目的IP地址,按照下面的步驟查找路由表:
1)路由器根據目的IP查找級別1路由,依次查找網絡路由(包括父路由)、超網路由、默認路由,如果最佳匹配(子網掩碼最長匹配)是級別1路由的最終路由(路由條目中包含下一跳IP或本地外出接口),那么這條路由用來轉發數據包;2)如果最佳匹配的是級別1中的父路由,繼續下一步查找即查找該父路由的子路由,如果找到匹配的子路由,則這條子路由用來轉發數據包;3)如果子路由沒有匹配,繼續下一步查找,此時判斷路由執行的是有類查找還是無類查找(有類或無類查找是通過ip classless和no ip classless這兩條命令來控制的),如果是有類查找則跳到第4步,如果是無類查找則跳到第5步。;4)有類路由行為:終止查找,丟棄數據包;5)無類路由行為:繼續查找級別1的超網路由和默認路由,如果沒有超網路由匹配,也沒有默認路由匹配,則終止查找,丟棄數據包。如果找到匹配,則使用找到的路由條目進行轉發;
下面使用本文第一部分中的拓撲圖來演示上面介紹的路由查找過程。
路由查找實例一:在R2上新增加一個Loopback1并配置IP(2.2.2.2/24),然后在R1上去ping R2的lo1;
01
/新增一個回環接口lo1/
02
R2(config)#
int
lo
1
03
R2(config-if)#
ip
add
2.2.2.2 255.255.255.0
04
R2(config-if)#
no
shut
05
R2(config-if)#
end
06
07
/在R1上去
ping
R2新增的這個回環接口地址/
08
R1#
ping
2.2.2.2
09
!!!!!
10
/可以
ping
通/
通過R1的路由表分析R1的查找過程如下:
1)依次查找級別1路由,此時R1上只有一條級別1路由,即默認路由;2)找到默認路由"0.0.0.0/0 [1/0] via 12.1.1.2",這是一條最終路由,下一跳是12.1.1.2;3)使用這條路由轉發,R1將數據發往R2;
路由查找實例二:路由R1上去往12.1.1.2的數據包查找過程;
1)R1查找級別1路由;2)找到最佳匹配12.0.0.0/24,這是一條級別1的父路由,繼續下一步查找;3)查找這條父路由的子路由,子路由中的12.1.1.0/24匹配12.1.1.2,R1根據這條路由,將數據從自己的s0/0發送出去;
路由查找實例三:R1去往172.16.3.1的數據包查找過程;
注意!無類查找需要讓R1執行進程交換而不是快速交換,默認的快速交換會影響無類路由查找過程。
在R2上新增一個回環接口loopback2給它分配IP地址172.16.3.1/24,然后在R1上使用進程交換并且使用有類查找:
01
/在R2上增加新回環接口/
02
R2(config)#
int
lo2
03
R2(config-if)#
ip
add
172.16.3.1 255.255.255.0
04
R2(config-if)#
no
shut
05
R2(config-if)#
end
06
07
/R1使用進程交換和有類查找/
08
R1(config)#
no
ip
cef
/切換到進程交換/
09
R1(config)#
no
ip
classless
/切換到有類查找/
10
R1(config)#
end
11
12
/測試
ping
R2的lo2/
13
R1#
ping
172.16.3.1
14
..... /無法
ping
通/
導致這一步無法ping通的原因是因為R1開啟了有類查找,下面是R1路由查找過程:
1)R1根據自身路由表查找級別1路由,找到匹配的父路由172.17.0.0/16;2)繼續下一步查找該父路由的子路由,結果無法找到匹配172.17.3.1的最終路由;3)路由R1檢查自己是使用有類查找還是無類查找,結果發現自己是使用有類查找;4)停止繼續查找,丟棄該數據;
開啟R1的無類查找,再次ping測試:
1
/使用無類查找/
2
R1(config)#
ip
classless
3
4
/再次
ping
R2的lo2/
5
R1#
ping
172.16.3.1
6
!!!!!
7
/*
ping
成功*/
開啟無類查找后R1的路由查找過程:
1)R1根據自身路由表查找級別1路由,找到匹配的父路由172.17.0.0/16;2)繼續下一步查找該父路由的子路由,結果無法找到匹配172.17.3.1的最終路由;3)路由R1檢查自己是使用有類查找還是無類查找,發現自己是使用無類查找;4)繼續查找其他的級別1路由,找到默認路由匹配,使用這條默認路由轉發數據;