IP与子网掩码的关系图文详解
tulutulu
IP地址
IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”。
IP地址分类
二进制表示
地址类型 | 二进制地址范围 |
---|---|
A类地址 | 00000000 00000000 00000000 00000001 - 01111111 11111111 11111111 11111111 |
B类地址 | 10000000 00000000 00000000 00000000 - 10111111 11111111 11111111 11111111 |
C类地址 | 11000000 00000000 00000000 00000000 - 11011111 11111111 11111111 11111111 |
D类地址 | 11100000 00000000 00000000 00000000 - 11101111 11111111 11111111 11111111 |
E类地址 | 11110000 00000000 00000000 00000000 - 11110111 11111111 11111111 11111111 |
十进制表示
地址类型 | 十进制地址范围 | 特征 |
---|---|---|
A类地址 | 1.0.0.0 - 127.255.255.255 | 第1个8位中的第1位始终为0 |
B类地址 | 128.0.0.0 - 191.255.255.255 | 第1个8位中的第1、2位始终为10 |
C类地址 | 192.0.0.0 - 223.255.255.255 | 第1个8位中的第1、2、3位始终为110 |
D类地址 | 224.0.0.0 - 239.255.255.255 | 第1个8位中的第1、2、3、4位始终为1110 |
E类地址 | 240.0.0.0 - 247.255.255.255 | 第1个8位中的第1、2、3、4、5位始终为11110 |
特殊:
D类地址:用于组播
E类地址:用于科研保留
注意:
A类地址 从1.0.0.0 到126.255.255.255 , 其中127.x.x.x段地址空间是被保留的回环地址
IP地址构成
IP地址 = 网络地址 + 主机地址
地址类型 | 网络地址 | 主机地址 |
---|---|---|
A类地址 | 前8位 | 后24位 |
B类地址 | 前16位 | 后16位 |
C类地址 | 前24位 | 后8位 |
网络地址
网络地址(Network address)由ip和子网掩码按位与得出,只有网络地址相同的ip才在同一子网内
网络地址是子网中最小的地址
计算方式:网络地址 = IP & 子网掩码
主机地址
主机(IP)地址即该网段中 主机的地址编号
广播地址
广播地址(Broadcast Address)是专门用于同时向网络中所有工作站进行发送的一个地址
广播地址是该子网主机地址全1的地址,即子网中最大的地址
计算方式:广播地址 = (~子网掩码) | 网络地址
子网掩码
子网掩码 (Subnet mask)是一个32位的2进制数 ,它必须结合IP地址一起使用。
子网掩码只有一个作用,就是将某个IP地址划分成“网络地址”和“主机地址”两部分。
缩写
有时候我们会看到192.168.1.123/24
这样的表示方法,其中/24
就是子网掩码255.255.255.0
的缩写
计算方式:二进制子网掩码中1的个数
默认子网掩码
网络类型 | 默认子网掩码 | 缩写 |
---|---|---|
A类地址 | 255.0.0.0 | /8 |
B类地址 | 255.255.0.0 | /16 |
C类地址 | 255.255.255.0 | /24 |
子网容量计算
子网数
根据子网掩码可划分的最大子网数
计算方式:子网数 = 2^(实际子网掩码缩写 - 相应网络类型默认子网掩码缩写)
最大主机数
计算方式:最大主机数 = 2^(主机地址的位数)
可用主机数
计算方式:可用主机数 = 最大主机数 - 2
因为一个子网中主机号全为0的是网络地址,全为1的是广播地址,所以要 -2
代码计算示例
下面代码采用C语言编写(c11)
#include<stdio.h> #define uchar unsigned char #define uint unsigned int uchar bin1num(uchar num); void main() { uchar IP[] = {192,168,1,53}; //IP地址 uchar SubnetMask[] = {255,255,255,224}; //子网掩码 //网络类型和默认子网掩码缩写 uchar DefaultSubnetMaskAbbr; if(IP[0]<224) DefaultSubnetMaskAbbr = 24; //C类地址 if(IP[0]<192) DefaultSubnetMaskAbbr = 16; //B类地址 if(IP[0]<128) DefaultSubnetMaskAbbr = 8; //A类地址 //实际子网掩码缩写:二进制中1的个数 uchar SubnetMaskAbbr = bin1num(SubnetMask[0])+bin1num(SubnetMask[1])+bin1num(SubnetMask[2])+bin1num(SubnetMask[3]); //网络地址:IP & 子网掩码 uchar Network[] = {IP[0] & SubnetMask[0], IP[1] & SubnetMask[1], IP[2] & SubnetMask[2], IP[3] & SubnetMask[3]}; //广播地址:(~子网掩码)|网络地址 uchar Broadcast[] = {(~SubnetMask[0])|Network[0], (~SubnetMask[1])|Network[1], (~SubnetMask[2])|Network[2], (~SubnetMask[3])|Network[3]}; //子网数:2^(实际子网掩码缩写-默认子网掩码缩写) uint SubnetNum = 1; for(int i=0; i<SubnetMaskAbbr-DefaultSubnetMaskAbbr; i++) { SubnetNum *=2; } //最大主机数:2^(32-子网掩码缩写) uint HostNum = 1; for(int i=0; i<32-SubnetMaskAbbr; i++) { HostNum *=2; } /*打印结果*/ printf("ip地址:%d.%d.%d.%d\n", IP[0], IP[1], IP[2], IP[3]); printf("子网掩码:%d.%d.%d.%d\n", SubnetMask[0], SubnetMask[1], SubnetMask[2], SubnetMask[3]); if(DefaultSubnetMaskAbbr==8) printf("网络类型:A类\n"); if(DefaultSubnetMaskAbbr==16) printf("网络类型:B类\n"); if(DefaultSubnetMaskAbbr==24) printf("网络类型:C类\n"); printf("子网掩码缩写:%d\n", SubnetMaskAbbr); printf("网络地址:%d.%d.%d.%d\n", Network[0], Network[1], Network[2], Network[3]); printf("广播地址:%d.%d.%d.%d\n", Broadcast[0], Broadcast[1], Broadcast[2], Broadcast[3]); printf("子网数:%d\n", SubnetNum); printf("最大主机数:%d\n", HostNum); printf("可用主机数:%d\n", HostNum-2); } //计算8位二进制数1的个数(1必须从第一位开始,每个1必须相邻) uchar bin1num(uchar num) { uchar Divisor[] = {128,64,32,16,8,4,2,1}; //除数(8位) uchar Remainder = num; //余数 uchar ret; //结果 for(ret=0; ret<10; ret++) { if(Remainder>0) Remainder = Remainder%Divisor[ret]; else break; } return ret; }
到此这篇关于IP与子网掩码的关系图文详解的文章就介绍到这了,更多相关IP与子网掩码内容请搜索脚本之家以前的文章或继续浏览下面的相关文章,希望大家以后多多支持脚本之家!