網路層(五)無分類編址CIDR(構成超網)
引言
本篇將介紹無分類編址CIDR的概念、最長字首匹配、使用二叉線索查詢路由表
CIDR
CIDR(Classless Inter-Domain Routing)無分類域間路由選擇
劃分子網在一定程度上緩解了因特網發展中遇到的困難,但其僅僅是對分類編址方式的改進,A、B、C類IP網路號都為8的倍數,其劃分不夠精細,存在很大程度的浪費,基於此,無分類編址方式CIDR應運而生。
分類編址的問題
1992年因特網面臨三個必須儘早解決的問題
- B類地址在1992年分配了近一半,眼看很快就將全部分配完畢
- 因特網主幹網上的路由表中的專案數急劇增長(由幾千個增長至幾萬個)
- 整個IPV4的地址空間最終將全部耗盡,在2011年2越3日,IANA宣佈IPV4地址已經耗盡了
IETF研究採用無分類編址的方法來解決前兩個問題,其認為第三個問題屬於更加長遠的問題,因此專門成立IPV6工作組負責研究新版本IP協議的問題
CIDR最主要的兩個特點
- CIDR消除了傳統的A類、B類和C類地址及劃分子網的概念 ,因此可以更加有效地分配IPv4的地址空間,並且在新的IPv6使用前容許因特網的規模繼續增長
CIDR把32位的IP地址劃分為兩個部分,前面的部分是網路字首,用來指明網路,後面的部分則用來指明主機,其與分類編址最大的不同,便是網路字首不侷限於8的倍數。因此CIDR使IP地址從三級編址(使用子網掩碼)又回到兩級地址,但這已經是無分類的兩級編址。CIDR在IP地址後面加上斜線“/”,然後寫上網路字首所佔的位數。
IP地址 :: = {<網路字首>,<主機號>}
- CIDR把網路字首都相同的連續IP地址組成一個“CIDR地址塊”。 我們只要知道CIDR地址塊中的任何一個地址,就可以知道這個地址塊的起始地址(最小地址)和終止地址(最大地址),以及地址塊中的地址數
例如,已知IP地址為128.14.35.7/20是某CIDR地址塊中的一個地址,現在把它寫成二進位制形式,其中前20位是網路字首,而後面的12位是主機號:
128.14.35.7/20 = 10000000 00001110 0010 0011 00000111
這個地址塊的最小地址為: 10000000 00001110 0010 0000 00000000
這個地址塊的最大地址為: 10000000 00001110 0010 1111 11111111
CIDR的地址掩碼
為了更方便地進行路由選擇,CIDR使用32位的地址掩碼(address mask)。地址掩碼由一串1和一串0組成,而1的個數就是網路字首的長度。雖然CIDR不使用子網了,但由於目前一些網路還使用子網劃分和子網掩碼,因此CIDR使用的地址掩碼也可繼續稱為子網掩碼
例如,/20地址塊的地址掩碼是:11111111 11111111 11110000 00000000(20個連續的1)。斜線記法中,斜線後面的數字就是地址掩碼中1的個數
CIDR不劃分子網的理解
另外,“CIDR不使用子網”,是指 CIDR中並沒有在32位地址中指明若干位作為子網欄位。 但分配到一個CIDR地址塊的單位, 仍然可以在本單位內根據需要劃分出一些子網。 這些子網也都只有一個網路字首和一個主機地址號,但子網的網路字首比整個單位的網路字首要長一些
例如,某單位分配到地址塊/20,就可以繼續劃分為8個子網(即需要從主機號中借用3位來劃分子網)。這時,每一個子網的網路字首就變成23位(原來的20位加上主機號借來的3位),比該單位的網路字首多了3位
路由聚合的概念
由於一個CIDR地址塊有很多地址,所以在路由表中就利用CIDR地址塊來查詢目的網路。這種地址的聚合常稱為路由聚合(Route aggregation),它使得路由表中的一個專案可以表示原來傳統分類網路地址的很多個路由。路由聚合也稱為構成超網(supernettig)
如果沒有采用CIDR,則在1994年和1995年,因特網一個路由器就回超過7萬個專案,而使用了CIDR以後,在1996年一個路由表的專案數菜只有3萬多個。路由聚合有利於減少路由器之間的路由選擇資訊交換,提高整個網路效能
最長字首匹配
最長字首匹配的概念
在使用CIDR時,由於採用了網路字首這種記法,IP地址由網路字首和主機號這兩個部分組成,因此在路由表中的專案也要做相應的改變。這時,每個專案由 “網路字首” 和 下一跳地址 組成。但是在 查詢路由表時可能得到不止一個匹配結果 。這樣就帶來一個問題:我們應當從這些匹配的結果中選擇哪一條路由呢?
正確的答案是: 應當從匹配結果中選擇具有最長網路字首的路由 。這叫作最長字首匹配(longest-prefix matching),這時因為網路字首越長,其地址塊就越小(因為主機位數越少),因而路由就越具體。最長字首匹配又稱為 最佳匹配或最長匹配
依據地址位置劃分地址快
如果IP地址的分配從一開始就採用CIDR,那麼我們可以按網路所在的地理位置來分配地址塊,這樣就可以大大減少路由表中的專案數
例如,可以將世界劃分為四大地區,每一個地區分配一個CIDR地址塊:
地址塊194/7(194.0.0.0至195.255.255.255)分配給歐洲
地址塊198/7(198.0.0.0至199.255.255.255)分配給北美洲
地址塊200/7(200.0.0.0至201.255.255.255)分配給中美洲和南美洲
地址塊202/7(202.0.0.0至203.255.255.255)分配給亞洲和太平洋地區
上面一個地址塊包含約3200萬個地址($2^{32}-7$)。這種分配方法使得IP地址與地理位置關聯,它的好處是可以大大壓縮路由表中的專案數。例如從中國發往北美的資料報(不管它是地址塊198/7中的哪一個地址)都先送到美國的一個路由器,因此在路由表中使用一個專案就行了。
但是,在使用CIDR之前,因特網的地址管理機構並沒有按照地理位置來分配IP,現在要把已分配的IP地址回收再重新分配是十分困難的事情,因為這牽涉很多正在工作的主機必須改變其IP地址。 所以基於地址位置劃分地址塊僅僅停留在想法
使用二叉搜尋樹查詢路由表
當路由表的專案數很大時,怎樣設法減小路由表的查詢時間就成為一個非常重要的問題。 為了進行更加有效的查詢,通常是將無分類編址的路由表存放在一種層次的資料結構中,然後自上而下地按層次進行查詢。這裡最常用的就是二叉線索(binary trie)
IP 地址中從左到右的位元值決定了從根結點逐層向下層延伸的路徑,而二叉線索中的各個路徑就代表路由表中存放的各個地址
