2017年3月7日 星期二

如何計算可用的 IP 數量

最近在工作上遇到一個有趣的小問題,我們要計算在某一個網段內可以被分派的 IP 數量有多少,其實這個函式原本已經有先前的工程師寫了,但因為寫得不是很彈性,也不是以網路IP address的本質去思考來計算的,所以在空檔的時候花了些時間去研究彌補以前沒有好好搞懂的IP address.

以IPv4為主,基本的表示方法是以4個Byte(32bits)來表示每個IP的位址,而通常在每個網段下會有一個網路Id位址跟廣播IP位址是不能夠被一般主機使用的。 一個網域的大小(即可發給電腦的IP數量的範圍)是由subnet mask 來決定的。例如一般最常見到的class C就是最後面的1個Byte全部都是0,而前3個Byte都是1的情況來做 filter(其實就是mask),在這樣的情況下,每一個class C的網段就會有2^8=256個IP 位址,但剛剛說了第一個通常會是給此網域當網路Id,最後一個位址會當廣播用的IP,所以扣掉這兩個位址,可用的就只剩下265-2=254個,這是一般 class C的規則。IP數的範圍取決於一開始subnet設定的大小。

那要怎麼用這些已知的資訊來計算出到底可以用的IP數有多少個呢?這時候還需要再回想關於位元運算的問題,也就是AND, OR這種的位元運算。
通常AND可以想成是「乘法」,而OR可以想成類似「加法」:

AND10
110
000

OR10
111
010

還有利用一個 「~」反向的運算符號就可以算出在某一個範圍內可以被使用的IP數量有多少個,code 在這裡: https://github.com/evelynbaby15/MyWork/blob/master/CountIP.java

另外最近也發現一個不錯的電腦數值系統的基礎教學網站 (Ryan's tutorials)