《交換機轉發原理的回顧》—那些你應該知道的知識(十一)

寫在前面:

近期被一道有點奇怪的題目考住了,考點其實就是最基礎的交換機的轉發原理。在此複習、整理一下。

在此,我們不講這個題目提出的其他條件,單獨講述PC1能夠ping通PC2的這一過程。

交換機SW1 eth0屬於vlan10,交換機SW2 eth0屬於vlan20.兩個交換機互聯接口爲三層接口。

兩臺交換機通過三層接口互聯,並在接口上配置ip地址如下圖所示:

在兩臺交換機上分別起SVI作爲網段的網關;在兩臺交換機上配置靜態路由,通過互聯三層地址實現互通。

下面就PC1 10.1.1.1 ping通 PC2 10.1.2.1的這一過程,做出解釋。

在開始之前,我們先關閉CDP,清除ARP緩存,關閉兩臺交換機的互聯接口。


過程闡述:

在ping之前

我們先來看看,在ping之前,有什麼事情已經發生。

打開SW1,eth0/1接口,查看該接口上的抓包情況

免費ARP

通過抓包,我們可以看到,SW1從ETH0接口發出免費ARP,該數據包的源mac地址爲ETH0接口的MAC地址,目的MAC地址爲廣播MAC地址。

SW1通過這樣的方式,告知二層廣播域內的所有設備ip地址1.1.1.1的mac地址是多少,同時通過這樣的方式,接收到該數據包的交換機,可以將該數據包的源mac地址和收到該數據包的接口形成一一對應關係,更新到mac地址表中。同樣,可以將1.1.1.1與mac地址形成對應關係,更新到arp表中。

於是僅通過這一條免費ARP,在SW2 ETH0/1接口打開的情況下,SW2就可以學習到1.1.1.1對應的mac地址,和去往該mac地址,對應到的交換機接口。

ARP請求

除了免費ARP以外,SW1還從ETH0/1接口發出了arp請求,在二層廣播與內詢問1.1.1.2對應的mac地址。這應該與我們配置了靜態路由有關,SW1在詢問1.1.1.2所對應的mac地址,已完成數據包二層mac地址的封裝。

由於SW2的ETH0接口此時沒有打開,所以SW1無法得到迴應,通過抓包我們可以看到SW1以約爲2.35、4.65、9.32這樣的,每次增長兩倍頻率發ARP請求,這個行爲與TCP SYN包重傳的間隔非常相似。

下面我們打開SW2的ETH0/1接口,查看接口上的抓包情況

免費ARP

通過抓包,我們可以看到,在打開接口的瞬間,交換機SW2同樣從ETH0/1接口發出了免費ARP,通過這樣的方式,告知同一個二層廣播域內的設備ETH0接口IP地址1.1.1.2所對應的mac地址,這樣SW1便學到了1.1.1.2所對應的mac地址,可以更新ARP表。

ARP請求

除了免費ARP之外,由於之前SW2接口ETH0/1是關閉狀態,SW2並沒有能夠接收到SW1發出的免費ARP,這導致在SW2的ARP表中,沒有1.1.1.1對應的條目。於是SW2發出ARP請求,這得到了SW1 ETH0/1接口的迴應。SW2從自身的ETH0/1接口收到這個ARP應答,更新ARP表記錄1.1.1.1對應的ip地址,和收到ARP迴應的ARP接口。

至此,我們可以在SW1和SW2的設備上,查看ARP表。

兩臺設備通過上述數據包的交互,學習到了直連接口對端IP地址對應的mac地址,以及要去往該mac地址,對應的交換機接口。

開始ping測試

我們可以看到,ping包的前兩個包沒有得到迴應,從第三個包開始ping通。下面通過抓包分析該過程

分析PC1 這一側的情況,查看SW1 ETH0/0接口的抓包情況。

在開始ping之前,我們可以看到

在SW1創建SVI10之後,SW1在vlan 10 這個廣播域內發出免費ARP,告知10.1.1.254所對應的mac地址。

通過這樣的方式,PC1便學到了10.1.1.254對應的mac地址,不需要再發ARP請求進行學習。

