IPV4地址都耗盡了,你還不知道它是個啥玩意兒?
2019年11月26日,世界上最后一個IPv4地址也被用完了。但是它都被耗盡了,竟然還有人不知道它是個什么東西呢?今天小編帶哪些“網工盲人”了解一下曾今風靡天下的IPV4地址。
IPv4地址
IPv4地址長度為32位。像所有其他網絡層地址一樣,IPv4地址也包括網絡號和主機號兩部分。網絡號部分唯一地標識了一條物理鏈路或邏輯鏈路,對于與該鏈路相連的所有設備來說網絡號部分是共同的。而主機號部分唯一地標識了該鏈路上連接的具體設備。
有幾種方式可以表示IP地址的32位。舉例來說,32位的IP地址000010101 1010110010110000011可以用十進制表示為181 819 267.
由此可見用二進制表示IP地址十分麻煩,而全部32位數字用十進制格式表示計算起來又很耗時。圖1-4給出了一種更好的表示方法。32位的地址包含4個字節,每個字節均可以用0~255之間的十進制數表示,而每個十進制數之間用點號分隔。在圖14中,將32位的地址映射到用點分十進制法表示的地址上。
在使用IPv4地址時需要記住一點,點分十進制表示法便于人們閱讀和書寫,而路由器更適合使用32位的二進制串,而不是按照4個八位組的方式讀取地址。牢記這一點可以避免許多易犯的錯誤。如果讀者沒有接觸過二進制數,特別是二進制與十進制之間的轉換方法,那么建議讀者在繼續學習這一章的內容之前可以閱讀一下附錄A的內容IP地址與眾不同的特性可能就是, IPv4地址不像其他網絡層地址的網絡號和主機號是固定不變的,IP地址的網絡號和主機號可以在32位的界線內發生變化。也就是說,IP 地址的網絡號和主機號都有可能占據32位中的多數位,也可能兩者平分32位。例如NetWare和AppleTalk協議,由于它們主要用于相對較小的網絡,所以協議的網絡層地址的網絡號和主機號長度是固定。這樣的安排的確使得工作更加容易,援收設備可以從地址中讀入固定的位來獲取網絡號,剩下的位便是主機號。
然而,TCP/P從最初設計出來到現在可以靈活地應用于任何網絡,從很簡單的幾個功能發展成為一個龐大的協議簇。TCP/P這種適應性使得IP地址的管理更加困難。
首個八位組字節規則
如果不對網絡作太過精確的劃分,那么網絡可以按照主機數量分為3類:大型網絡、中型網絡和小型網絡。
- 大型網絡——可以定義為包含大量主機的網絡。大型網絡的數量相對很少。
- 小型網絡——作為大型網絡的對照,它僅僅包含很少數量的主機,但小型網絡的數目很多。
- 中型網絡——相對于大型和小型網絡來說,包含的主機數量中等,而且中型網絡的數量也中等。
對于這3種規模的網絡,高層的地址劃分要求有3種類型的網絡地址。面向大型網絡的地址需要有能力為大量的主機編址,但是由于大型網絡的數量有限,所以大型網絡僅需要少量的網絡地址。
而對小型網絡來說情況又顛倒過來了,因為小型網絡數量龐大,所以需要大量的小型網絡的網絡地址。但是小型網絡主機有限,所以僅需要少量主機地址。
點分十進制表示法只用于 IPv4地址。IPv6 地址的表示法完全不同。
對于中等規模的網絡來說,網絡地址和主機地址的需求量均趨于中等水平。圖1-5顯示了3類IPv4地址的網絡號和主機號是怎樣劃分的。
迄今為止,對于所描述的大型、中型和小型網絡,是按照如下方式映射到各類地址的:
- A類地址——用于大型網絡, 第1個八位組是網絡號,后3個八位組是主機號。8位的網絡號最多可以表示256個網絡,而每個網絡地址的主機號可以提供的主機數量為224或167777 216.
- B類地址——用于中型網絡。前2個八位組表示網絡號,后2個八位組表示主機號。網絡號和主機號的數量均為26或65 536個。
- C類地址——對應于 A類IP地址。前3個八位組表示網絡號,最后1個八位組表示主機號。
因為所有的IPv4地址都是32位二進制字符串,所以需要某種方法來區分一個特定地址到底是屬于哪一類地址。表1-3所示的首個八位組規則提供了這種方法,如下所述:
- 對于A類地址,首個八位組的第1位,即32位字符串最左邊的1位,總是被設置為0.因此,通過設置首個八位組的剩余位為0 (最小)或為1 (最大),我們可以找到A類地址范圍中的最小數和最大數,于是我們可以得到最小數和最大數分別為0和127,但是這里有幾個例外: 0被保留作為缺省地址部分,127被保留為內部回送地址。剩下的十進制數則是1-126.因此任何首個八位組落在1和126之間的IP地址均屬于A類地址。
- B類地址 總是把左邊的第 I位設置為1,第2位設置為0.那么再次通過設置首個八位組的剩余位為0或為1,我們依然可以找到最小數和最大數。在圖14中,我們可以看到首個八位組落在!28和191之間的IP地址屬于B類地址。
- 在C類地址中,前2位均被設置為1,第3位被設置為0.這樣設置的結果是首個八位組在192和223之間。
到目前為止, IPv4 的編址看上去并不是十分困難。路由器和主機通過首個八位組字節規則能夠很容易地確定IP地址的網絡號。如果第I位是0,需要讀取前8位才能獲取網絡地址:如果前兩位是10,那么需要讀取16位:如果前3位是110,則需求讀取24位才能獲取網絡號。不幸的是,事情并不會這樣簡單。
地址掩 碼( Address Mask )
表示整個數據鏈路的地址——非特指某臺主機的網絡地址,可以用IP地址的網絡部分來表示,其中主機位全部為0。例如,IP 地址管理機構可以將172.21.0.0分配給一個申請者。因為172在128和191之間,所以這是一個B類地址,其中后兩個八位組作為主機位,全部被設置為0.雖然前16位(172.21.)已經被指定,但是地址所有者有權決定后16位主機位的使用。
每一臺設備和接口都將被分配一個唯一的、主機號明確的地址,例如172.21.35.17. 不管設備是路由器還是主機,顯然都需要知道自身的地址,而且它還需要能夠確定它所屬的網絡,在這個案例中,它屬于172.21.0.0.這一任務通常由地址掩碼來完成。地址掩碼是一個32位的字符串,與IPv4地址的每一位相對應。掩碼也可以像IPv4地址一樣用點分十進制表示。這種表示方法會成為某些初學者的絆腳石。雖然地址掩碼可以用點分十進制書寫,但是它并不是一個地址。表1-4 給出了對應于3類IPv4地址的標準地址掩碼。
設備使用環回地址(典型的是127.0.0.1) 向自己發送流量。發送到該地址的數據將會被直接送回給發送進程,面不會離開此設備。
對于每一位IPv4地址位,設備會拿它與地址掩碼的對應位進行布爾(邏輯) AND操作。AND函數表述如下:
比較兩位并得出結果。當且僅當兩位全部為1時,結果為1。如果兩位中任意一位為0,則結果為0。
對于一個指定的IPv4地址,圖1-6 給出了怎樣用地址掩碼確定網絡地址。地址掩碼值為1的位對應于地址的網絡位,值為0的位對應于主機位。因為172.21.35.17是B類地址,所以掩碼前兩個八位組必須全部設置為I,后兩個八位組,即主機號的所有位必須設置為0。參見表1-4,這個掩碼的點分十進制表示為55255.0.0。
在IPv4地址和地址掩碼的每一位上執行邏輯“與”(AND)操作,結果如圖1-6 所示。
在結果中,網絡位不變,所有主機位則變為0.通過向接口分配地址172.21.35.17 和掩碼255.255.0.0,設備將會知道接口屬于網絡172.21.0.0.對IPv4地址和掩碼應用AND操作總能夠得到網絡地址。
!注意:
- 223并沒有用完第一個八位組中所有可用的數。
- 負責管理和分配IP地址的高級管理機構是亞洲的APNIC.北美的ARIN.中美與南美州的LACNIC.以及EMEA的RIPE.
- 事實上,這個地址決不會域分配,因為它屬于私有的保留地址:本書中所用到的大多數地址都是保留地址,見RFC1918.保留地址包括: 10.0.0.0-10.255.255.255. 172. 16.0.0-172.31.255.255和192.168.0.0-192.168.255.255.
通過下面命令可以向Cisco路由器的接口分配地址和掩碼(本例中接口為E0):
- Smokey (config)I interface othernet 0
- Smokey(contig-if)# ip address 172.21.35.17 255.255.0.0
但是為什么要使用地址掩碼?到目前為止,使用首個八位組字節規則看上去更簡單一些。
子網和子網掩碼
首先,決不要忽略網絡層地址的必要性。為了完成路由選擇,每個數據鏈路(網絡)都必須有一個唯一的地址;另外,數據鏈路上的每臺主機也必須有一個地址,這個地址不僅標識主機為一個網絡成員,還可以把主機與網絡上的其他主機區分開來。
到目前為止的定義中,一個A類. B類或C類地址僅僅能用在一個單一網絡中: 為了建立一個網絡,每個數據鏈路都必須使用不同的地址,以便這些網絡可以被惟一地標識。如果每一個數據鏈路都使用一個單獨的A類、B類或C類地址,那么即使用盡所有的IPv4地址,也只能給少于1700 萬個數據鏈路分配地址。顯然,這種方法是不切實際的,在前面的例子中,如果充分地使用主機地址空間,那么在數據鏈路172.21.0.0中的設備數目可以超過65 000!
使A類. B類或C類地址實用化的惟一方法是對主網地址進行劃分,例如將172.21.0.0劃分為子網地址。請回憶兩個事實:
- IPv4地址的主機部分可以隨意使用。
- IPv4地址的網絡號由分配給接口的地址掩碼確定。
如圖1-7所示,分配給網絡的地址為B類地址172.21.0.0. 5個數據鏈路將主機和路由器互連起來,每個數據鏈路都需要一個網絡地址。按照目前的情況,172.21.0.0 必須分配給其中的一個數據鏈路,那么另外4個數據鏈路還需要4個地址。
注意圖1-7所示,地址掩碼并不是標準的16位B類地址掩碼:而是被擴展了8位,以便IP地址的前24位都被解釋為網絡位。換句話說,掩碼使路由器和主機把讀取的前8位主機位作為網絡地址的一部分。結果是,主網絡地址應用于整個網絡,而每一個數據鏈路則變為一個子網(subnet); 一個子網是一個主A類、B類或C類地址空間的一個子集。
現在,IPv4 地址包括3個部分:網絡部分、子網部分和主機部分。地址掩碼現在變為子網掩碼,或比標準地址掩碼長的掩碼。地址的前兩個八位組依然是172.21,但是第3個八位組——主機位已經由子網位代替-的變化范圍為 0-255.在圖1-6中的網絡有子網1.2、3、4和5(172.21.1.0-17221.5.0)。在單- B類地址下最多可以有256個子網,對應的掩碼如圖1-7所示。
1700 萬個數據鏈路看上去很多。但是你要考慮到。一個中等規模的企業就可能有許多數據鏈路。
下面給出兩點告誡。首先,并不是所有路由選擇協議都支持子網地址,即子網位全0或全1.因為這些協議是有類別化協議,它們不能區分一個全0子網和主網絡號。例如,在圖1-7中子網0為172.21.0.0;而主網IP地址也為172.21.0.0.沒有更多信息將無法區分二者。
同樣的,有類別路由選擇協議也不能區分全I子網的廣播地址和:一個所有子網的廣播地址。例如,圖1-7中的全1子網為172.21.255.0.對于這個子網,廣播地址是12.21.255.255,但.是這也是在主網172.21.0.0 的所有子網上所有主機的廣播地址。沒有更多的信息也無法區分二者。第1版RIP協議和IGRP協議都是有類別路由選擇協議:第7章將會介紹無類別路由選擇協議,這種路由選擇協議才可以真正地使用全0或全1子網。
其次是與子網及其掩碼的口頭表述有關。在圖1-7中,對B類地址的第3個八位組進行子網劃分是非常普遍的,但還常常聽到人們這樣表述子網設計:“B類地址使用C類地址掩碼”,或者“將B類地址劃分為C類地址”。這兩種表述都是錯誤的。它們常常會對子網設計引起誤解或者是不準確的理解。對于圖1-6 中所示的子網劃分圖解的正確表述應該是“一個使用8位進行子網劃分的B類地址”或者“一個帶有24位掩碼的B類地址”。
可以用以下3種格式中的任何一種表示子網掩碼:
- 點分十進制: 255.255.255.0
- 位計數: 172.21.0.0/24
- 十六進制: 0FFFF0O
雖然位計數格式變得漸漸流行起來,但是點分十進制暫時一段時期仍舊經常使用在一些軟件里面。與點分十進制相比,位計數格式更容易書寫(地址后面是1,后面緊跟著是網絡部分的位計數)。另外,位計數格式可以更清楚地描述掩碼的實際作用,因而可以避免前面段落出現的語義誤解問題。某些UNIX系統使用十六進制格式。
雖然在Cisco路由器中必須使用點分十進制方式表示地址掩碼,但是在行配置模式下使用命令ip netmask-format(decimalhexadecimalbit-count],可以設置使用3種格式中的任何一種格式顯示掩碼。例如,為使路由器以位計數格式顯示掩碼,配置如下
- Gladys (config) # line vty 04
- Gladys (config-line)i ip netmask-fomat bit-count
所有主機的IP廣播地址是所有位全為I: 5.55.2555特定子網的廣播地址是所有主機位全為1:例如,子網17221.1.0的廣樓地址是12.1.255.最后,對于所有子網的所有主機來說,廣播地址是子網為和主機位均為1: 12.1255.255.
子網規劃
如前面部分所述,在有類別地址環境中,子網位不能全部為0或全部為1。同樣的,一個主機的IPv4地址也不能將主機位全部設置為0,這種用法是為路由器保留的,用于表示網絡和子網自身。當然IPv4地址的主機位也不能全部被設置為1,因為它用于表示廣播地址。所有這些限制無一例外地適用于IP地址的主機位,并且這也是子網規劃的起點。除了這些限制,網絡設計人員還需要根據地址空間與網絡詳細的匹配程度來選擇最合理的子網劃分方案。
在規劃子網和子網掩碼時,可以使用相同的公式計算一個主網地址下可用的子網數以及每個子網內可用的主機數,公式為: 2"-2, 其中n表示子網位數或主機空間,2表示減去全0和全1兩個不可用地址。例如,給定一個A類地址10.0.0.0,子網掩碼10.0.0.0/16(255.255.0.0)意味著有8位子網空間,也就是可以產生2*-2=254個子網,每個子網可以有2*16次方-2=65 534個主機地址。另一方面,掩碼10.0.0.0/24 525.255.0)0表示有16位子網空間,可以產生65534個子網,其中8位主機空間可以在某個子網中產生254個主機地址。
下面是IPv4地址子網劃分的步驟:
- 步驟1:確定需要多少個子網,每個子網需要多少臺主機。
- 步驟2:為了滿足第1步提出的需求,使用公式2*-2確定子網位數和主機位數。如果存在多個子網掩碼可以滿足第1步需求,那么選擇最能夠符合未來需求的一個。例如,如果網絡最有可能通過增加子網發展起來,那么選擇子網位最多的掩碼;如果網絡最有可能借助增加現有子網內的主機數發展起來,則選擇主機位最多的掩碼。為了避免所選擇的方案中的子網及子網內的主機地址被迅速地用完,
- 需要為將來的發展預留一些空間。
- 步驟3:使用二進制進行計算,在子網空間中確定所有的位組合方式。在每種組合方式中,將所有主機位都設置為0,將得到的子網地址轉換為點分十進制格式。最終結果就是子網地址。
- 步驟4:對于每一個子網地址,再次使用二進制,在保持子網位不變的情況下寫出所有主機位組合,并將結果轉換成點分十進制格式。最終結果就是每個子網的可用主機地址。
這里沒有過分強調在最后兩步中使用二進制的重要性。當進行子網劃分時,最主要的惟一錯誤根源就是,在沒有理解在二進制上會發生什么的情況下試圖使用點分十進制方法。此外,點分十進制表示法對于人們讀寫IPv4 地址十分方便。但是路由器和主機卻把地址看作32位二進制字符串:為了順利地完成地址操作,必須采用路由器和主機處理地址的方式。
就目前給出的例子而言,作者在前面的段落中似乎有點多慮了。在沒有限定必須使用二進制方式表示地址和掩碼的時候,子網模式和主機地址看上去還是十分清楚的。
打破八位組界線
到目前為止,在給出的例子中,子網空間都是以八位組為界線的。但這并不總是最實用或最有效的選擇。例如,如果你需要對一個B類地址進行子網劃分,并滿足以下需求:數據鏈路數為500,每個數據鏈路內主機數不超過100臺,應該怎么辦?這樣的需求很容易得以滿足,只要使用9位子網位,就可以得到2-2=510個子網,剩下7位做主機位,每個子網的可用主機數為2-2=126.除此不再有其他位組合可以滿足上面的需求。
請注意,如果還是以八位組為界線的話,那么將無法對C類地址進行子網劃分。如果要這樣做就會占用最后1個八位組,那么就沒有更多主機位了。因此,如下面的例子所示,子網位和主機位必須共享最后1個八位組。
圖1-8與圖1-7中顯示的網絡除了分配的地址是C類地址192.168.100.0之外,其他完全相同。
在這個網絡中共有5條數據鏈路,因此至少需要劃分出5個子網地址。圖中還指明了每個子網需要分配的主機數(包括路由器接口)。其中兩個以太網最多需要25個主機地址。所以完整的子網劃分最小需求是5個子網,每個子網至少需要25個主機地址。
使用公式2"-2可以計算出,3個子網位和5個主機位即可以滿足需求: 2*-2=6, 2*-2=30。帶有3位子網位的C類地址掩碼可以用點分十進制表示為255255.255.224.
圖1-9給出了子網位的推導過程。用二進制表示第2步計算出的子網掩碼,子網掩碼下面是IP地址。垂直線標記了子網空間,從二進制0開始計數,在這一空間中的所有 位組合均被寫出。
在圖2-10中,不發生變化的網絡位填寫在子網空間的左邊,全部為0的主機位填寫在子網位的右邊。結果被轉換為點分十進制表示后,得到6個子網地址(記住,第一個和最后一個地址,即在子網空間中全部位為0和全部位為I的地址不能使用)。
最后一步是計算每個子網內的可用主機地址。這一步通過以下方式完成:首先選擇一個子網地址,保持其中的網絡位和子網位不變,從二進制0開始計數,寫出主機空間中所有的位組合。圖1-11給出了針對子網192. 168.100.32的計算過程。
注意結果的模式:第一個地址所有主機位全部為0,這是子網地址。最后一個地址主機位全部為1,這是子網192.168.100.32的廣播地址。主機地址從子網地址起到廣播地址為止。按照順序,下一個子網地址是192.168.100.64.
現在,在二進制層次上理解子網劃分的重要性就顯而易見了。給出一個地址,如192.168.100.160,你不能確定它是否是一個主機地址、子網地址或廣播地址。甚至在子網掩碼已知情況下,結論也并不總是明顯的。
這里我們鼓勵讀者計算例子中所有余下子網的主機地址,并且仔細觀察產生地址的模式,理解這些模式對下一部分的內容會有幫助。
子網掩碼的故障診斷
在“解剖”一個給定的主機地址和掩碼時,常常需要確定地址屬于哪個子網。例如,如果在一個接口上配置了地址,一個很好的實踐就是首先驗證對于按口連接的子網來說該地址是否合法。
使用下面的步驟逆推一個IP地址:
- 步驟1:用二進制寫下一個給定的子網掩碼。
- 步驟2:用二進制寫下一個主機IPv4地址。
- 步驟3:在知道一個地址的類別后,掩碼的子網位便是顯然的了。根據掩碼位,在最后網絡位和第1個子網位之間畫一條線,在最后子網位和第1臺主機之間也畫另一條線。
- 步驟4:寫下地址的網絡位和子網位,設置所有的主機位為0。最終的結果就是主機地址所屬的子網地址。
- 步驟5:再次寫下地址的網絡位和子網位,這次設置所有主機位為1.結果就是本子網的廣播地址。
- 步驟6:按照順序可以知道第一個地址是子網地址,最后一個地址是廣播地址。而且還可以知道在這兩個地址之間的所有地址都是合法的主機地址。
對于地址172.30.141/25,圖1-.12給出了以上步驟的示例。
這個地址是B類地址,所以前16位是網絡位,25位掩碼中的后9位是子網位。可以發現子網地址是172.30.0.128, 廣播地址是172.30.0.255.在這兩個地址之間的主機地址對于這個子網來說都是合法的,如對子網172.30.0.128來說,172.30.0.129 -172.30.0.254都是主機地址。
在這個例子中,初次進行子網劃分的人可能會受到以F幾種情況的干擾。一種是地址的第3個八位組所有位都為0.另一種是最后一個八位組儀一個子網位。一些人可能會認為廣播地址看上去不合法。所有這些不舒服的感覺都源自地址的點分十進制表示法。
當使用二進制表示地址和掩碼時,這些疑慮會被打消,任何事看上去都一切正常,掩碼設定了9位子網空間一包括第3個八位組和第4個八位組的第1位。這個案例說明了如果使用二進制表示法時一切正常,那么就不必擔心看上去有些奇怪的點分十進制表示法。