1. 程式人生 > >網路層-network layer(下):網路互連、子網掩碼計算方法、Ipv4報頭解析

網路層-network layer(下):網路互連、子網掩碼計算方法、Ipv4報頭解析

# 第五章 網路層-Network Layer(下) 上一章講了網路層的任務、提供的兩種服務、五個重要的路由演算法、以及網路層的擁塞控制和服務質量問題。這一部分主要講一講網路互連問題和Internet的網路層。(包括IP協議、ip地址、ip報頭格式等等問題) # 5.5 網路互連 在這一部分,我們將主要討論多個相同或者不同的網路,是怎麼相互連線,形成簡單的網際網路(internet)的。 ## 5.5.1 連線方式 ![image-20201127212556076](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222934585-980734120.png) 如上圖。處於最左邊的源機器,如果想要與最右邊的目標機器通訊,需要經過如下幾個步驟。 首先,源機器的傳輸層將資料與目標的IP地址(後面會講到),一起封裝進源機器的MAC層網路內(這是一個802.11無線區域網)。之後,802.11的MAC層會根據之前學過的種種協議,將這個資料幀傳送至該網路下的路由器處。這個網路的路由器收到資料幀後,去掉幀頭幀尾,解析其需要傳送到的目標IP地址,再通過網路層協議(這些協議使用了我們之前學到的種種路由演算法),尋找一條合適的路徑到達目標機器所在的路由器處。最後,這個路由器再根據目標機器處網路的相關協議(例如這裡是802.3乙太網)將資料包送至目標機器。並在解析後到達目標機器的傳輸層。 總的來講,雖然源機器和目標機器處於不同型別的MAC層網路下,但是通過網路層的路由器和路由演算法,兩臺機器的相互通訊成為了可能。 ## 5.5.2 隧道 ![image-20201127220154066](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222934904-579749178.png) 隧道技術的存在允許了連線兩種不同型別的網路(而不僅僅是MAC層)。例如上圖中,巴黎和倫敦所在的網路都是IPv6協議的,但是兩個之間的路由器卻全部使用了IPv4協議。在下一章中我們會講到,IPv4與IPv6具有不同的定址方式和報文格式,因此不能簡單的相互傳輸資料。而使用隧道技術可以解決資料包在這兩個網路上傳輸的問題。如圖中所繪製的,在IPv4網路內傳送時,資料包又被包裹進一個IPv4的資料包內。 ![image-20201127220713753](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222935140-1686658966.png) 這一過程就好比汽車被裝進火車裡運送一樣。如果讀者還有疑慮的地方,有關IPv4和IPv6的內容將在下一節詳細講到。 ## 5.5.3 資料包分段 在網路層傳送資料包的過程中,還會遇到各種各樣的具體問題。以下是資料包分段技術的描述、使用原因應用。 #### **a. 使用原因: 由於硬體條件、政治因素等考慮,有些網路的尺寸太小,無法傳輸過大的資料包(就好比火車軌道標準不同的問題)。** #### **b. 分類(2):** - **透明分段**: ![image-20201127221503550](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222935449-1537204472.png) 這幅圖片很形象地解釋了透明分段的特點。在透過某個小容量網路前,資料包會背分割成小段,而一旦度過了這部分“狹小地區”,資料包又會被重新組合。這樣一來,後續的router其實並不知道發生過分段。 **缺點:出口router'必須知道是否接收了全部分段** - **非透明分段**: ![image-20201127221709935](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222935844-1314975086.png) 非透明分段與之相反,即:資料包在分段之後不再被組裝回去,一直到他們到達了目標機器才會進行組裝。 **缺點:1、增加了開銷,因為每次分段後需要新增額外的報頭;2、增加了丟包的風險** #### **c. 應用:路徑MTU發現(path MTU discovery)** 路徑MTU發現技術被用來解決資料包分段過程中產生的一些缺點。 - 採用策略使得在網路層中避免分段 - 每個資料包在內容中專門標註出是否允許拆分 - 如果router接收到的仍然太大且不能拆分,那麼會選擇:1、丟棄這個包/2、生成一個報錯資料發回。 ![image-20201127222908713](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222936097-1013936927.png) 如圖,一個數據包在不同的網路需求下重試了多次。 # 5.6 Internet的網路層 恭喜!你終於讀到了整個網路層的最後一節。在之前的內容裡,我們講解了網路層是如何把不同的底層網路連線起來,並使用路由演算法尋找到一條合適的資料傳送路線的。同時我們也研究了網路層怎樣應對擁塞、提升服務質量等實際問題。下面會簡單介紹一下現實生活中的一個實際例子,因特網的網路層。(就像介紹802.11和乙太網的MAC層一樣) 在設計之初,因特網的網路層即有以下幾個原則: ![image-20201128205950424](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222936806-1055912686.png) ## 5.6.1 IPv4協議 IPv4的全稱叫做Internet Protocol version 4。介紹這一部分之前,我們先從介紹IP資料報本身的格式開始 ![image-20201128210532546](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222937332-418306179.png) 上圖是一個IPv4協議的頭。一個典型的IPv4報頭共有32Bit*(5+n)大小,當然這個長度不是一定的,後面還有一個欄位可以增加(**這裡請讀者們注意,不要把報頭的大小和地址長度搞混了。地址長度是32位**)。下面分別來介紹一下其中重點欄位的含義。 首先是版本欄位。該欄位記錄了資料報屬於哪個版本。不同版本的資料包擁有不同的分配方式、長度,因此標註版本是很重要的。這裡順便提以下,除了IPv4,還有一個經典的版本就是IPv6。兩者有很大一點不同在於IPv6的地址長度不同,因此可以提供更多的地址空間。在IPv4剛剛誕生的時間裡,地址還很充裕。但是隨著網際網路規模的不斷擴大,可用的地址會越來越小,最終耗盡(讀者可以聯想以下北京的房價升高的原因)。因此,更換成空間更加充裕的IPv6協議是一個很棒的發展方向,儘管也有其它技術能夠利用短缺的地址空間(之後會一一看到) 之後需要特別提及的一個欄位是標識欄位(identification):這個部分的作用是表示新到達的分段屬於哪個資料報。因此同一個資料報所含的分段具有同樣的標識值。如果有同學已經想不起來資料報是什麼,需要重新回到本章第一節再讀一讀。 DF的含義是“不分段(Dont Fragment)”:這是針對路由器的一條命令。這個欄位被用在路徑MTU發現的過程之中。如果一個數據報的DF位表示它不能被分段,且不符合路由器的流量限制,那麼路由器會返回一個報錯資訊。 MF“更多的段”(More Fragments)同樣只有一位,且也與分段有關。在一個數據報被拆分出的諸多小段中,除了最後一段之外都需要設定這一位以提示接收方什麼時候全部分段都已經全部到達。 最後一個需要特別提及的欄位是分段偏移量(Fragment Offset):這一欄位指明瞭當前段在所有分段中的位置,以幫助接收方重組。由於這個欄位的長度只有13位,所以一個數據報最多擁有8192個分段。同時,除了最後一個段以外,其它所有段的長度必須是8位元組的倍數,並小於最大長度。 **MF、Fragment Offset、identification三個欄位共同合作,實現了在上一章中所講的分段技術。** ## 5.6.2 IP地址(重點) #### IP地址長度 IPv4一個非常明顯的特徵在於其地址長度。**IPv4具有32位的地址長度,而IPv6的地址長度是128位。**這一點請各位當作常識記住。 #### 網路介面與IP地址 **每一個IP地址並不指向一臺真正的主機,而是指向一個網路介面。**只不過,大部分情況下,我們的電腦只存在於一個網路之下,所以只有一個IP地址(如果主機同時接入了兩個網路,那麼就會有兩個地址)。同時,**因為一個路由器具有多個介面,所以具有多個ip地址**。 #### IP地址的書寫方式 在IPv4中,一個地址具有32位長度。**這代表著一個地址是由32個二進位制位元位組成的。**但是在定址的時候,尤其對於人類來講,我們使用的更多是**點分十進位制表示法**:一個地址32bit---》4byte--》四個十進位制數使用小數點作為間隔,分開表示。 例如一個32位的地址(由於實在是太長了,這裡用16進製表示:80D00297),我們按照位元組進行劃分,得到80.D0.02.97,再把每一部分換成十進位制表示,得到了點分十進位制表示法為:128.208.2.151。 #### 子網:字首、子網掩碼與子網劃分 介紹子網之前,首先介紹一下**字首(prefix)**:前面講到,ip地址具有天然的層次性。因此當我們想要分配一片連續的地址時,可以獲得相同的高位,同時在低位連續(想象一下電話號碼:6315-4210到4220可能屬於同一個公司或機構)。這時,這快連續的地址空間就被稱作字首。 ![image-20201129103433158](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222937590-1373479276.png) 上圖中的prefix部分標註出了字首的長度:L位。因此一共有32-L位可以供主機使用。當機器(比如路由器)想要獲知這一資訊的時候,往往採用的是**子網掩碼(subnet mask)**技術。**子網掩碼是一串與ip地址長度等長的位元。其網路位全部為1,主機位全部為0。在路由器收到這一串位元流後,會將其與IP地址進行AND操作,這樣就可以很快的提取出ip地址的網路部分。** 現在問題將變得更加複雜。 為了避免衝突,網路地址管理由一個稱為ICANN的機構統一負責。現在的問題是,當對網路地址空的需求時動態問題時,該怎樣分配處合理的空間(比如同一機構,在申請完成自己地址空間的之後幾年又需要新的地址,且最好可以連續)。問題的解決方案是**子網劃分**:在內部將一個網路塊劃分成幾個部分供多個內部網路使用,但對外部世界仍然像單個網路一樣。 ![](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201210171930342-1022884734.png) 上圖很好的描述了這種情況:一個學校的電子工程、計科、藝術系三個學院都需要各自的ip地址空間。使用子網劃分的方式,我們可以把校園網分成三個網路。圖片1最右邊連線至Internet的位置(一號路由器處)表示,整個學校分到了16位的網路位和16位的主機位(**寫在ip地址最後的/16表示16位 網路位 **)。在此基礎上,EE分得了14位主機位;計科分得了15位主機位;而藝術系只有13位主機位。將一個大型網路分割,得到的結果就稱為**子網**。 現在我們將之前學到的關於子網掩碼的知識應用於此,把它擴充完整。由於引入了真正的子網概念(而不僅僅是字首)這時的情況會更加複雜一點。我們還是用原來的圖片進行說明。 ![image-20201129134405319](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222938188-1764281171.png) 橙色的區域就屬於子網的部分。只不過,對於每一個路由器來講,他們並不需要知道其中屬於公司的網路字首是多少,屬於子網的部分又有多大,因此**子網掩碼只標識出了當前網路下的主機位**。下面介紹一下子網掩碼具體是怎麼工作的。 我們還是使用之前的例子。假如1號路由器收到一個入境資料包,上面的目標地址表示這個包需要傳送到128.208.2.151處,1號路由器該如何決定到底是發向2號、3號還是4號路由器呢?(這裡我們可以先預先判斷一下,既然第三個位元組是2,那麼該包應該是屬於EE的) 這時我們將使用子網掩碼進行運算。當資料包到達時,路由器會檢視他的目標地址,並檢查屬於哪個子網。為了檢視他是否屬於計算機科學系,需要首先將目標地址與計科的掩碼做and運算: | | ip地址(點分十進位制) | ip地址(後16位)(二進位制) | | ------------------------- | -------------------- | ------------------------------------------------- | | 入境資料包 | 128.208.2.151 | 0000 0010 1001 0111 | | CS子網掩碼 | 255.255.128.0 | 1000 0000 0000 0000 | | 入境資料包與CS掩碼AND操作 | 128.208.0.0 | 0000 0000 0000 0000 | 進行完AND操作後,路由器會把結果與該地區的字首進行比較(例如對於計科,字首就是128.208後面一個1),如果結果不匹配,那麼說明這個資料包不屬於這個網路。**總結一下,步驟就是:掩碼+目標AND操作,之後再同字首比較。**其中,字首與掩碼為1的部分同長。子網掩碼儲存在路由器、交換機等裝置的路由表中。 讀者可以自己用EE的掩碼和字首試一試。 #### 分類&特殊地址 人們把32位的地址長度分成了以下幾類地址。(A類、B類、C類...等等)這種方法被稱為:分類定址。 ![image-20201129155322623](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222938442-512918087.png) 除此之外,還有一部分IP地址有著特殊的含義和功能。如0.0.0.0只在主機啟動的時候使用;127.xx.xx.xx保留給迴環測試使用(即:傳送到該ip地址的資料包沒有被真正的放在網路上,但會像入境資料包一樣在本地處理)。如果各位有過除錯本地伺服器的經歷,這一點應該並不陌生。 ![image-20201129155704920](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222938783-1035858098.png) #### NAT網路地址轉換(***可以解決地址匱乏問題!!!!***) 當資料包離開時,NAT盒子把內部ip轉化成真實的ip地址,並使用埠號來標識不同的本地機器。(埠號在傳輸層的載荷上有對應標記)。 具體做法是:把源地址用真實ip地址代替,而原埠用一個索引值代替。在NAT盒子內部存在一個對映表,標記了索引值指向的內部的IP地址以及原來的傳送介面。 ![image-20201129161011715](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222939062-1862555239.png) ## 5.6.3 IPv6協議(***可以解決地址匱乏問題!!!!***) 對於IPv6,讀者需要掌握,其地址有128位(16byte)。 ![image-20201129161813622](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222939351-2085726479.png) ## 5.6.4 Internet控制協議(3) 這一部分將介紹一些Internet網路層的輔助控制協議。 - **ICMP:Internet控制訊息協議。**用於返回錯誤訊息 - **ARP:地址解析協議。**用於通過ip地址查詢對應的mac地址 當網路上一臺機需要請求一個ip地址的時候,他會廣播這個地址到鏈路上的所有機器。網路上的所有機器在收到之後都檢查自己的地址。如果一樣,那麼就以自己的乙太網地址作為回答。 ![image-20201129162209190](https://img2020.cnblogs.com/blog/2183510/202012/2183510-20201209222939694-1804117122.png) 在機器運行了ARP之後,會把結果快取起來,以便之後的通訊使用。(這一點有點類似於DNS) - **DHCP:動態主機配置協議**。用於廣播一個數據包以請求ip地址(***可以解決地址匱乏問題!!!!***) ## 5.6.5 OSPF內部閘道器路由協議 OSPF的全稱是open shortest path first,即開放最短路優先。OSPF是一個相當出色且廣泛使用的域內路由演算法,意味著這是一個適用於同一個運營網路或組織內部的路由協議。**OSPF將整個網路抽象到一個有向圖中來表示,之後,使用了鏈路狀態方法(泛洪傳送資料,並計算)來計算最短路徑** ## 5.6.6 BGP外部閘道器路由協議(Border Gateway Protocal) 相比於OSPF,BGP解決的是**域間**的路由問題 域內與域間問題的一個**明顯區別**是:域內路由只需要考慮如何把資料包傳送給接收方,而域間則需要同時**考慮政治方面的因素** 最後需要知道,**BGP是距離向量協議的一種形式**(或者說,使用了距離向量路由) # 5.7 常見問題FAQ #### internet/Internet/因特網/網際網路,都有什麼區別? internet(網際網路)是一個通用名詞,它泛指由多個計算機網路互連而成的網路。而 Internet(因特網)是一個專有名詞,指當前全球最大的、開放的、由眾多網路互連而成的特定計算機網路(採用tcp/ip)協議族。 因特網是最大的網際網路。 ****** 到此為止,網路層的所有知識點就告一段落了。我們已經學習完畢了計算機網路中內容最多的一章。 在下一章將學習傳輸層的內容。這一部分描述了兩個相當著名的協議:UDP與TCP協議,同時我們還會繼續討論擁塞控制等話題。[傳輸層]() 主貼連線:>
[點選這裡](https://www.cnblogs.com/maomaozi/p/1410786