第一個ping包

源mac地址爲PC1接口的mac地址,目的mac地址爲10.1.1.254的mac地址

SW1收到該數據包後,發現目的mac地址是在自己這臺交換機上,於是將數據包該看,查看IP包頭。

查看IP包頭,發現數據包目的IP地址爲10.1.2.1.查看ARP表,無對應條目。

查找路由表,匹配靜態路由,開始進行路由的遞歸查詢。

10.1.2.0/24的路由,下一跳爲1.1.1.2

1.1.1.2對應的路由爲1.1.1.0/24的直連路由,出接口爲ETH0/1

於是SW1開始封包,封裝源mac地址爲出接口mac地址,目的mac地址爲下一條ip地址對應的mac地址,這在ping開始之前的過程中,已經學到並記錄在ARP表中。

通過SW1 ETH0/1接口的抓包,我麼可以看到第一個ping包確實是這樣封裝的。

除此之外,我們還可以看到,其實是有4個ping包得到了迴應的,這月PC1上看到的現象不符,我們將在接下來解釋這個現象的原因。

當SW2從ETH0/1接收到該數據包之後,發現目的mac地址就是自己,於是拆掉二層包,查看IP包頭,發現目的IP地址爲10.1.2.1.

查找本地ARP表,此時沒有10.1.2.1對應的條目。之後查找路由表,發現匹配的10.1.2.0/24的直連路由,對應的接口爲vlan 20

於是在vlan 20這個廣播域內發出arp請求,詢問10.1.2.1對應的mac地址,這得到PC2的迴應,並記錄在ARP表中

同時,將收到10.1.2.1對應的mac地址和收到該arp返回的接口,形成對應關係,記錄到mac地址表中

在這個過程中,第一個ping包已經超時,所以SW2並沒有將這個ping包發送給PC2。

第二個ping包

在於上述相同的步驟後到達SW2,SW2拆開數據包查詢目的IP地址,查詢ARP表,發現有10.1.2.1對應的ARP條目,查詢到10.1.2.1對應的mac地址,之後在查詢mac地址表,發現要去往目的mac地址,要從接口ETH0/0進行轉發。

於是封裝該數據包,源mac地址爲mac地址表中出接口的mac地址,目的mac地址爲查詢ARP表的到的10.1.2.1對應的mac地址。將數據包從ETH0/0接口進行轉發。

之後當PC2收到這第二個ping包後,PC2需要進行迴應。

與之前的SW1一樣,在配置SVI20時,交換機SW2通過免費ARP,在VLAN20這個廣播域內發出了關於10.1.2.254的免費ARP,於是PC2便知道了10.1.2.254對應的mac地址。

於是PC2準備迴應第二個ping包,調換第二個ping request的源、目ip地址。封裝二層數據包頭,源mac地址爲PC2的出接口mac地址,目的mac地址爲10.1.2.254的mac地址。

當SW2收到該數據包後,發現目的mac地址是自己,於是拆開IP包頭,發現目的IP地址是10.1.1.1,首先查找ARP表,發現沒有對應條目。接着查找路由表,匹配到10.1.1.0的路由,如下圖:

匹配到下一跳IP地址爲1.1.1.1,進行遞歸查詢,查詢到1.1.1.0直連路由,出接口爲ETH0/1。於是開始封裝數據二層包頭,源mac地址爲直連路由的出接口ETH0/1,目的mac地址爲下一跳IP地址1.1.1.1的mac地址,這已經在ping開始之前的過程中學習到了,可以從ARP表中查詢到。封裝完數據包後,進行轉發。

當SW1收到這個數據包,查詢到目的mac地址是自己,於是拆開二層包查看三層包頭,發現目的IP地址爲10.1.1.1,查詢ARP表沒有對應條目,於是查詢路由表。匹配直連路由10.1.1.0/24,對應接口爲vlan10

於是在vlan10這個廣播域內,發出ARP請求,詢問10.1.1.1對應的mac地址。

這得到PC1的迴應,SW1收到後更新arp表和mac地址表,但此時第二個ping包的response包已經超時,所以SW1沒有將該數據包進行轉發。

