IP層轉發分組的流程
上圖是一個路由器怎麼進行分組轉發的例子:有四個A類網路通過三個路由器連線在一起,每一個網路上都可能會有成千上萬臺主機。若路由表指出每一臺主機該進行怎樣的轉發。則要維護的路由表是非常的龐大。如果路由表指定到某一個網路如何轉發,則路由表中只有4行,每一行對應一個網路。以路由器2的路由表為例:由於R2同時連線在網路2和網路3上,因此只要目標主機在網路2或者網路3上,都可以通過介面0或者1或者路由器R2直接交付(當然還有使用ARP協議找到這些主機相應的MAC地址)。若目標主機在網路1中,則下一跳路由器為R1,其IP地址為20.0.0.7。路由器R2和R1由於同時連線在網路2上,因此從路由器2把轉發分組給R1是很容易的。我們應當注意到:每一個路由器至少都要擁有兩個不同的IP地址。總之,在路由表中,對每一條路由最主要的是以下兩條資訊:(目的網路,下一跳地址)我們根據目的網路地址來確定下一跳路由器,這樣可以得到以下結論:
-
IP資料包最終一定可以找到目的主機所在目的網路上的路由器(可能會經過多次間接交付)。
-
只有到達最後一個路由器時,才試圖向目的主機進行間接交付。
雖然網際網路上所有的分組轉發都是基於目的主機所在的網路,但是在大多數情況下都允許這樣的例項:對特定的主機指明一個路由,這種路由叫特定主機路由。採用特定主機路由可以使網路人員方便管理控制網路和測試網路
路由器還可以採用預設路由以減少路由表所佔用的空間和搜尋路由表所使用的時間。
當路由器接收到一個待轉發的資料包,在從路由表中得出下一跳路由器的IP地址後,不是把這個地址寫入IP資料包,而是送交資料鏈路層的網路介面軟體,網路介面軟體把負責下一跳的路由器IP地址轉化為硬體地址(必須使用ARP),將硬體地址寫入MAC幀的首部,然後根據這個硬體地址找到下一跳路由器。由此可見,當傳送一連串的資料包時,上述的這種查詢路由表,用ARP得到硬體地址,把硬體地址寫入MAC地址首部等過程,將不斷地重複進行,造成了一定的開銷。
根據以上幾點,我們提出分組轉發演算法:
- 從資料包的首部提取目的主機IP地址D,得出目的網路地址N。
- 若N就是與此路由器直接相連的某個網路地址,則進行直接交付,不需要再經過其他的路由器。直接把資料包交付給目的主機(這裡包括把目的主機D轉化為MAC地址,把資料包封裝成MAC幀,再傳送該幀);否則就是間接交付,執行3。
- 若路由表有目的地址為D的特定主機路由,則把資料包傳給路由表中所指明的下一跳路由器。否則進行4。
- 若路由表中有到達網路N的路由,則把資料包傳給路由表中所指明的下一跳路由地址;否則,執行5。
- 若路由表中有一個預設路由,則把資料包傳遞給路由表中所指明的預設路由。否則,執行6。
- 報告轉發分組出錯。
這裡我們需要強調一下,路由表並沒有給分組指明某個網路的完整路徑(即先經過哪一個路由器,然後再經過哪一個路由器,等等)。路由表指出,到達某個網路應該先到達某個路由器(下一條路由器),在到達下一跳路由器之後,再繼續查詢路由表,知道再下一步應當到達哪一個路由器。這樣一步步的查詢下去,直到最後到達目的網路。
構建子網和劃分超網
劃分子網
從二級IP地址到三級IP地址
為什麼劃分子網?
- IP地址空間利用率有時候很低:每一個A類地址可連線的主機數超過1000萬,每一個B類地址可連線的主機數也超過6萬個。
- 給每一個物理網路分配的網路號會使得路由表變得太大導致網路效能變差。
- 兩級IP地址不夠靈活。
為解決上述問題,從1985年引出子網路號欄位,使得兩級IP地址變為三級IP地址,這種做法叫做劃分子網(subnetting)【RFC950】。如圖4-2:
劃分子網的基本思路:
- 一個擁有許多物理網路的單位,可將所屬的物理網路劃分為若干個 子網。劃分子網屬於單位內部的事情。本單位以外的網路看不見這個網路是由多少個子網組成,因此這個單位對外仍然表現一個網路。
- 劃分子網的方法是從網路的主機號借用若干位當做子網路號(subnet-id),當然主機號也就減少了同樣的位數,於是二級IP地址就變成了三級IP地址:網路號,子網路號,主機號。
- 凡是從其他網路傳送給本單位某一臺主機的IP資料包,仍然是根據IP資料包的目的網路號找到連線在本單位的路由器,但是此路由器在收到IP資料包之後,再按照網路號和子網路號找到目的子網,把IP資料包交付給目標主機。
劃分子網的用例
如上圖為某單位擁有一個B類IP地址,網路地址為145.13.0.0(網路號為145.13),凡是目的網路為145.13.x.x的資料包都會送到這個網路上路由器R1上。
現在把該網路劃分為三個字網,這裡假設子網路號佔用8位,因此主機號就只剩下16-8=8位了,所劃分的三個字網為145.13.3.0,145.13.7.0,145.3.21.0。路由器在接受到145.13.0.0上的路由器資料後,再根據資料包的目的地址把它轉化到相應的子網。
總之,當沒有劃分子網的時候,IP地址是兩節結構。劃分子網後IP地址就變成了三級結構。劃分子網只是把IP地址的主機號這部分進行再劃分,而不改變IP地址原來的網路號。
子網掩碼
假定有一個IP資料包(其目的地址為145.13.3.10)已經到達了路由器R1,那麼這個路由器如何把它轉發到子網145.13.3.0呢?
我們知道,從IP資料包報的首部無法看出源主機的目的主機所連線的網路是否進行了子網劃分。這是因為32位IP地址本身以及資料包的首部沒有包含任何關於子網劃分的資訊。因此必須另想辦法,這就是使用子網掩碼。
把三級IP地址的子網掩碼和收到的目的地址的IP地址逐位進行與(AND)運算,就可以立即得到網路地址,剩下的步驟就交給路由器處理分組。
使用子網掩碼的好處是:不管網路有沒有劃分子網,只要把子網掩碼和IP地址進行逐位與(AND)運算,就立即得出網路地址來,這樣在路由器處理到來的分組時就可採取同樣的做法。
在不劃分子網時,為什麼還要使用子網掩碼?這就是為了更便於查詢路由表。現在網際網路規定:所有網路都必須使用子網掩碼,同時在路由器的路由表中也必須有子網掩碼這一欄。如果一個網路不劃分子網,那麼該網路的子網掩碼就是用預設的子網掩碼,預設子網掩碼中1的位置和IP地址中的網路號欄位net-id正好相對應。因此,若用預設子網掩碼和某個不劃分子網的IP地址逐位相"與",就應該能夠得出該IP地址的網路地址來,這樣做可以不用查詢該地址的類別位就能夠知道這是哪一類的IP地址。顯然:
- A類地址的預設子網掩碼是255.0.0.0,或0xFF000000.
- B類地址的預設子網掩碼是255.255.0.0,或者是0xFFFF0000.
- C類地址的預設子網掩碼是255.255.255.0,或者是0xFFFFFF00.
圖4-21是這三類IP地址的網路地址和相應的預設子網掩碼:
子網掩碼是一個網路或者一個子網的重要屬性。在RFC950成為網際網路標準後,路由器在和相鄰路由器交換路由資訊時,必須把自己所在的網路(或子網)的子網掩碼告訴相鄰路由器,在路由器的路由表中的每一個專案,除了要給出目的網路地址外,還必須同時給出該網路的子網掩碼。若一個路由器連線在兩個子網上就擁有兩個網路地址和兩個子網掩碼。
例4-2:
已知IP地址是141.14.72.24,子網掩碼是255.255.192.0,求網路地址:
解: 255.255.192.0的二進位制:11111111 11111111 11000000 00000000
IP 141.14.72.24二進位制: 11111111 11111111 01001000
00000000
將IP地址二進位制與子網掩碼二進位制進行與(AND)運算為 ::11111111 11111111 11000000 00000000
即網路IP為:141.14.64.0
使用子網時分組的轉發
在劃分子網的情況下,分組轉發的演算法必須作出改動。在使用子網劃分後,路由表應該包含以下內容:
- 目的網路地址
- 子網掩碼
- 下一跳
在劃分子網的情況下,路由器轉發分組的演算法如下:
- 從收到的資料包的首部提取目的IP地址D。
- 先判斷是否為直接交付。對路由器直相連的網路逐個進行排查:用各個網路的子網掩碼和D逐位相與(AND),看結果是否和對用的網路地址匹配上。若匹配,則把分組進行直接交付,轉發結束,否則就是間接交付,執行(3)。
- 若路由表有目的地址為D的特定主機路由,則把資料包傳給路由表中所指明的下一跳路由器;否則進行(4)。
- 對路由表中每一行(目的網路地址,子網掩碼,下一跳地址),用其中的子網掩碼和D進行逐位相與(AND),其結果為N。若N與該行的目的網路地址匹配,則把資料包傳給該行所指明的下一跳路由器;否則,執行(5)。
- 如果有表中有一個預設路由,傳送給路由表中所指明的預設路由;否則執行(6)。
- 報告轉發分組錯誤。
例4-4:
圖4-24有三個字網,兩個路由器,以及路由器R1的部分路由表。現在源主機H1向目的主機H2傳送分組。試討論R1收到H1向H2傳送的分組後查路由表的過程。
解:
源主機H1向目標主機H2傳送的分組的目的地址為128.30.33.138。
源主機H1把本子網的子網掩碼255.255.255.128與H2的IP地址128.30.33.128相與得到128.30.33.128,它不等於H1的網路地址(128.30.33.0)。這說明主機H2與主機H1不在同一個網段上,因此H1不能把資料包直接交付給H2。必須交給子網上的預設路由R1,由R1轉發。
路由表在接受到這個分組之後,就在其路由表中逐行匹配尋找。
首先看R1路由表的第一行:用這一行的子網掩碼255.255.255.128與H2IP地址進行互與,得到128.30.33.128,然後和這一行用樣的方法進行第二行,結果發現相與出來的結果和目的網路地址匹配,則說明這個網路(子網2)就是收到的分組所要尋找的目的網路。於是就不用繼續找了。R1把分組從介面1直接交付給主機H2(他們都在一個子網上)。
無分類編址CIDR(構造超網)
在一個劃分子網的網路中可使用幾個不同的子網掩碼。使用變長子網掩碼VLSM(Variable Length Subnet Mask)可進一步提高IP地址資源的利用率。在VLSM的基礎上又進一步研究出無分類編制方法。它的正式名字是無分類域間路由選擇CIDR(Classless Inter-Domain Routing)。
CIDR最主要的特點有兩個:
- CIDR消除了傳統的A類地址,B類地址,C類地址和劃分子網的概念。因此能更加有效的分配IPV4的地址空間。並且在新的IPv6使用之前容許網際網路規模繼續增長。CIDI把32位的IP地址分為前後兩個部分。前面部分是網路字首(network-prefix),用來指明網路,後面部分則用來指明主機。因此CIDI使IP地址從三級編址又回到了兩級編址,但這已是無分類的兩級編址。其記法是:
CIDR還使用斜線記法,就是在IP地址後面加上斜線/,然後寫上網路字首所佔的位數。例如IP地址為128.14.35.7/20是某CIDR地址快中的一個地址,其中前20位就是網路字首,後面的14位是主機位。如圖所示:
當然以上地址的主機號全為0和全為1的地址,一般並不使用,這個地址塊共有2^12個地址,我們可以使用地址塊中最小的地址和網路字首來指明這個地址快。例如,上述的地址塊可記為128.14.32.0/20。
為了更方便的進行路由選擇,CIDR使用了32位的地址掩碼(address mask)。地址掩碼是由一串1和一串0組成,而1的個數就是網路字首的個數。雖然CIDR不使用子網了,但是出於某些原因,CIDR使用的地址掩碼也可以繼續稱為子網掩碼,斜線記法中,斜線後面的數字就是1的個數。例如,/20地址快的地址掩碼是11111111 11111111 11110000 00000000(20個連續的1)。斜線記法中,斜線後面的數字就是地址掩碼中1的個數。
斜線記法還有一個好處就是它除了可以表示一個IP地址外,還提供了一些其他重要的資訊。我們舉例說明如下:
例如,地址為192.199.170.82/27不僅表示IP地址是192.199.170.82,而且還表示這個地址快的網路字首有27位(剩下的5位是主機號),因此這個地址快包含32個IP地址(\(2^5\)=32)。通過見到那的計算還可以得出,這個地址塊的最小地址是192.199.170.64,最大地址是192.199.170.95。具體的計算方法是這樣的:找到地址掩碼中1和0的交界處發生在地址中的哪一個位元組,現在是第四個位元組,因此只要把這一個位元組的十進位制82用二進位制表示即可:82的二進位制是01010010,取其前3位(這3位加上前3位元組的24位就夠成了27位),再把後面的5位都寫成0,即01000000,等於十進位制64,這樣就找到了地址快的最小地址192.199.170.64,再把最後面5位都置為1,即01011111,等於十進位制的95,這就找到了地址塊中的最大地址192.199.170.95。
由於一個CICR地址塊有很多地址,所以在路由表中就利用CIDR地址塊來查詢目的網路。這種地址的聚合常稱之為路由聚合(route aggregation),它使得路由表中的一個專案可以表示原來傳統分類地址的很多個路由,路由聚合也稱之為構成超網(supernetting),路由聚合有利於減少路由器之間的路由選擇資訊的交換,從而提高了整個網際網路的效能。
每一個CIDR地址塊中的地址數一定是2的整數次冪,這就是構建超網的來源。
網路字首越短,其地址塊所包含的地址數就越多,而在三級結構的IP地址中,劃分子網是使網路字首變長。
最長字首匹配
在使用了CIDR時,由於採用網路字首這種記法,IP地址由網路字首和主機號這兩部分組成,因此在路由表中的專案也要有相應的變化,這時,每個專案由網路字首和下一跳地址組成,但是在查詢路由表時可能會得到不止一個匹配結果,這樣就帶來一個問題:我們應該從這些匹配結果中選擇哪一條路由呢?
正確的答案是:應但從匹配結果中選擇具有最長網路字首的路由,這就做最長字首匹配(long-prefix matching),這是因為網路字首越長,說明其地址塊越小因而路由就越具體,最長字首匹配又稱之為最長匹配或者最佳匹配。
使用二叉線索查詢路由表
使用CIDR後,由於要尋找最長字首匹配,使路由表的查詢過程變的十分複雜,當路由表的專案數很大的時候,怎樣設法減少路由表的平均查詢時間就成為了一個非常重要的問題,現在常用的是二叉線索(binary trie),它是一種特殊結構的樹,IP地址中從左到右的位元值決定了從根節點逐層向下層延伸的路徑,二二叉線索中的各個路徑就代表路由表中存放的各個地址。
圖4-26用一個例子說明二叉樹線索的結構,圖中給出了5個IP地址。為了簡化二叉線索的結構,可以先找出對應一與每一個IP地址的唯一字首(unique prefix),所謂唯一字首就是在表中所有的IP地址中,該字首時唯一的,這樣就可以用這些唯一字首來構造二叉線索。在進行查詢時,只要能夠和唯一字首匹配相匹配就可以了。
從二叉樹的根節點自頂向下的深度最多有32層,每一層對應於IP地址中的一位。