子網掩碼(subnet mask)的作用實際上只是用來標識出某個IP地址哪部分是網絡位的一段地址。
它和IP地址都是32位2進制地址, 都可以用點分十進制標識, 即4段>=0且<=255的十進制數。
但是子網掩碼與IP地址不同:IP地址的32位2進制數, 每一位都可以任意取0或1,即IPv4地址理論上有2的32次方-2個(刨去全是0的網絡本身或者全是1的廣播地址),
而子網掩碼的二進制構成只有兩部分, 表示網絡位的1和表示主機位的0,左邊的1和右邊的0分別連續,所以2進制的點分十進制表示不能隨意取值,理論上的IPv4子網掩碼只有30個。
子網掩碼是用來判斷任意兩台計算機的IP地址是否屬於同一子網絡的根據。
最為簡單的理解就是兩台計算機各自的IP地址與子網掩碼進行AND運算后,如果得出的結果是相同的,則說明這兩台計算機是處於同一個子網絡上的,可以進行直接的通訊。
計算方式
由於子網掩碼的位數決定於可能的子網數目和每個子網的主機數目。在定義子網掩碼前,必須弄清楚本來使用的子網數和主機數目。
根據子網數
利用子網數來計算
在求子網掩碼之前必須先搞清楚要划分的子網數目,以及每個子網內的所需主機數目。
1)將子網數目轉化為二進制來表示
2)取得該二進制的位數,為 N
3)取得該IP地址的類子網掩碼,將其主機地址部分的前N位置1 即得出該IP地址划分子網的子網掩碼。
如欲將B類IP地址168.195.0.0划分成27個子網:
1)27=11011
2)該二進制為五位數,N = 5
3)將B類地址的子網掩碼255.255.0.0的主機地址前5位置1(B類地址的主機位包括后兩個字節,所以這里要把第三個字節的前5位置1),得到 255.255.248.0
即為划分成27個子網的B類IP地址 168.195.0.0的子網掩碼(實際上是划成了32-2=30個子網)。
這一段介紹的是舊標准下計算的方法,關於舊的標准后文在介紹,在新標准中則可以先將27減去1,因為計算機是從0開始計算的,從0到27實際上是有28個,所以說如果需要27個就需要將27減去1。
根據主機數
利用主機數來計算
1)將主機數目轉化為二進制來表示
2)如果主機數小於或等於254(注意去掉保留的兩個IP地址),則取得該主機的二進制位數,為 N,這里肯定N<8。如果大於254,則 N>8,這就是說主機地址將占據不止8位。
3)使用255.255.255.255來將該類IP地址的主機地址位數全部置1,然后從后向前的將N位全部置為 0,即為子網掩碼值。
如欲將B類IP地址168.195.0.0划分成若干子網,每個子網內有主機700台:
1) 700=1010111100
2)該二進制為十位數,N = 10
3)將該B類地址的子網掩碼255.255.0.0的主機地址全部置1,得到255.255.255.255
然后再從后向前將后10位置0,即為: 11111111.11111111.11111100.00000000
即255.255.252.0。這就是該欲划分成主機為700台的B類IP地址168.195.0.0的子網掩碼。
增量計算法
子網ID增量計算法(即計算每個子網的IP范圍)
其基本計算步驟如下:
第1步,將所需的子網數轉換為二進制,如所需划分的子網數為“4”,則轉換成成二進制為00000100;
第2步,取子網數的二進制中有效位數,即為向缺省子網掩碼中加入的位數(既向主機ID中借用的位數)。如前面的00000100,有效位為“100”,為3位(在新標准中只需要2位就可以了);
第3步,決定子網掩碼。如IP地址為B類129.20.0.0網絡,則缺省子網掩碼為:255.255.0.0,借用主機ID的3位以后變為:255.255.224(11100000).0,即將所借的位全表示為1,用作子網掩碼。
第4步,將所借位的主機ID的起始位段最右邊的“1”轉換為十進制,即為每個子網ID之間的增量,如前面的借位的主機ID起始位段為“11100000”,最右邊的“1”,轉換成十進制后為2^5=32(此為子網ID增量)。
第5步,產生的子網ID數為:2^m-2 (m為向缺省子網掩碼中加入的位數),如本例向子網掩碼中添加的位數為3,則可用子網ID數為:2^3-2=6個;
第6步,將上面產生的子網ID增量附在原網絡ID之后的第一個位段,便形成第一個子網網絡ID 129.20.32.0(即第一個子網的起始IP段);
第7步,重復上步操作,在原子網ID基礎上加上一個子網ID增量,依次類推,直到子網ID中的最后位段為缺省子網掩碼位用主機ID位之后的最后一個位段值,這樣就可得到所有的子網網絡ID。如缺省子網掩碼位用主機ID位之后的子網ID為255.255.224.0,其中的“224”為借用主機ID后子網ID的最后一位段值,所以當子網ID通過以上增加增量的方法得到129.20.224.0時便終止,不要再添加了(只能用到129.20.192.0)。
我們知道當主機ID為全0時表示網絡ID,全1時表示廣播地址。在RFC950標准中,不建議使用全0和全1的子網ID。
例如把最后一個字節的前3位借給網絡ID,用后面的5位來表示主機ID,這樣就會產生2^3=8個子網,子網ID就分別為000、001、010、011、100、101、110、111這樣8個,在RFC950標准中只能使用中間的6個子網ID。
這么做的原因是:
設我們有一個網絡:192.168.0.0/24(即子網掩碼的前24位為1,255.255.255.0),我們需要兩個子網,那么按照RFC950,應該使用/26而不是/25,得到兩個可以使用的子網192.168.0.64和192.168.0.128
對於192.168.0.0/24,網絡地址是192.168.0.0,廣播地址是192.168.0.255
對於192.168.0.0/26,網絡地址是192.168.0.0,廣播地址是192.168.0.63對於192.168.0.64/26,網絡地址是192.168.0.64,廣播地址是192.168.0.127
對於192.168.0.128/26,網絡地址是192.168.0.128,廣播地址是192.168.0.191
對於192.168.0.192/26,網絡地址是192.168.0.192,廣播地址是192.168.0.255
對於192.168.0.128/26,網絡地址是192.168.0.128,廣播地址是192.168.0.191
對於192.168.0.192/26,網絡地址是192.168.0.192,廣播地址是192.168.0.255
你可以看出來,對於第一個子網,網絡地址和主網絡的網絡地址是重疊的,對於最后一個子網,廣播地址和主網絡的廣播地址也是重疊的。在CIDR流行以前,這樣的重疊將導致極大的混亂。比如,一個發往192.168.0.255的廣播是發給主網絡的還是子網的?這就是為什么在當時不建議使用全0和全1子網。在今天,CIDR已經非常普及了,所以一般不需要再考慮這個問題。