寫靜態路由中,寫下一跳ip和出介面有什麼區別? 為什麼只寫出介面會導致有時不通?
發現有的時候如果只寫出介面,不寫下一跳IP,會導致業務不通。
但不清楚原理是什麼, 以及為什麼會這樣
初學者容易進入一個誤區:喜歡從人的角度來揣摩路由器的行為,而不是以路由器的角度來看問題,所以就會覺得莫名其妙。
話說某快遞公司,凡是從上海發往北京的快遞,都需要在無錫中轉,如果讓司機拉著這些貨,運到無錫,司機一定有一個問題:運到無錫哪裡?那需要告訴司機一個具體地址才行,如果我們不告訴司機,說明司機知道,可是路由器是什麼?是一台機器啊,你不告訴它貨物(IP包)的中轉地址,它是不會知道的,所以需要明確地告訴它,中轉站無錫的地址是:桃花島666號,然後路由器就會向老司機一樣,拉著貨物奔向桃花島666號。
同學們對於多路訪問鏈路,比如乙太網、幀中繼,ATM網路概念不是很清晰,所謂多路訪問,就是這個介面連接的不是一台設備,也可能是多個網段的設備,需要明確地知道是和哪台設備做二層的通信,所以需要明確地知道其IP地址,然後再解析為二層地址。
而點對點鏈路,如PPP、HDLC,可以理解為一根水管,貨物可以順著水管流到對端,而無需任何二層地址,所以自然也不需要對端的IP地址。
再重申一下,為何需要下一跳的IP地址?因為需要知道其二層地址!想學好計算機網路,歡迎來參加下一個live,與其說是live,不如說是一個《計算機網路》課程的一節課。在這個live里會詳細講解如何利用簡單工具做深入網路診斷:https://www.zhihu.com/lives/917034736428404736如果出介面是點到點介面比如hdlc或ppp封裝的介面是可以的。
但出介面是乙太網就不行了,因為乙太網介面是廣播型介面,可以經過交換機或hub連接多個下一跳設備。不指定下一跳IP的話路由器無法通過arp解析到下一跳的MAC地址,從而無法完成出向乙太網幀報文頭的封裝。
以上知識在Juniper或其他廠商文檔里都有詳細說明一個乙太網里可能不止一個網關
你是餓了么送餐員,你接了一個外賣單,送餐地址是西長安街1號,你順順噹噹的送到
你又接了一個外賣單,送餐地址是讓你上了長安街往西走,你肯定會送不到,長安街這麼長具體要到哪?
在一個廣播鏈路環境下(比如最常見的乙太網),你寫出介面不寫下一跳就和別人告訴你上長安街往西走一樣
只不過路由器比你更任性
你可能為了送餐提成還去找一找打個電話問一問
路由器直接撂挑子了,來啊我就是不轉發你來砸了我啊
——————————吐槽臉和正經臉的分割線————————————
在廣播鏈路(乙太網)中,需要通過下一跳網路層地址(IP地址)解析出下一跳的鏈路層地址(MAC地址),才能完成一個能在這個廣播鏈路(乙太網)上傳輸的幀
點到點鏈路就不存在這個問題
知乎首答
這個問題似乎只有在思科設備上才會存在的疑惑,在其他廠商的設備上,如果你靜態路由工作在一個多路訪問的網路(乙太網)環境下,那麼你只寫出介面命令是敲不上去的,必須要求你跟上下一跳,但是思科無論你是只寫下一跳,還是只寫出站介面,命令都可以結束
那麼問題來了,為什麼在乙太網環境下寫出站介面就有時候通,有時候不通呢?什麼時候通,什麼時候不通呢?
首先,你需要想清楚一個關鍵的點,就是乙太網環境下,設備之間的通信不僅僅需要知道對方的IP地址,還需要知道對方的MAC地址,如果你的靜態路由是只寫了下一跳IP地址,那麼在設備的路由表中,你會發現對應的路由條目沒有出介面,這說明什麼?說明設備需要針對下一跳再查一次路由表,我該如何到達這個下一跳啊?設備發現,這個下一跳和我直連啊,因此三層沒問題了,二層呢?ARP啊!!因此本地設備會直接對下一跳做ARP,獲取MAC地址,封裝數據包,轉發,搞定,你網路就通了
但是你要是寫了個出站介面呢?那關鍵點還是在於路由表,這裡有一個我個人覺得很重要的點,就是這個靜態路由在路由表的表現形式,你發現了嗎?和直連路由是一樣的!!!儘管目標網段和你本地設備不直連,但是因為你靜態路由寫的是出站介面,設備自己認為就好像這個網段直接連接在了這個出介面上,這會發生什麼事情?設備發現,既然是直連的,那我直接對這個目標網段做ARP啊,好傢夥,問題來了,設備直接對一個非直連網段做了ARP請求,很顯然,這個請求真的能到達目的地嗎?顯然不能,只會被下一跳設備收到,那麼下一跳設備收到了這個ARP請求怎麼辦呢?設備發現這個不是找我的啊,因此按照我們的想法,設備會丟棄掉這個ARP請求,對吧,但是思科設備的乙太網介面默認情況下開啟了代理ARP功能,什麼是代理ARP啊?就是設備收到一個不是請求自己的MAC地址的ARP請求的時候,不會立刻丟棄,而是會查找自己的路由表看自己有沒有去往目標網段的路由條目,如果有,就把自己的MAC地址以ARP應答的形式發送出去,沒有才丟棄這個ARP請求呢,這樣以來,如果你下一跳設備的路由條目正確,設備會把自己的MAC地址響應給本地設備,你發現什麼問題了嗎?本地設備歪打正著的獲取到了真正下一跳的MAC地址,數據也能正常轉發了,可以你如果在下一跳設備上把代理ARP功能關閉掉,你就會發現,你ping不通了,這就是你為什麼靜態路由只寫出介面,有時候能通,有時候不通的原因
一、背景知識1——現代路由的構成
現代路由器一般是採用控制面與承載面分離的設計。高效分工、各司其職。
控制面:即路由器的CPU。主要是處理路由協議(ospf、ISIS、BGP)等決策性工作。
承載面:即介面、交換模塊。進行具體的包轉發工作。
各自職責:控制面作為「領導」,確定戰略方向後,將工作細化成可執行的單元,下發給介面板上的轉發信息表FIB。報文到達時,各個介面直接查詢FIB就能完成傻瓜似的轉發。
為什麼這麼設計?
為了提高轉發性能。介面板其實是有自己的專用處理器(華為叫NP,網路處理器),可對報文進行硬體級轉發。所以,各個介面板其實是並行工作的,可以做到線速轉發。
二、背景知識2——路由器的工作原理
路由器轉發過程:
------------------------------------------------------
1.入介面處理
路由器收到這個報文,鏈路層將物理層的比特流解析為幀。如果報文的目的地址是路由器本身(包括MAC地址、PPP等),則進行三層解析。2.三層解析、查路由表
路由器進一步解析報文,得知幀所承載的協議類型為IPv4(協議類型值=0x800),即需要進行IPv4轉發;查路由表(實際是介面板的FIB表),得知該報文並不是發給自己的,而是需要送往出埠Port2,因此,路由器不再繼續分析IP頭後面的內容。3.出介面處理
注意:在前面的過程中,IP報文的二層已經被剝離,但三層的源IP目的IP是沒有被修改過的(IP的TTL要減一)。
那麼出介面上需要做什麼呢?需要確定二層的源地址、目的地址。
需要確定二層的源地址、目的地址。
需要確定二層的源地址、目的地址。
然後封裝二層信息,從出介面發送出去。
三、該問題的答案
總結上述:在發送報文時,路由器需要確定出介面上二層的源地址、目的地址。
兩種情況解釋:
1、寫路由時同時寫出介面和下一跳IP
如果出介面的二層是乙太網,則根據下一跳IP進行ARP過程,尋找下一跳IP的MAC地址作為目的MAC,出介面的MAC作為源MAC。拿到這連個欄位口就可以進行二層封裝,然後從出介面轉發出去。
如果出介面是PPP/HDLC等P2P鏈路,這些鏈路的目的地市都是固定的,可以直接封裝、轉發。
如果出介面是幀中繼FR等NBMA網路,類似於ARP緩存,則會查詢目的IP至DCLI的映射表,查到後即可轉發,否則封裝失敗,報文被丟棄。
2、寫路由時只寫出介面不寫下一跳IP
如果出介面是PPP/HDLC等P2P鏈路,和1類似,直接封裝、轉發。
如果出介面的二層是乙太網,那麼既然路由表中沒有規定下一跳,那就只能使用報文中IP目的地址作ARP請求。如果有ARP回應,則封裝成功、轉發;如果沒有回應則失敗。
默認情況下,如果目的IP和該介面廣播域不在同一個網段,或者該廣播域中沒有該IP,那麼必然沒有回應,也必然會封裝失敗。
那有啥辦法可以解決該問題嗎?
有,在相鄰路由器的對應介面上,啟用ARP代理功能。如果鄰居路由器的路由表中有本路由器ARP請求的目的地址,則會返回相鄰介面的MAC,「欺騙」本路由器,完成二層封裝過程。
以上。
以前的筆記。
關於路由配置中,寫下一跳地址和本地出介面的區別
本地出介面的管理距離是0,下一跳地址的管理距離是1。
當寫下一跳地址時,路由器將遞歸查詢路由,耗費路由器資源,最終仍然是關聯到本地出介面
當寫本地出介面時,路由器會認為從本地出介面的路由是自己的直連,將直接封裝對方MAC,來發數據包。若鄰居路由器直連介面關閉了ARP代理,則無法獲得ARP應答包造成無法封裝,即路由表正常也不能正常發數據,如果鄰居路由器開啟了ARP代理,那麼查詢目標之後發現有路由,則用自身介面去MAC去回復ARP請求,並將數據轉發
思科路由器配置路由表時,可以同時寫本地出介面和下一跳地址(推薦)
簡單說吧,在p2p介面下,兩種配法在主流路由器實現基本沒啥區別。在multipoint 情況下,有區別。寫nexthop 需要做next hop的L2 resolve,寫interface時候,設備會認為這是direct connected,所以會對轉發目標地址直接做L2 Resolve,注意是對轉發包文的Destination 做L2 resolve,並不是沒有L2解析。這種場景在multibind介面有使用,如果multibind介面 enable arp proxy,那麼下面設備根本不需要配置gateway,直接靜態指向interface就ok。國內主要有些地方做點到點以太上網專線有用這種solution。思科有個文檔說的很清楚
在MA網路,只寫出介面,當有數據幀過來的時候,路由器會發arp請求,如果對端設備開了arp代理,對端設備又有去往該目的地址,這時候就會響應,數據幀就可以發送出去。缺點嘛就是arp表項比較大,來一個請求一個,也影響效率。
路由三要素:目的地址Dest、下一跳地址NextHop、出介面Port。
Dest告訴了數據包的最終目的設備是誰;
NextHop告訴了數據包如果要到達Dest下一步該去誰;
Port告訴了數據包要去往NextHop該從哪兒出發。
舉個栗子。
從南京坐火車去合肥。
這裡把南京和合肥都想像成路由器,
那麼南京的port1=南京站,port2=南京南站;
下一跳分別為NextHop1=合肥站,NextHop2=合肥南站;
目的地dest=合肥,本地地址為南京;
全部可行的路由路徑應該是:
dest Nextport port
合肥 合肥南站 南京南站
合肥 合肥南站 南京站
合肥 合肥站 南京南站
合肥 合肥站 南京站。
你看,下一跳和出介面缺一不可。缺了誰數據包都不知道該從哪裡走。
通信萌新的淺薄的回答,歡迎各位大佬指正
一個小數據包,懷揣著對目的地的美好期望,去問路由器大叔怎麼走~~
大叔說,瞅著,打那個門出去就得~~~~
小數據包興沖沖的衝出了指定的門……我艹~~外面是一片曠野,地上跑的天上飛的水裡游的,去哪的都有……我的理想在哪兒啊?路由器大叔這不是坑我么……
推薦閱讀:
※科技袁人第二彈:有人覺得中國科技太弱,因為全世界除了中國只有一個國家:「外國」 | 風雲之聲
※最具潛力的下一代顯示技術:Micro LED
※他將愛爾蘭最有趣的「科學畫廊」推向全世界,更帶著「黑科技」驚艷達沃斯
※紙質本秒變手寫板?!筆記本界的Gucci做到了......