網路層(四)劃分子網
引言
子網掩碼(Subnet Mask)又叫網路掩碼、地址掩碼,它是一種用來指明一個IP地址的哪些位標識的是主機所在的子網以及哪些位標識的是主機的位掩碼。子網掩碼只有一個作用,就是將某個IP地址劃分成網路地址和主機地址兩部分

子網掩碼的作用
利用子網掩碼可以計算某IP地址所在網段

同一個網段的中的計算機子網掩碼相同,計算機的閘道器就就是到其他網段的出口,也就是路由器介面地址。路由器介面使用的地址可以是本網段中任何一個地址,不過通常使用該網段的第一個可用的地址或最後一個可用的地址,這是為了儘可能避免和網路中的計算機地址衝突

分類IP地址編址方式的弊端
今天看來,在ARPANET的早期,IP地址的設計確實不夠合理,有以下三點原因:
IP地址空間利用率低
每一個A類地址網路可連線的主機數超過1000萬臺、而每一個B類網路可連線的主機數也超過6萬臺。然而 有些網路對連線在網路上計算機數目有限制,根本達不到這樣的數值。 例如乙太網10BASE-T規定其最大節點數只有1024個。另外有些單位考慮今後發展,會盡量申請B類地址,而非一個足夠用的C類地址。 IP地址的浪費,還會使IP地址空間的資源過早地被用完
路由表太大降低網路效能
每一個路由器都應當能夠從路由表查處應怎樣到達其他網路的下一跳路由器。因此,網際網路中的網路數越多,路由器的路由表專案數越多,這樣,即便我們擁有足夠多的IP地址資源可以給每一個物理網路分配一個網路號,也會 導致路由器中路由表中的專案數過多 。這樣不僅 增加了路由器的成本 (要求更多儲存空間),而且使 查詢路由表耗時更多 ,同時使 路由器之間定期交換路由資訊量急劇增加 ,使路由器和整個因特網效能下降
兩級IP地址不夠靈活
有時情況緊急,一個單位需要在新的地點馬上開通一個新的網路。但是在申請到一個新的IP地址之前,新增加的網路是不可能連線到因特網工作的。 我們希望有一種方法,使一個單位能夠隨時靈活地增加本單位的網路,而不必事先到因特網的管理機構去申請新的網路號。 原來的兩級IP地址無法做得到這一點
劃分子網的基本思路
為解決上述問題,從1985年起在IP地址中又增加了一個“子網號欄位”,使兩級IP地址變成為三級IP地址,它能夠較好的解決上述問題,並且使用起來很靈活,這種做法叫作 劃分子網(subnetting) ,或 子網定址 或 子網路由選擇 。劃分子網已成為因特網正式標準協議
思路
- 一個擁有許多物理網路的單位,可將所屬的物理網路劃分為若干個 子網(subnet) 。 劃分子網純屬一個單位內部的事情 ,本單位以外的網路看不見這個網路是由多少個子網組成,因為這個單位對外仍然表現為一個網路
- 劃分子網的辦法是 從網路的主機號借用若干位作為子網號subnet ,當然主機號也就減少了相應的位數。於是兩級的IP地址在本單位內部就變成了三級IP地址:網路號、子網號、主機號。也可以用
IP地址 ::= {<網路號>, <子網號>, <主機號>}
來表示 - 凡是從其他網路傳送到本單位某個主機的IP資料報, 仍然是根據IP資料報的目的網路號找到本單位網路上的路由器。 但此路由器在收到IP資料報後,再按目的網路號和子網號找到目的子網,把IP資料報交付目的主機
例子
下圖表示某單位擁有一個B類IP地址,網路地址是145.13.0.0(網路號是145.13)。凡目的地址為145.13.x.x的資料報都被送到這個網路上的路由器R1

現在把上圖的網路劃分為三個子網(下圖)。這裡假定子網號佔用8位,因此在增加了子網號後,主機號只有8位。所劃分的三個子網分別是:145.13.3.0、145.13.7.0和145.13.21.0。在劃分完子網後,整個網路對外部仍然表現為一個網路,其網路地址仍為145.13.0.0。網路145.13.0.0上的路由器R1在收到外來的資料報後,再根據資料報的目的地址把它轉發到相應的子網

概括講,當沒有劃分子網時,IP地址是兩級結構,劃分子網後IP地址變成了三級結構。劃分子網 只是把IP地址的主機號這部分進行再劃分,而不改變IP地址原來的網路號
子網劃分的實現——子網掩碼
子網掩碼引入
現在剩下的一個問題就是:假定有一個數據報(其目的地址是145.13.3.10)已經達到了路由器R1。那麼這個 路由器如何把它轉發到子網145.13.3.0呢? 我們知道,32位的IP地址本身及資料報首部都沒有包含任何關於子網劃分的資訊,因此從IP資料報的首部是無法看出源主機或目的主機所連線的網路是否進行了子網的劃分。必須,另想辦法,這就是使用 子網掩碼(subnet mask)

圖中第一行,IP地址為145.13.3.10的主機本來是兩級IP地址結構,第二行是同一地址的三級IP地址結構,也就是說現在從原來的16位主機號中拿出8位作為子網號,而主機號由16位減小到8位。現在子網號為3的網路地址為145.13.3.0,不同於原來兩級IP地址的網路地址145.13.0.0
表示R1把三級IP地址的子網掩碼和收到的資料報的目的IP地址145.13.3.10 逐位相與 ,得出了所要找的子網的網路地址145.13.3.0
使用子網掩碼的好處就是:不管網路有沒有劃分子網,只要把子網掩碼和IP地址進行逐位於運算,就立即得出網路地址來,這樣在路由器處理到來的分組時就可以採用同樣的演算法
從網路145.13.0.0外面看,這就是一個普通的B類網路,其子網掩碼為16個1後面跟上16個0。但進入這個網路內部後(即到了路由器R1),就看到了還有許多網路(即劃分了子網後的許多網路),其網路地址是145.13.x.0(這裡x表示不同的數值),而這些網路的子網掩碼都是24個1和8個0。總之,這個B類網路的外部和裡面,看到的網路是不一樣的。其實就好像路標,到具體十字路口,再具體標明該去哪個鄉鎮。這裡只有到R1,儲存三級子網掩碼才有意義
預設的子網掩碼
在不劃分網路時,既然沒有子網,為什麼還有使用子網掩碼?這就是為了便於查詢路由表。現在因特網標準規定:所有的網路都必須使用子網掩碼,同時在路由器的路由表中也必須有子網掩碼這一欄。如果一個網路不劃分子網,那麼該網路的子網掩碼就使用 預設子網掩碼 。預設子網掩碼中1的位置和IP地址中的網路號欄位net-id正好相對應。因此,若使用 預設子網掩碼和某個不劃分子網的IP地址逐位相“與”(AND) ,就應當能夠得出該IP地址的網路地址來

其他劃分方式
由於是由主機號中拿出一部分,構成子網號,故若使用較少位數的子網號,則每一臺子網上可連線的主機數就多。若使用位數較多的子網號,則子網數目較多,但是每個子網上可連線的主機數就少。因此,我們可以根據網路的具體情況,選擇合適的子網掩碼。
我們以一個B類網路為例,說明有多少種子網劃分的方法。在採用固定長度子網時,所劃分的所有子網的子網掩碼都是相同的

在上圖中,子網數是根據子網號subnet-id計算出來的,若subnet-id有n位,則共有$2^n$種可能的排列,除去全零和全1這兩種情況,就得出表中的子網數。另外計算每個子網中主機數為$2^{16-n}- 2$