1. 程式人生 > >linux網路協議棧(五)網路層 (1)L2與L3

linux網路協議棧(五)網路層 (1)L2與L3

5.1、L2與L3:

網路的目的是使可以訪問不同主機的資源,僅以最簡單的使用如訪問我們軟體四部閘道器技術組的伺服器,是通過訪問192.168.36.XXX的IP地址達到訪問那臺主機的目的,而我們自己的主機IP都是192.168.10.XXX,我們的主機和閘道器技術組的主機不在同一個網段內,這和我們訪問我們自己的伺服器192.168.10.22/192.168.10.72是不同的。

5.1.1、相同網段的訪問:

事實上無需閘道器192.168.10.1,我們即可訪問程式碼伺服器、ixia測試儀、其他主機,可以試著把主機的預設閘道器去掉或換成一個別的IP地址,依然可以訪問上述主機,也就是說只需二層交換機即可達到此目的;但此時如果訪問閘道器技術組的主機是不可能了,如肯定無法ping通192.168.36.106。

如我的主機是192.168.10.55,要訪問程式碼伺服器1即192.168.10.22,那麼當我發出一個目的IP為192.168.10.22的IP包時,我的網絡卡必須弄清楚對端的鏈路層地址,這對於鏈路層實現是乙太網的網路來說,就是MAC地址,可是第一次傳送時我的網絡卡並不知道這個程式碼伺服器1即IP地址為192.168.10.22的主機的MAC地址是什麼,這就必須需要一種能夠獲取對端MAC地址的方式;

對於鏈路層來說,這種能夠記錄L3地址和L2地址關係的方式是由“鄰居系統”實現的,所謂“鄰居”簡單理解就是“可以直接訪問的其他主機”,具體對於以IP協議為L3協議的網路來說,這種“鄰居”的實現方式是通過ARP協議實現(需要注意對於IPV6就變成了ND協議,它類似ARP協議,對於其他三層協議也有其他類似的方不同方式);

關於鄰居和ARP具體內容可參照7.3、7.4兩節,這裡先知道在IP/乙太網的網路中,通過ARP協議,我的主機首先廣播發送給所屬廣播域中所有主機“who is 192.168.10.22”,然後192.168.10.22的主機將回復“我是”給我的主機,我的主機由報文中的源MAC即可獲知192.168.10.22主機的MAC地址,並把它記錄下來,同時還會記錄在該IP報文對應的路由快取中,這樣以後就可以直接發了不用再查鄰居表項,關於路由的內容見後面幾節),這樣192.168.10.22的主機就是傳送者的一個鄰居(通過ping或檢視ARP快取表測試IP是否可達,是我們日常處理問題的常用方式);至此,我的主機獲知了192.168.10.22主機的MAC地址,這樣我就可以和它收發包了。

至於上圖的二層交換機,它的本質作用還是集線轉發(當然二層交換機還有很多其他二層相關的功能這裡不討論),只是它比起集線器優勢在於它可以按照按MAC地址轉發(即MAC地址學習功能,事實上是MAC+VLAN轉發,先不討論vlan),記錄從每個埠進入的報文的源MAC,以此獲知每個主機對應的交換機埠;這樣隨著同網段的所有主機不斷髮送報文,交換機學習到了所有主機的MAC地址和交換機埠的對應關係。

但是如果把我的主機的IP地址改為其他網段如192.168.11.55,那麼就沒法訪問區域網內其他192.168.10.XXX的主機了,要傳送的報文甚至在我的主機內的IP層就被丟棄了,而如果某臺主機也改為192.168.11.XXX,那麼就可以了,這裡的原因就是L3的內容了。

5.1.2、不同網段的訪問:

還如上面的圖所示,如果我的主機192.168.10.55希望訪問192.168.36.106,那麼會發出”who is 192.168.36.106”的ARP請求報文,這時其他主機除了路由器閘道器192.168.10.1外都無法回覆我,192.168.10.1這時必須行使其ARP代理功能,回覆我的ARP請求,那麼我的主機就會認為它就是192.168.36.106,記錄下IP地址和MAC地址的鄰居資訊,從此以後需要訪問192.168.36.106就發報文給它,而實際上需要192.168.10.1把報文轉發給192.168.36.106,事實上對於192.168.36.106情況是一樣的,它也不知道192.168.10.55是誰,它也認為包括我在內的訪問者都是192.168.36.1。

