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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...