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 |
IP地址、子网掩码和地址分类的更多相关文章
- IP地址子网掩码主机地址网络号主机号
(1)子网掩码1所对应的位为网络号位 而所对应的位为主机号位 IP地址+子网掩码=网络号: IP地址+子网掩码(反码)=主机号. (2)主机号中的m位被用来表示网络号了,也就是子网号,将0-255划分 ...
- [转]IP地址-子网掩码-默认网关
IP地址:是给每个连接在Internet上的主机分配的一个32bit地址.地址有两部分组成,一部分为网络地址,另一部分为主机地址.IP地址分为A.B.C.D.E 5类.常用的是B和C两类.网络地址的位 ...
- IP封包协议头/TCP协议头/TCP3次握手/TCP4次挥手/UDP协议头/ICMP协议头/HTTP协议(请求报文和响应报文)/IP地址/子网掩码(划分子网)/路由概念/MAC封包格式
IP协议头IP包头格式: 1.版本号:4个bit,用来标识IP版本号.这个4位字段的值设置为二进制的0100表示IPv4,设置为0110表示IPv6.目前使用的IP协议版本号是4. 2.首部长度:4个 ...
- IP地址的格式和分类
IP地址 IP地址时IP协议提供的一种地址格式,它为互联网上的网络设备分配一个用来通信的逻辑地址,目前分为IP v4和IP v6两种,v4的意思是version4,v6是同样的意思. IP v4 IP ...
- TCP/IP学习笔记13--IP地址的构成,广播地址,IP多播,子网掩码
现在,我是蔚蓝的 :在此岸或彼岸,我都是蔚蓝的. ---李瑾 IP对应的是OSI模型中的网络层,TCP对应的是传输层.每一个参与通信的主机都会有一个IP地址. IP地址(IPv4地址)含4个字节,每 ...
- ipv4理论知识2-分类编址、ip分类、网络标识、主机标识、地址类、地址块
分类编址 ipv4的体系结构中有分类编址和无分类编址(后续会介绍到),在分类编址时,ipv4地址分为A.B.C.D.E这5类.每类占用的IP比例和个数如下图: ipv4分类识别 计算机以二进制方式存储 ...
- IP地址 子网掩码 默认网关 网络地址 广播地址
“IP地址”是“TCP/IP”(Transmite Control Protocol 传输控制协议/Internet Protocol网际协议)里其中的一种协议. Internet之所以能将广阔范围内 ...
- IP地址,子网掩码,默认网关,路由,形象生动阐述
自己的Linux虚拟机已经分配了固定的IP地址(使用无线路由,用的是192.168.1.XX网段),公司的无线网络分配的IP地址是(10.51.174.XX网段) 所以当自己的电脑拿到公司,还想使用桥 ...
- IP地址 子网掩码 默认网关 DNS(转)
突然被问到IP地址方面的知识,吓得我赶紧上网找一找资料,觉得这篇还是写得简单易懂,share一下. Key: 1.IP地址=网络地址+主机地址,(又称:主机号和网络号组成): 2.将IP地址和子网掩码 ...
随机推荐
- Android开发 学习笔记——HelloWorld
Day01 1.java开发过程———————————————不建议先用ECLIPSE写代码,因为它的函数式自动生成的,不利于找寻编程手感打开记事本写完程序后,修改扩展名为.java然后在DOS控制台 ...
- HTML1网页三部份内容
网页三部份内容:HTML CSS Javascript 路径:一般做网页的时候用的相对路径. images/aaa.jpg 网页同一个目录中找images文件夹,再在images里面找aaa.jpg ...
- php输出json中文显示编码-解决办法
$str = "中华人民共和国";$ar = array( "a" => "a0", "b" => &quo ...
- 一个周末掌握IT前沿技术之node.js篇
一个周末掌握IT前沿技术之node.js篇 http://ittechnical.sinaapp.com/node-js-and-restful-api/ NodeJS入门 http://www.n ...
- HDU 1032 The 3n + 1 problem
还以为要递归推一推的 结果暴力就过了 要注意 i,j 大小 #include <iostream> using namespace std; int a,b; long long cnt, ...
- TCP/IP详解之:TCP
第17章 TCP:传输控制协议 TCP提供了一种可靠的面向连接的字节流运输层服务 TCP的服务 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务. TCP通过下 ...
- Char型和string型字符串比较整理
1.赋值 char赋值: char ch1[] = "give me"; char ch2[] = "a cup"; strcpy(ch1,ch2); cout ...
- Spring XML 不给提示
a)window – preferences – myeclipse – xml – xml catalog b)User Specified Entries – add i. Location: D ...
- Binder连接池
一.为什么需要Binder线程池 产生原因:因为当有多个不同的业务块都要使用AIDL来进行通信,则需要创建多个Service,每创建一个Service就需要消耗系统资源. 解决思路:将所有的AIDL放 ...
- Hibernate的Criteria用法
在hibernate的Session里面使用createCriteria可以创建一个Criteria实例帮助我们进行条件查询,不用自己串hql语句,很方便. 用法很简单,首先传Class实例创建Cri ...