所以,跨網段的訪問,需要路由器閘道器去轉發,當然這需要路由器知道是否應該轉發以及轉發到哪裡。這就是路由器閘道器存在的最基本意義,連線不同網段內的主機。這也就是為什麼我們的電腦都設定192.168.10.1為預設閘道器的原因。

5.2、L3都在做什麼:

5.2.1、IP網路基本原理:

L3網路層之所以存在最大的原因是整個網路由都是一個個的以IP地址為標識的主機拓撲的,也就是說,網路中不論是哪部分的哪一個主機,無論它是使用者終端和伺服器,還是用於傳輸轉發報文的路由器閘道器,都是一個個以IP為標識的主機,儘管每個主機的每個網絡卡都有理論上唯一的MAC地址標識,但實際的網路通訊是以IP地址標識每個主機,這裡的原因有很多,最重要的原因是IP地址的子網劃分方式(涉及IP組網相關知識),這裡不討論細節,簡單的說就是一個“大網”IP地址及其頻寬接入其底下若干子網,直觀的例子就是軟體四部這個子網都通過192.168.10.1接入到一個更高層次的子網,然後包括192.168.10.1在內的一些子網又接入到某個更高層次的子網,而這些更高層次的子網研發中心最終會接入到一個或多個能接入Internet的核心路由器閘道器IP地址(如我司研發中心的公網地址應該是1.202.176.232/32),也就是說根據需求把整個Internet劃分成一個個的子網,每個子網又劃分成一個個的子網……這樣整個網路的主機是以層疊不窮的大大小小的子網組成,子網與子網之間以路由器閘道器相連線,每個路由器需要記錄的地址表資訊就可以相對少很多,這樣就大大減輕了傳輸轉發裝置即路由器閘道器的負擔(當然負責主幹通訊的路由器所需地址表還是非常龐大的),可以設想下如果以MAC地址去定位每個主機,這將要求傳輸轉發裝置要記錄非常海量的其他主機的地址資訊,檢索它們將極其繁瑣,所以雖然MAC地址是每個網絡卡的唯一標識,但以MAC地址去標識、定位每個主機是不現實的。

所以L3層最大的作用就是把報文傳送到它應該去(的IP地址)的主機,不論這些報文是廣播報文、組播報文還是單播報文,只要是IP報文,L3層的網路傳輸裝置就會通過檢索路由地址表尋找該報文應該走向何方。至於這些報文是傳送給該主機上的哪個應用程式,這是L4傳輸層的功能。

需要注意的是,L3層並沒有什麼確認、重傳機制,也就是說是不保證一定能夠收發,真正意義的確認、重傳機制是做在L4傳輸層的TCP協議,它提供了通訊的保證機制,要直到收發成功為止。

5.2.2、L3層的其他功能:

除了確定報文走向,L3層還有一些其他功能:

可根據IP協議欄位實現L3的一些qos功能諸如限速等等,如依據tos欄位標識不同報文的不同傳輸服務,這部分詳見5.3節;L3還實現了超長報文的分幀,這部分詳見5.6節;

不論是基於linux的協議棧實現還是其他一些協議棧實現(如cisco),都可以在L3實現策略路由,即可以通過標識不限於IP協議欄位的報文中的其他欄位,如L4協議欄位、L5協議欄位或其他報文內容欄位,實現對報文做特殊標記,對不同標記的報文根據需求做出不同的路由選擇,比如讓重要報文走高頻寬介面,其他報文走低頻寬介面,注意策略路由的實現不僅需要路由模組的iproute工具,還需要安全模組工具的iptable工具的配合,這涉及netfilter的內容。這部分詳見5.4節;

此外基於L3可實現多主機使用同一接入IP地址訪問公網(NAT穿越)、遠端安全的訪問目的地的方式即虛擬專網(VPN),這兩部分詳見5.7節。