這也就解釋了爲什麼在PC1上看到的是,兩個ping包沒有得到迴應,而在SW1和SW2 以及 SW2和PC2 的互聯鏈路上只有一個ping包沒有得到迴應。

第三個ping包

於是接下來,當PC1發出第三個ping包的時候,當數據包到達SW2,SW2通過查詢ARP表,封裝目的mac地址和出接口對應的源mac地址,便將數據包轉發給PC2,PC2迴應該ping包,當ping response到達SW1後,SW1查詢ARP表,得到對應的MAC地址和出接口,便將該數據包進行轉發,PC1收到該數據包,判斷ping得到了迴應。之後的幾個ping包也經歷這樣的過程,得到了迴應。


知識點總結

在ping開始之前

免費ARP

配置三層接口地址後,交換機會發出免費ARP,向外告知該三層接口的IP地址對應的mac地址。

在配置了SVI接口後,交換機會在SVI對應的VLAN二層廣播域內,發免費ARP,告知SVI接口對應的mac地址。

但是免費ARP不是一直髮送的,只在接口up的時候,會發送兩個免費ARP數據包。

ARP請求

在配置了靜態路由指定下一跳地址後後,交換機會根據靜態路由指定的下一跳地址,遞歸查詢到直連路由對應的出接口,在出接口發出ARP請求,詢問下一跳地址對應的mac地址。

這個ARP請求會反覆發送,每次發送的間隔是上一次發送間隔的兩倍。

ARP代理

(未通過本案例例證實,通過其他實驗證實)

當配置的靜態路由沒有指定下一跳地址,而僅指定了出接口的時候;交換機會根據數據包的目的ip地址,在靜態路由出接口發出ARP請求,對端交換機收到arp請求後,查詢本地的arp表和路由表,若有可以匹配的條目,則以收到該數據包的接口的mac地址,作爲該ARP請求的迴應。這又被稱作ARP代理

在ping開始之後

交換機數據包轉發過程總結

發現目的mac地址是自己的時候,纔會拆包查詢目的IP地址。如果發現不是自己,直接查詢mac地址表進行轉發,若mac地址表沒有對應條目,則丟棄。

查詢到目的IP地址後,先查詢ARP表,再查詢路由表。

若ARP表有匹配條目,封裝目的mac地址,並以出接口的mac地址,作爲mac源地址,將數據包進行轉發。若ARP表中的出接口爲vlan,則根據ARP表對應的mac地址,查詢mac地址表,根據mac地址表的出接口進行轉發;若mac地址表沒有查詢到對應條目,則在這個vlan的二層廣播域中,發ARP請求,更新mac地址表。

若ARP表沒有匹配條目,查詢路由表,若路由表指定了下一跳的IP地址,根據路由表遞歸查詢到直連路由,以直連路由出接口爲源mac地址,下一跳ip地址對應的mac地址爲目的mac地址,進行封裝轉發,下一跳IP地址對應的mac地址,在完成靜態路由的配置後會自動學習到。

若路由表中僅指定了出接口,沒有指定ip地址。則會在出接口,針對數據包的目的ip地址發出arp請求,當出接口對端的交換機收到該ARP請求後,查詢本地的ARP表和路由表,如果有對應查詢結果,則返回收到該ARP請求接口的mac地址,作爲ARP代理,交換機收到該返回後,直接更新ARP表,將數據包目的IP地址對應的mac地址更新爲對端接口的mac地址。並且數據包以此作爲根據封裝二層數據包,完成轉發!

我將在後續,針對上述描述輸出流程圖,方便之後的查閱。


尾巴

交換機轉發數據包的原理,遠比我們看到的要複雜,有很多技術細節值得被注意,也很容易被遺忘。就好像很多人認爲網絡工程師僅僅是陪陪靜態路由,配置vlan一樣,網絡連接的過程遠沒我們表面看到的那樣簡單。同時,網絡工程師也要夯實基礎,在能夠熟練完成配置,實現工作需求的基礎上,瞭解網絡的工作原理,這將爲我們排除故障起到有效的幫助。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章