http://blog.csdn.net/bluishglc/article/details/47909593?utm_source=tuicool&utm_medium=referral 實際工作中用到網路知識的機會並不多,雖然以前學習過,但是許久不用自然也就生疏了。最近拿到幾台雲上的虛擬機,需要
http://blog.csdn.net/bluishglc/article/details/47909593?utm_source=tuicool&utm_medium=referral
實際工作中用到網路知識的機會並不多,雖然以前學習過,但是許久不用自然也就生疏了。最近拿到幾台雲上的虛擬機,需要為它們建立一個VPC(虛擬私有雲,就是一個虛擬的區域網),得益於虛擬化技術,作為用戶,我們省去了絕大多數的網路配置和調試工作,唯一需要我們親自操刀主持的就是對網路的劃分了。劃分網路需要清楚三個基本概念:IP地址、子網掩碼和地址分類,是這三個要素一起決定了整個IP地址空間的劃分。關於這些可以參考文章最後附上的資料,本文正文是從三者之間的關聯關係上思考對一個網路進行劃分需要解決什麼問題。本文原文出處:http://blog.csdn.net/bluishglc/article/details/47909593 嚴禁任何形式的轉載,否則將委托CSDN官方維護權益!
32位的IP地址空間總計有40多億個可用IP地址,如果你是互聯網創建之初的設計者,你會怎麼分配這些IP?你可能會說一個一個地分吧,請求一個給一個。這不失為是一個方案,但是面對這麼多的IP地址,這種“扁平”的管理方式真的有效嗎?如果是給一個組織甚至國家批量分配P呢?就像是在一個文件夾下管理40多億個文件一樣,這種處理方式真的明智嗎?顯然,當時的設計者並沒有採取這種簡單直白的做法,而是像我們管理大多數信息一樣對信息進行了“分門別類”,同樣是40多億個文件,如果按照某種規則或特征把它們分散放置到多個文件夾或子文件夾下一定會極大地方便管理。
於是問題來了:怎麼分?
如果把IP地址看作是一個家庭住址,那麼在家庭住址中自然有省、市、街道、小區這樣的層級劃分,逐級縮小範圍後定位到一個門牌號上。如果我們給省、市、街道都編好號,再和門牌號拼在一起,我們得到的這樣一長串數字就可以唯一地標識一個家庭住址,同樣,IP地址有32位的長度,如此之長的一個編碼,為什麼不可以取出前幾位作為一個“區域”的地址,把剩餘的幾位作為它在這個區域下的”相對“地址呢?這樣一個IP地址就可以視作兩部分,前面是它的“區域“地址,後面是它在這個”區域“內的”相對“地址,是的,這正是子網掩碼所要解決的問題,按照規範的叫法,通過子網掩碼標識出的所謂的“區域“地址就網路地址,也叫網路標識,網路ID或子網地址,而所謂的“相對“地址就主機地址。
這樣看上去好了很多,但是不知道你有沒有敏銳地察覺到子網掩碼對IP地址的劃分與我們舉例的家庭住址的劃分有一個明顯的不同,那就是前者只能劃分兩級:網路地址和主機地址,而後者則是多級劃分。子網掩碼只能實現兩級劃分帶來了一個問題,那就是同樣一個IP:67.101.121.131,它的子網掩碼有可能是255.0.0.0,也可能是255.255.0.0,也可能是別的什麼值,於是,對於一個給定的IP,特別是公網的IP,在不知道子網掩碼的時候會導致對該IP有多種不同的解讀,就像上面的例子,67.101.121.131可能是子網67.0.0.0下的一個主機,也可能是子網67.101下的一個主機,很顯然,這種歧義性導致這個IP還是不可用,是的,我們還是漏了點什麼,讓這套描述機制暫時無法工作,我們需要找到問題的原因並堵上這個窟窿。
這最後一個需要解決漏洞可以描述為:由於子網掩碼只具有”兩級“(網路地址和主機地址)劃分能力,而它的切分粒度又可變(即如果切出的子網少,則子網可以容納的機器數量就多,如果子網多,則可以容納的機器數量就小)這種不確定的劃分方式必然會導致IP含義的不確定性,所以要解決這個問題就必須要規定好:以哪些值為開頭的IP它的子網掩碼預設是255.0.0.0,以哪些值為開頭的IP它的子網掩碼預設是255.255.0.0,以此類推。這實際上就是IP地址分類。
補上地址分類的概念之後,我們再來重新比較一個IP地址空間的劃分與我們舉例使用的家庭住址這類具有典型層級關係的信息劃分之間有什麼不同。如前面所述,最大的不同在於IP地址空間只能劃分兩個層級,為了能夠適應不同規模(粒度)的IP分配要求,IP地址空間必需要劃分出多種不同規模(粒度)的子空間,並且規定好哪些是大規模(粒度)的子空間,哪些是小規模(粒度)的子空間。然後,再結合IP地址和子網掩碼就可以準確地定位了。可以說IP地址、子網掩碼和地址分類這三個要素一起實現了對IP地址空間的劃分與定址,三者任何一個元素的缺失都會帶來邏輯上的漏洞。
最後一個問題:同樣的,在一個區域網里,理論上我們也有需要切分出大小不等的子網的需求,這也需要對IP地址進行分類,比如在10.0.0.0/8的網路里劃分10.0.0.0/16 ~ 10.127.0.0/16和10.128.0.0/24 ~10.191.255.0/24 等等 至於是否可行以及如何操作待有機會和網路管理員請教一下。
最後,附上一個非常好用的網路計算器:http://www.123cha.com/cidr/
參考資料
子網掩碼
子網掩碼是用來指明一個IP地址的哪幾位標識的是主機所在的子網(也叫網路標識),以及哪些位標識的是主機在網路中的地址。子網掩碼不能單獨存在,它必須結合IP地址一起使用。
但是如果只有子網掩碼, 我們可以判斷出的信息是:它能表示多個子網,以及每個子網下能有多少個主機!
子網掩碼通常有以下2種格式的表示方法:
1. 通過與IP地址格式相同的點分十進位表示
如:255.0.0.0 或255.255.255.128
2. 在IP地址後加上”/”符號以及1-32的數字,其中1-32的數字表示子網掩碼中網路標識位的長度
如:192.168.1.1/24 的子網掩碼也可以表示為255.255.255.0
IP地址分類
在一個區域網里,我們完全可以按照自己的意願和需要來切分網路地址,同樣也是定義3要素,
地址分類,子網掩碼和IP地址。
IP預設分配的子網掩碼每段只有255或0
A類IP地址 第一個欄位的取值範圍:0-127 預設的子網掩碼:255.0.0.0
B類IP地址的第一個欄位的取值範圍:128-191 預設的子網掩碼255.255.0.0
C類IP地址的第一個欄位的取值範圍:192-223 預設的子網掩碼 255.255.255.0
已知IP地址和子網掩碼,用IP地址和子網掩碼相與即可得到網路號
子網掩碼的最後面有幾個零,比如n個,即可求出主機數:pow(2,n)-2 (全零用於網路地址,全1用於廣播地址)
子網掩碼中1的個數可以用於求子網的數目
比如IP地址為151.244.20.34 子網掩碼為255.255.255.224,這個IP是B類IP,兩者相與,
網路號為151.244.20.32
224用二進位表示為11100000,後面有5個0,則主機數為pow(2,5)-2,其中全0用作網路地址,全1為廣播地址
16-5=11,則子網數目為pow(2,11)-2 其中全0用作網路地址,全1為換回測試用
下麵的python程式可以判斷IP的類別並求對應的網路號:
s=raw_input();
s=s.split(".");
mask=raw_input();
mask=mask.split(".");
for i in range(0,4):
s[i]=int(s[i]);
mask[i]=int(mask[i]);
if(s[0]>=0 and s[0]<=127):
print "A IP";
flag=1;
elif(s[0]<=192):
print "B IP";
flag=2;
elif(s[0]<=223):
print "C IP";
flag=3;
elif(s[0]>255):
print "error";
if(flag is 1):
i=0;
res=[];
for i in range(0,4):
res.append(mask[i]&s[i]);
print "network number is %d.%d.%d.%d" %(res[0],res[1],res[2],res[3]);
if(flag is 2):
res=[];
for i in range(0,4):
res.append(mask[i]&s[i]);
print "network number is %d.%d.%d.%d" %(res[0],res[1],res[2],res[3]);
if(flag is 3):
res=[];
for i in range(0,4):
res.append(mask[i]&s[i]);
print "network number is %d.%d.%d.%d" %(res[0],res[1],res[2],res[3]);
保留地址
在IP地址中專門保留了三個區域作為私有地址,其地址範圍如下:
類型 | 網路地址 | 網路數 |
---|---|---|
A | 10.0.0.0/8 (10.x.x.x) | 1 |
B | 172.16.0.0/12 (172.16.x.x ~ 172.31.x.x) | 16 |
C | 192.168.0.0、16 (192.168.x.x ~ 192.168.x.x) | 256 |