1. 程式人生 > >兩層網路、三層網路的理解

兩層網路、三層網路的理解

對於搞IT的同行而言,大部分人都不會直接和網路打交道,因此除非從事網路開發,否則對網路內部機制也不會太關心,但是明白網路資料是怎麼走的,這對每個IT工程師應該是很重要的基礎知識。網路資料包如何在網路上游蕩,長久以來也困擾了我很長時間,現在把這部分內容總結分享一下。

  說起網路,大家不約而同會想起大學課本上那個臭名昭著的ISO七層模型,但是ISO模型只是提供了一個參考,並不是具體實現,目前我們使用最多的實現其實是TCP/IP協議族。但是對於TCP/IP,除了表示層和會話層沒有體現,其它幾層和ISO基本是對應的,從這個角度講ISO模型還是有參考意義的。

  不扯那麼多,我們落地一點:

  • 對於物理層而言打交道的基本都是電訊號和光訊號,例如網絡卡、光纖、雙絞線等都被歸到物理層考慮;
  • 對於鏈路層,資料在離散電/光訊號的基礎之上,被邏輯劃分成一幀一幀(Frame)來管理,這一層是資料交換的主要層面,交換的依據主要是網絡卡MAC地址,乙太網(定義了一種幀格式)、交換機、集線器都劃歸這一層;
  • 網路層是比鏈路層更高一級的邏輯層,在這一層主要工作的是路由器,路由器基於IP地址進行跨網鏈路的計算;
  • 傳輸層顧名思義是用來控制網路層傳輸的,因為網路層只是一個“盡力而為”的層,其傳輸不是完全可靠的,如果將超時重傳等可靠性保障機制都交給程式設計師來做,估計大部分程式設計師都要瘋了,幸好有了傳輸層提供了TCP和UDP兩種機制給我們,才讓我們可以高枕無憂的傳輸資料,而我們在程式碼裡要做的只是開啟一個傳輸層的套接字(即Socket)就可以了;
  • 至於表示層和會話層我們就不多做理解了,這兩層基本只是擺設;
  • 應用層是最高層的協議,Web HTTP協議、遠端登入SSH協議等都被劃歸這一層,確切來說這一層已經不屬於基礎網路了,基本都是軟體自定義協議。


  理解了網路各層的概念後,我們再回過頭來看,在這七層中網路層、鏈路層、物理層屬於低三層,其餘屬於高四層,從字面上可以看出傳輸層以下才是真正通過網路傳輸資料的層面。對於物理層,主要定義的是各種傳輸介質的訊號傳輸方式,比如時鐘頻率、電平高低、通道編碼等,這一層只是機械的傳輸,不涉及資料包選路邏輯,鏈路層(L2層)和網路層(L3層)才是我們要理解的地方。

  首先看L2鏈路層,這一層以幀(Frame)為單位組織物理訊號,每個幀都需要有一個源地址和目的地址,絕大多數情況下使用的都是網絡卡MAC地址。這一層主要的資料轉發裝置是集線器和交換機,對於集線器,由於每一個數據幀都會被複制到各個埠,使每個連線主機收到很多跟自己無關的資料幀,這直接導致主機和集線器之間通道衝突劇烈(衝突域屬於物理層概念),因此現在基本不用該裝置。而交換機則具有MAC地址學習功能,能夠向各個埠準確投放資料幀,這樣就大大提高了資料傳輸效率。對於L2層,交換機只能轉發一個子網內的資料幀(子網是通過IP地址劃分的),如果要將一個數據幀跨網轉發,則需要藉助於L3層的路徑規劃功能,這個一會再說。

  現在假設有如下網路拓撲結構,ABCD四臺主機屬於10.0.0.0子網,閘道器都指向路由器的10.0.0.1埠,EFGH屬於10.0.1.0子網,閘道器指向路由器的10.0.1.1埠。


   先看同一子網內的通訊的情況(A向C傳送資料,這種情況下都是通過IP地址指定的),假如所有的主機、交換機和路由器都剛剛加電,內部沒有快取任何MAC對映表和路由表。A在傳送之前,發現C和A在同一個子網內,於是A試圖先在物理子網內找一下C,但是在同一物理子網內是通過硬體MAC地址來定址的,而A此時並不知道C的MAC地址,於是A通過ARP廣播來試圖獲取,發出的廣播包包括如下類似內容:(注:廣播時用的MAC地址是ff:ff:ff:ff:ff:ff)


  交換機1在收到這個ARP廣播包後,首先學習到了主機A原來是和1口連線的,然後在快取中查詢C的MAC地址,但是最終沒有找到,於是交換機1將這個包從所有埠(連線A的1口除外)發出去,交換機2收到後也會繼續廣播出去。當主機B和D收到這個廣播包之後,發現和自己無關,於是便直接丟棄這個包,不做任何處理;C收到這個廣播包後,發現原來是找自己的,於是它發出如下類似格式的迴應內容,來告知A自己的身份。


  這個過程對於所有參與的交換機也是個學習的過程,因此交換機1和交換機2也學習到了A和C的位置。至此AC相互找到對方後,便可以在同一物理子網之間直接通過指定MAC地址通訊了,他們傳送資料幀的類似格式如下:


  下面再來看跨物理網路通訊的情況(A向E傳送資料),同樣假設裝置都剛剛加電,快取為空。A發現E的IP也是同一網段的,於是又開始廣播,但是這次BCD都沒有迴應。我們此時把視線轉到路由器1上,當路由器1收到這個ARP廣播包後,為了避免廣播風暴的產生,路由器1不會繼續廣播這個ARP包,但是路由器1會把自己的MAC告訴A,回發如下類似格式的內容:


  A在等待超時後,發現當前物理子網內找不到E,但是A已經知道了閘道器路由器的MAC地址,於是便會將發給E的資料包扔給閘道器(也就是路由器1的1口),路由器1收到這個包後,發現E的IP在自己內部也沒有快取,於是路由器1也開始了尋找E的過程。相比交換機的子網內“廣播找人”,路由器的選路範圍更大也更復雜,很多情況下是整個Internet,並且要誇多個運營商,所以在L3層面路由器的路徑計算協議較多,包括:RIP、OSPF、IS-IS、BGP、IGRP等協議。路由器之間計算路徑時,任何一臺路由器都是無法窺探整個網路的,因此每臺路由器都只是通過選路演算法找到下一跳的最優路徑,這些最優路徑連線起來便形成了一條完整的路徑。換句話說,路由器的轉發路徑不是一個路由器選擇出來的,而是一群路由器共同選擇出來的下一跳地址序列。具體的路由選路無法一一講解,大家感興趣可以自己調查一下,這裡假設路由器1直接找到了路由器2。

  我們繼續往下探索,當路由器2接到尋找主機E的廣播包後,發現E位於自己的網路中(當然也提前需要一個廣播學習的過程才能知道),便向前一跳路由器(即路由器1)反饋自己離主機E最近,最終經過這樣一個“A→閘道器路由器→路由器間選路→找到主機E所在子網”的過程A終於可以與E進行通訊了,由於A和E之間經歷了多個物理子網,因此需要多次的L2轉發才能實現資料包的到達,這個過程中L3層IP包外包幀的MAC地址會不斷變換。A→B→A這個過程中,資料幀和IP包的地址經歷過程如下(假設A使用的是本機的88埠,B使用的是本機的99埠):


  在這個過程中,資料包在路由器1和2的1<-->4口之間傳遞時,由於是在一個裝置內部,因此可以直接轉發,而不用變換幀頭,從而提高轉發效率。如果A要與其它子網的FGH主機通訊,過程基本是一樣的,只不過剛開始不會先在當前子網內“廣播找人”,而是直接將資料包投遞給出口閘道器。

  本文旨在向大家展示L2交換機和L3路由器在轉發網路資料時的一個主要流程,希望能給大家帶來幫助。由於3層跨子網計算IP包投送路徑協議比較多,先請大家自己參考其它資料。