IP地址、子网掩码和地址分类
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 |
?
轉載于:https://www.cnblogs.com/coder-Sk/p/5234679.html
總結
以上是生活随笔為你收集整理的IP地址、子网掩码和地址分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JavaScript 01
- 下一篇: C++成员变量初始化顺序问题