IP地址、子網掩碼和地址分類

来源:http://www.cnblogs.com/coder-Sk/archive/2016/03/02/5234679.html
-Advertisement-
Play Games

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

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、引言 前幾天面試,被大師虐殘了,好多基礎知識必須得重新拿起來啊。閑話不多說,進入正題。 二、為什麼要線程同步 因為當我們有多個線程要同時訪問一個變數或對象時,如果這些線程中既有讀又有寫操作時,就會導致變數值或對象的狀態出現混亂,從而導致程式異常。舉個例子,如果一個銀行賬戶同時被兩個線程操作,一個
  • 下麵是25個Java機器學習的工具&&庫列表: 1.Weka是一個數據挖掘任務機器學習演算法的集合。這些演算法可以直接應用於數據集或者在你自己的Java代碼中調用。Weka 包含數據預處理、分類、回歸、聚類、關聯規則、可視化 等工具。 2.Massive Online Analysis(MOA) 是一個
  • 數據對象映射模式,是將對象和數據存儲映射起來,對一個對象的操作會映射為對數據存儲的操作。 在代碼中實現數據對象映射模式,實現一個ORM類,將複雜的sql語句映射成對象屬性的操作。對象關係映射(Object Relational Mapping,ORM) ha_cl表 Hacl.php <?php n
  • 引入自: http://blog.csdn.net/aaronuu/article/details/7055650 List 轉換為 String數組 List<String> list = new ArrayList<String>(); list.add("a1"); list.add("a2"
  • 下載 cURL http://pan.baidu.com/s/1hqrHWkG (curl-7.39.0.tar.gz) 3.98MB 解壓: [plain] view plain copy tar zxvf curl-7.39.0.tar.gz ./configure --prefix=/usr/
  • 試可以幫助識別和解決應用程式缺陷,在本文中,作者將使用大家常用的的開發工具Eclipse來調試Java應用程式。但這裡介紹的調試方法基本都是通用的,也適用於NetBeans IDE,我們會把重點放在運行時上面。 在開始之前,推薦大家去看看Eclipse shortcuts這篇文章,它將會給你帶來很多
  • 一、java編程註意事項1.java區分大小寫2.每條語句結尾有分號3.上下級代碼註意縮進4.大括弧要成對出現5.標點符號要用英文半形(半形全形區別)二、eclipse1.eclipse是自編譯及時編譯2.java ee包含java se 三、變數 1.+表示將多段文字拼接成一句話 2.使用變數就相
  • 設置微信支付需要的4個參數APPID APPSECRET MCHID KEY在哪裡找呢 其中APPID APPSECRET為公眾號的appid和appsecret,在微信公眾平臺後臺查看 開發》基本配置》開發者ID MCHID和KEY為微信支付商戶號和API密鑰,在微信支付商戶平臺後臺查看 MCHI
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...